第十六章.Linux系统管理-开机启动流程

2022-09-26 12:34:29 浏览数 (1)

  • Linux启动流程
  • 修改CentOS7网卡名称为eth0和eth1
  • Systemd 进程管理

-曾老湿, 江湖人称曾老大。


-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。


Linux启动流程

CentOS6

Linux启动的时候,大家可以看到黑屏,一顿滚动,噼里啪啦,噼里啪啦,整的像是黑客帝国...啥玩应根本看不懂。其实,这个开启的过程,并没有大家想象的那么复杂,过程大概分为5个阶段

1.内核引导 2.运行init 3.系统初始化 4.建立终端 5.用户登录系统

代码语言:javascript复制
init程序的类型:

SysV:       init, CentOS 5之前, 配置文件: /etc/inittab。
Upstart:    init,CentOS 6, 配置文件: /etc/inittab, /etc/init/*.conf。
Systemd:    systemd, CentOS 7,配置文件: /usr/lib/systemd/system、 /etc/systemd/system。

1.内核引导

当计算机打开电源后,首先是开机BIOS加电自检,按照BIOS中设置的启动设备,一般来说是通过硬盘来启动。 还可以是U盘、光驱...等 在没有系统的时候,需要安装系统,可以调整。

BIOS自检,一般需要检查硬件方面,比如:内存,CPU,磁盘...等设备

以前培训过,'听声辨位' ... 就是一听到声音,蜂鸣声,判断出来,是哪个硬件坏了,每个硬件损坏,开机声音不同。

操作系统接管硬件以后,首先读取 /boot 目录下的内核文件。

2.运行init

init 在CentOS中,是系统所有进程的起点,如果进程想启动,那必须有init,如果没有init,系统中的任何进程都不会启动,那就相当于这个系统打不开...所以init才是爸爸。

那么 init 程序首先是需要读取配置文件 /etc/inittab

在init中,就涉及到7个运行级别(runlevel)

许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。

init进程的一大任务,就是去运行这些开机启动的程序。

但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动nginx,用作桌面就不需要。

Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。

运行级别(runlevel)的分类:

运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆 运行级别2:多用户状态(没有文件系统) 运行级别3:完全的多用户状态(有文件系统),登陆后进入控制台命令行模式 运行级别4:系统未使用,保留 运行级别5:X11控制台,登陆后进入图形GUI模式 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

查看当前运行的级别

代码语言:javascript复制
[root@zls ~]# runlevel
N 3

临时切换运行级别

代码语言:javascript复制
[root@zls ~]# init 5
[root@zls ~]# runlevel
3 5

永久切换运行级别

代码语言:javascript复制
[root@zls ~]# vim /etc/inittab
id:3:initdefault

查看开机自启服务

代码语言:javascript复制
[root@zls ~]# chkconfig --list

注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。

      要列出 systemd 服务,请执行 'systemctl list-unit-files'。
      查看在具体 target 启用的服务请执行
      'systemctl list-dependencies [target]'。

netconsole      0:关 1:关 2:关 3:关 4:关 5:关 6:关
network         0:关 1:关 2:开 3:开 4:开 5:开 6:关
sysstat         0:关 1:关 2:开 3:开 4:关 5:开 6:关

CentOS6忘记root密码或者调整了运行级别为6

进入单用户级别:

1.重启服务器,一直按“E”键,进入grub引导菜单的内核界面

2.在内核界面选择使用上下箭头移动并选择内核

3.内核选定之后再次按下“E”键进行编辑

4.在最后一行后面加上数字1(是单用户模式的运行级别)或者single然后回车

5.然后根据提示按下boot进行重新引导

3.系统初始化

在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。

它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。

代码语言:javascript复制
l5:5:wait:/etc/rc.d/rc 5

这一行表示以5为参数运行/etc/rc.d/rc,/etc/rc.d/rc是一个Shell脚本,它接受5作为参数,去执行/etc/rc.d/rc5.d/目录下的所有的rc启动脚本,/etc/rc.d/rc5.d/目录中的这些启动脚本实际上都是一些连接文件,而不是真正的rc启动脚本,真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。

而这些rc启动脚本有着类似的用法,它们一般能接受start、stop、restart、status等参数。

/etc/rc.d/rc5.d/中的rc启动脚本通常是K或S开头的连接文件,对于以 S 开头的启动脚本,将以start参数来运行。

而如果发现存在相应的脚本也存在K打头的连接,而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。

这样做是为了保证是当init改变运行级别时,所有相关的守护进程都将重启。

至于在每个运行级中将运行哪些守护进程,用户可以通过chkconfig或setup中的"System Services"来自行设定。

4.建立终端

rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。

init接下来会打开6个终端,以便用户登录系统。在inittab中的以下6行就是定义了6个终端:

代码语言:javascript复制
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

从上面可以看出在2、3、4、5的运行级别中都将以respawn方式运行mingetty程序,mingetty程序能打开终端、设置模式。

同时它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验证用户的身份。

5.用户登录系统

一般来说,用户的登录方式有三种:

(1)命令行登录 (2)ssh登录 (3)图形界面登录

对于运行级别为5的图形方式用户来说,他们的登录是通过一个图形化的登录界面。登录成功后可以直接进入 KDE、Gnome 等窗口管理器。

而本文主要讲的还是文本方式登录的情况:当我们看到mingetty的登录界面时,我们就可以输入用户名和密码来登录系统了。

Linux 的账号验证程序是 login,login 会接收 mingetty 传来的用户名作为用户名参数。

然后 login 会对用户名进行分析:如果用户名不是 root,且存在 /etc/nologin 文件,login 将输出 nologin 文件的内容,然后退出。

这通常用来系统维护时防止非root用户登录。只有/etc/securetty中登记了的终端才允许 root 用户登录,如果不存在这个文件,则 root 用户可以在任何终端上登录。

/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。

图形模式与文字模式的切换方式

Linux预设提供了六个命令窗口终端机让我们来登录。

默认我们登录的就是第一个窗口,也就是tty1,这个六个窗口分别为tty1,tty2 … tty6,你可以按下Ctrl Alt F1 ~ F6 来切换它们。

如果你安装了图形界面,默认情况下是进入图形界面的,此时你就可以按Ctrl Alt F1 ~ F6来进入其中一个命令窗口界面。

当你进入命令窗口界面后再返回图形界面只要按下Ctrl Alt F7 就回来了。

如果你用的vmware 虚拟机,命令窗口切换的快捷键为 Alt Space F1~F6. 如果你在图形界面下请按Alt Shift Ctrl F1~F6 切换至命令窗口。

Linux 关机

在linux领域内大多用在服务器上,很少遇到关机的操作。毕竟服务器上跑一个服务是永无止境的,除非特殊情况下,不得已才会关机。

正确的关机流程为:sync > shutdown > reboot > halt

关机指令为:shutdown ,你可以man shutdown 来看一下帮助文档。

关机重启指令:

代码语言:javascript复制
sync 将数据由内存同步到硬盘中。

shutdown 关机指令,你可以man shutdown 来看一下帮助文档。例如你可以运行如下命令关机:

shutdown –h 10 ‘This server will shutdown after 10 mins’ 这个命令告诉大家,计算机将在10分钟后关机,并且会显示在登陆用户的当前屏幕中。

shutdown –h now 立马关机

shutdown –h 20:25 系统会在今天20:25关机

shutdown –h  10 十分钟后关机

shutdown –r now 系统立马重启

shutdown –r  10 系统十分钟后重启

reboot 就是重启,等同于 shutdown –r now

halt 关闭系统,等同于shutdown –h now 和 poweroff

总结:

不管是重启系统还是关闭系统,首先要运行 sync 命令,把内存中的数据写到磁盘中。

关机的命令有 shutdown –h now halt poweroff 和 init 0 , 重启系统的命令有 shutdown –r now reboot init 6。

老男孩教育李导出品必是精品:CentOS6启动流程


CentOS7

1.BIOS(开机自检) 2.MBR ( Master Boot Record 主引导记录) 3.GRUB2 Bootloader(引导菜单) 4.Kernel(内核引导) 5.Systemd (不再使用init,改成了systemd) 6.Runlevel-Target (运行级别)

1.BIOS

基本输入/输出系统是一个固件接口,它不仅控制启动过程,还提供对连接的外围设备的低级接口的所有控制。打开系统电源后,它将读取所有设备设置并执行开机自检(开机自检)过程,以识别硬件设备,以测试和初始化系统硬件组件。成功后处理后,它将加载MBR(主引导记录)以进行下一个引导处理。

2.MBR引导

主引导记录放在Linux引导硬盘的第一个扇区中,此信息通过BIOS预加载到ROM(只读内存)中。

MBR的大小只有512个字节,它包含用于引导操作系统的机器代码指令,称为引导加载程序,以及分区表。一旦BIOS找到引导加载程序(GRUB2)并将其加载到(ROM)内存或硬盘驱动器中,它就会控制引导过程。只是MBR(主引导记录)加载并执行GRUB2引导加载程序。

3.GRUB2(引导加载程序版本2)引导加载程序

言简意赅:grub2菜单,如果装了双系统会让你进行选择,Linux?还是windows?还是MacOS?

GRUB2是所有最新版本(如Red Hat/CentOS 7)中的默认引导加载程序,也是9.10版中的Ubuntu。它已经被GRUBbootloader(也称为GRUBLegacy)所取代。

grub2配置文件位于/boot/grub2/grub.cfg中,由grub2 mkconfig使用/etc/grub.d中的模板和/etc/default/grub中的设置自动生成。不建议编辑GRUB2配置文件。

引导加载程序(rhel 7的grub2)启动rhel7内核和初始RAM磁盘(initrd)。GRUB 2安装在服务器硬盘的引导扇区中,配置为加载Linux内核和initramfs,initrd是一个初始根文件系统,将在Linux系统上的实际根文件系统之前安装。

4.kernel内核引导

Linux内核是操作系统的核心,它是系统上第一个加载的程序。当系统启动时,内核从initrd.img加载所有必要的内核模块和驱动器,以加载Linux7中的系统第一个进程systemd,在6里面,init是爸爸,在7里面换了个爸爸,那就是systemd

下面的命令将帮助您找到SystemD进程ID(PID)

代码语言:javascript复制
[root@zls ~]# ps -ef | grep [s]ystemd
root          1      0  0 7月14 ?       00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root        347      1  0 7月14 ?       00:00:00 /usr/lib/systemd/systemd-journald
root        379      1  0 7月14 ?       00:00:00 /usr/lib/systemd/systemd-udevd
root        522      1  0 7月14 ?       00:00:00 /usr/lib/systemd/systemd-logind
dbus        525      1  0 7月14 ?       00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation

systemd管理进程

systemd使用“targets”而不是runlevels。默认情况下,有两个主要级别:

1) multi-user(多用户).target: analogous to runlevel 3

代码语言:javascript复制
#查看运行级别
[root@zls ~]# systemctl get-default
multi-user.target

2) graphical(图形化).target: analogous to runlevel 5

代码语言:javascript复制
#设置默认运行级别
[root@zls ~]# systemctl set-default graphical.target
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.

#查看默认界面
[root@zls ~]# systemctl get-default
graphical.target
代码语言:javascript复制
[root@zls ~]# vim /etc/inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
#

CentOS7中的运行级别:

runlevel0.target -> poweroff.target

runlevel1.target -> rescue.target

runlevel2.target -> multi-user.target

runlevel3.target -> multi-user.target

runlevel4.target -> multi-user.target

runlevel5.target -> graphical.target

runlevel6.target -> reboot.target

运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆 运行级别2:多用户运行级别(没有文件系统) 运行级别3:完全的多用户状态(有文件系统),登陆后进入控制台命令行模式 运行级别4:多用户运行级别 运行级别5:X11控制台,登陆后进入图形GUI模式 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动


CentOS7如何进入单用户模式

1.重启Linux系统主机并出现引导界面时,按下键盘上的e键,进入内核编辑界面

2.在Linux16这行后面添加enforcing=0 init=/bin/bash,然后按下Ctrl X组合键来运行修改过的内核程序

3.然后进入单用户模式界面。

代码语言:javascript复制
#重新挂载/目录
bash-4.2# mount -o rw,remount /
#非交互设置root密码
bash-4.2# echo 1 |passwd --stdin root
#重新引导系统
bash-4.2# exec /sbin/init

不需要重新挂载的方式

如果centos7系统运行级别被设置成重启的级别...


CentOS7通过光盘进入救援模式

1.挂载光盘镜像

2.从BIOS启动

3.进入BIOS设置从光盘启动

4.按F10保存并退出

5.进入救援模式

6.选择救援模式

7.选择继续

接下来就可以...做你想做的事

生产场景1:

当系统坏了,无法登陆系统,但是需要把里面的数据拷贝出来,怎么办?

代码语言:javascript复制
bash-4.2# mkfs.xfs -f /dev/sdc
bash-4.2# mkdir /data
bash-4.2# mount /dev/sdc /data
bash-4.2# cp -a /raid0 /data
bash-4.2# umount /dev/sdb

生产场景2:

修复MBR,主要出现在安装双系统的时候,后安装的系统把原来的MBR删除了,需要修复

1.破坏硬盘的钱446字节,模拟MBR引导损坏,会发现重启无法启动系统

代码语言:javascript复制
[root@zls ~]# dd < /dev/zero >/dev/sda bs=1 count=446
记录了446 0 的读入
记录了446 0 的写出
446字节(446 B)已复制,0.0011061 秒,403 kB/秒

2.重启,查看系统状态

3.重启进入救援模式

4.进入系统,获取root权限

5.修复MBR引导,然后重启连接服务器

代码语言:javascript复制
#修复grub
bash-4.2# grub2-install /dev/sda

#退出
bash-4.2# exit

#重启进入系统
bash-4.2# reboot

生产场景3:

CentOS7 误删除grub文件,进行修复

1.模拟故障

代码语言:javascript复制
#删除grub2
[root@zls ~]# rm -fr /boot/grub2/
#重启
[root@zls ~]# reboot

2.查看系统状态

3.重启进入救援模式

4.重新安MBR,加载grub2中的grub.cfg文件

代码语言:javascript复制
bash-4.2# chroot /mnt/sysimage
bash-4.2# grub2-install /dev/sda
bash-4.2# grub2-mkconfig -o /boot/grub2/grub.cfg

5.查看加载出来的文件

代码语言:javascript复制
bash-4.2# ls /boot/grub2

6.退出重启

代码语言:javascript复制
bash-4.2# exit
sh-4.2# reboot

满血复活...

修改CentOS7网卡名称为eth0和eth1

这个可以在安装系统的时候,修改网卡名称,如果已经安装过的系统,那我们还是从BIOS界面到光盘启动,进入系统安装界面。

选择 Install CentOS 7然后按下Tab键

代码语言:javascript复制
biosdevname=0 net.ifnames=0

如果不是dell物理机环境:

代码语言:javascript复制
net.ifnames=0

老男孩教育李导出品必是精品:CentOS7启动流程

Systemd 进程管理

systemd的由来

Linux一直以来都采用init进程作为爸爸,但是init有两个缺点:

1.启动时间长,init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。 2.启动脚本复杂,初始化完成后,系统会加载很多脚本,脚本都会处理各自的情况,这回让脚本多而复杂。

CentOS5 是启动速度最慢的,串行启动过程,无论进程相互之间有无依赖关系。 CentOS6 相对启动速度有所改进,有依赖的进程之间依次启动而其他没有依赖关系的则并行启动。 CentOS7 所有进程无论有无依赖关系,都并行启动,当然有很多时候进程并没有真正的启动而是只有一个信号或者说是标记,在真正利用的时候,才会真正启动。

这就类似咱们使用的windows,最开始win95,win98,win7启动速度极其的慢,从win8,开始win8.1,win10启动速度,快的yp...噌一下子就起来了。


什么是systemd

systemd即为system daemon守护进程,systemd主要解决上文的问题而诞生,systemd的目标是,为系统的启动和管理提供一套完整的解决方案。


systemd的优势

1.最新系统都采用systemd管理(RedHat7,CentOS7,Ubuntu15...) 2.CentOS7 支持开机并行启动服务,显著提高开机启动效率 3.CentOS7关机只关闭正在运行的服务,而CentOS6,全部都关闭一次。 4.CentOS7服务的启动与停止不在使用脚本进行管理,也就是/etc/init.d下不在有脚本。 5.CentOS7使用systemd解决原有模式缺陷,比如原有service不会关闭程序产生的子进程。


systemd相关的配置文件

/usr/lib/systemd/system #类似C6系统的启动脚本目录/etc/init.d/ /etc/systemd/system/ #类似C6系统的/etc/rc.d/rcN.d/ /etc/systemd/system/multi-user.target.wants/


systemd相关的命令

由于之前长期使用RHEL/CentOS 6系统, 已经习惯使用service chkconfig等命令来管理系统服务,但在RHEL/CentOS 7系统中是使用systemctl命令来管理服务的。

如下是RHEL/CentOS 6系统中System V init命令与RHEL/CentOS 7系统中systemctl命令的对比,后续课程中会经常用到它们。

systemctl管理服务的启动、重启、停止、重载、查看状态等常用命令

System V init(6系统)

systemctl命令(7系统)

作用

service crond start

systemctl start crond.service

启动服务

service crond stop

systemctl stop crond.service

停止服务

service crond restart

systemctl restart crond.service

重启服务

service crond reload

systemctl reload crond.service

重新加载配置(不终止服务)

service crond status

systemctl status crond.servre

查看服务运行状态

systemctl is-active sshd.service

查看服务是否在运行中

systemctl mask crond.servre

禁止服务运行

systemctl unmask crond.servre

取消禁止服务运行

systemctl设置服务开机启动、不启动、查看各级别下服务启动状态等常用命令

System V init(6系统)

systemctl命令(7系统)

作用

chkconfig crond on

systemctl enable crond.service

开机自动启动

chkconfig crond off

systemctl disable crond.service

开机不自动启动

chkconfig --list

systemctl list-unit-files

查看各个级别下服务的启动与禁用

chkconfig --list crond

systemctl is-enabled crond.service

查看特定服务是否为开机自启动

chkconfig--add crond

systemctl daemon-reload

创建新服务文件或者变更设置

systemctl服务状态说明

服务状态

状态说明

loaded

服务单元的配置文件已经被处理

active(running)

服务的一个或多个进程在运行中

active(exited)

一次性运行的服务成功被执行并退出(服务运行后完成任务,相关进程会自动退出)

active(waiting)

服务已经运行但在等待某个事件

inactive

服务没有在运行

enable

服务设定为开机运行

disabled

服务设定为开机不运行

static

服务不能被设定开机启动,但可以由其他服务启动该服务

0 人点赞