Linux学习52 CentOS系统启动流程进阶
一、系统空间级别引导流程续
1、CentOS 5中/etc/inittab文件
a、每行定义一种action以及与之对应的process(此概念只适用于CentOS 5操作系统),每一行相应的语法格式如下
(1)、id:runlevels:action:process
1)、id:(任务的唯一标识符)
2)、runlevels:(运行级别)
3)、action:(这个任务在什么时候启动以及如何启动)
4)、process:(启动的到底是什么任务)
action有如下字段项:
wait:等待切换至此任务所在的级别时执行一次
respawn:一旦此任务终止时就自动重新启动之,那么什么时候会自动启动此任务呢?比如我们的终端,如果我们启动Loginout就自动退出来了,退出后会发现界面又出来了
initdefault:设定默认运行级别,此时process会省略
sysinit:系统初始化,用来设定系统初始化方式,此处一般为指定/etc/r.d/rc.sysinit脚本,这个脚本一般设定系统这个初始化的脚本,此脚本CentOS 5和6都用到了,CentOS是没有用到的
(2)、例如
id:3:initdefault: 设定默认级别为3
si::sysinit:/etc/rc.d/rc.sysinit #此处我们runlevels为空表示运行所有级别,即所有级别都会运行一次此脚本。此处表示设定系统初始化方式
l0:0:wait:/etc/rc.d/rc 0 #表示只有切换至3级别时才会运行此任务,后面表示执行/etc/rc.d/rc 3这个程序命令,他意味着去启动或关闭/etc/rc.d/rc3.d/目录下的服务脚本所控制的服务。 K开头的表示停止的服务,S开头的表示要启动的服务。
此外还有:
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
......
l6:6:wait:/etc/rc.d/rc 6
(3)、rc脚本的功用:接收一个运行级别数字为参数(只针对CentOS6)。我们可以在/etc/rc.d/目录中看到rc#.d目录,这些目录下对应的相应的运行级别要运行的脚本
我们可以看到相应的脚本都是K或者S开头的并且带了两位数字然后再加一串字母,我们可以ls -l查看发现他们都是/etc/init.d软连接过去的
那么这些rc脚本有什么用呢?我们可以打开一个脚本发现其实他里面就包含了两个循环而已,我们可以查看发现以所有K开头的脚本都要停止,所有以S开头的脚本都要启动。因此我们开机自动启动的脚本都是靠这样来实现的。我们可以发现我们的脚本是先K再S,即先停止相应的服务再启动相应的服务,我们相应的两个数字是什么意思呢?我们一旦基于glob方式进行通配时他的通配是按次序进行匹配文件名,如果我们的数字越小表示越排到前面,即数字表示我们的优先级,对K开头来说,数字越小越优先关闭,服务与服务之间有可能会存在依赖关系,因此依赖到别的服务的服务会先关闭。S开头的法则也是一样的。启动的时候数字越小越优先启动,被依赖的服务先启动,而依赖的服务后启动。
因此如果我们传递默认级别为3就表示把rc3.d目录下的所有以K开头的服务先stop掉,以所有S开头的服务先Start起来,这些脚本原本都是在/etc/init.d或/etc/rc.d目录下,他们其实都是同一个目录
[root@node1 init.d]# ls -l /etc/init.d lrwxrwxrwx. 1 root root 11 Jun 4 2019 /etc/init.d -> rc.d/init.d
(4)、rc脚本
1)、的脚本框架
for srv in /etc/rc.d/rc#.d/K*;do
$srv stop
done
for srv in /etc/rc.d/rc#.d/S*;do
$srv start
done
2)、/etc/init.d/*(/etc/rc.d/init.d/*)脚本的执行方式
# /etc/init.d/SRV_SCRIPT {start|stop|restart|status}。我们知道我们脚本是用来启动服务的,那么我们手动能不能运行呢?虽然也是可以的,但是这种方式太鸡肋了,因此我们设置了服务脚本这种概念。因此我们的服务为了看起来像服务,我们红帽就使用了service这个命令,这个命令能够调用我们/etc/init.d/目录下的脚本然后传递我们给定的相应的参数。
(5)、因此我们想要停止或启动某个服务可以直接在/etc/init.d/目录下对这个服务进行启动或关闭
并且这些服务脚本都支持service命令,service他的作用其实也就是调用我们/etc/init.d目录下相应的脚本来进行运行的
(6)、我们并且可以创建/etc/init.d/目录下想要的服务脚本的相应的软连接至/etc/rc.d/rc#.d 目录下并且以K或者S开头让其可以随着相应系统运行级别实现相应的开机启动。那么我们怎么给其创建软连接呢?我们可以使用chkconfig命令,比如我们现在来进行一个案例演示
1)、首先我们在/etc/init.d/目录下创建一个脚本testsrv
2)、我们编辑相应的服务脚本
3)、我们可以查看其它服务脚本发现在脚本的开头会有相应的chkconfig描述,其实我们所有能被chkconfig命令控制的脚本其开头处都必须写上这种格式,我们的这一段的意思是:
chkconfig: 运行级别 启动优先级 关闭优先级 (所以S和K后面的数字就是在这儿定义的)
比如我们下面的这个就是: 运行级别为2345 启动优先级为90 关闭优先级为60
4)、因此我们2中如果要设置开机启动就还需要再将其改造一下
表示在2345运行级别时可以设置开机启动或关机启动
5)、然后我们给此脚本执行权限
6)、现在我们通过chkconfig来给其设置开机启动
我们可以发现因为我们在脚本中只是定义的2345级别的开机启动因此我们只会在/etc/rc.d/rc[2345].d目录下创建相应的软连接,所以我们在016目录下是没有相应的软连接的。
那么我们刚才为什么只在2345下有on而在016没有呢?原因在于所有服务想使用chkconfig控制的话需要先做一次初始化操作,初始化操作其实就不受限于刚才的2345的区别了
7)、在我们chkconfig testsrv on之前其实我们还需要执行chkconfig --add testsrv命令,他的意思是我们这个服务受chkconfig管理,即便不敲这个命令的话他也会受chkconfig管理,但是他只能管理我们脚本中定义的有数字的级别,现在我们来执行我们此命令查看效果
我们可以发现我们所有级别下都有K开头的了,那么为什么都是K呢?是因为我们此前给其手动添加管理过一次,现在我们把它删掉一切重头来操作
此时我们发现我们2345都是S,016都是K,这就是我们脚本中2345的意义,即我们写成2345的时候他会自动的在你指定的级别下为on,其它的级别都为off
7)、现在我们把脚本中的2345换成-,然后del后重新把它加进来
此时我们发现我们无论哪个级别都是off的
8)、但是不管他是ON还是OFF的我们都可以使用service来控制他
b、chkconfig命令:管控/etc/init.d/每个服务脚本在各级别下的启动或关闭状态
(1)、查看:chkconfig --list
(2)、添加:chkconfig --add name
能被添加的服务的脚本定义格式之一:
#!/bin/bash
#
# chkconfig: LLL NN NN
# description:(可以没有此行)
(3)、删除:chkconfig --del name
(4)、修改指定的链接类型
chkconfig [--level LEVELS] name <on|off|reset>
--level LEVELS:指定要控制的级别;默认为2345
上述中意味着将testsrv的链接文件3和5级别从K开头转成了S开头
2、因此内核创建init进程过后,init初始化整个操作系统时,他会读取/etc/inittab这个配置文件,完成系统初始化,而配置文件中有一堆的 id:runlevels:action:process 这种类型格式对应的级别中的rc文件
因此你wait时他会自动切换到这个对应级别来,所以他会读取/etc/inittab这个配置文件了解你需要做的级别切换,然后他会把以K开头的服务给STOP掉,把S开头的服务给START起来,这就是为什么开机过后很多服务会自动启动起来的原因
a、我们有一个服务是很独特的,在我们/etc/rc.d目录下有一个rc.local文件,他直接软连接指向我们/etc/rc.d/rc3.d/目录下,这个脚本有什么用呢?有很多程序,你想给他开机以后就自动运行一次,但是没法写成一个服务脚本,但是又期望他能开机运行,这要怎么办呢?此时我们把我们的命令写入到rc.local这个文件中就可以,我们开机后这个文件会自动读取一次的,比如我们在里面加一个创建临时文件的命令我们发现以后每次都会给你创建一个临时文件。
注意:正常级别下,最后启动的一个服务S99local没有连接至/etc/init.d下的某脚本,而是链接至了/etc/rc.d/rc.local脚本,因此,不便或不需写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可。此文件还有一个连接,就在/etc/rc.local
3、我们回过头来继续说/etc/inittab这个文件
a、比如文件中有:
tty1:2345:respawn:/usr/sbin/mingetty tty1
...
tty6:2345:respawn:/usr/sbin/mingetty tty6
意思是当我们级别是2345中的任何一个级别时,他会自动运行/usr/sbin/mingetty tty#,这个命令是用来启动虚拟终端的这就是为什么我们操作系统启动起来后有1-6六个虚拟终端并且我们能够打开虚拟终端的原因,因此如果我们干掉这中间的第二行到第五行那么我们就只能Ctrl + Alat +F1和F6了,注意我们mingetty只是启动终端的,启动终端过后我们就应该打印提示符告诉我们用户可以登陆了。
b、而填入账号密码能够登陆这个操作其实不是mingetty这个程序来实现的,而是另外一个,mingetty会调用login程序,login程序才是让你登陆的程序。
c、我们打开虚拟终端的程序除了mingetty之外,还有诸如getty等
4、总结我们上面的,我们整个/etc/inittab配置文件大概就有这么几项
a、设定默认级别:id:3:initdefault:
b、设定系统默认初始化脚本:si::sysinit:/etc/rc.d/rc.sysinit
c、等默认初始化完了就开始启动对应级别的服务:l0:0:wait:/etc/rc.d/rc 0,看定义的级别是几,假如默认的级别是3他就运行3,定义的默认级别是5他就运行5
d、启动完相应的级别后接下来就开始打印各登陆终端,如果启动的是3就把终端启动起来,如果启动的是5还需要启动另外一个,也就是图形终端服务,比如 tty7:5:respawn:/etc/X11/
5、我们接下来说一说我们系统初始化脚本文件:/etc/rc.d/rc.sysinit他的作用
a、设置主机名
b、设置欢迎信息
c、激活udev和selinux
d、挂载/etc/fstab文件中定义的所有文件系统
e、检测根文件系统,并以读写方式重新挂载根文件系统
f、设置系统时钟
g、根据/etc/sysctl.conf文件的设置来设置内核参数
h、激活lvm及软raid设备
i、激活swap设备
j、加载额外设备的驱动程序
k、清理操作
二、现在我们来总结用户空间的启动流程
1、启动流程
首先/sbin/init 应用程序,他主要是通过读取/etc/inittab来完成各种任务,来完成的任务有:
a、第一步设置默认运行级别
b、第二步运行系统初始化脚本完成系统初始化
c、第三步关闭对应级别下需要停止的服务,启动对应级别下需要启动的服务
d、第四步设置登陆终端
e、如果还有的话就会进行第五步,启动图形终端,此步需要运行级别为5级别才会启动
2、这就是我们CentOS5上的整个操作系统的启动流程
三、CentOS6操作系统启动流程
1、init程序:upstart,但是他依然被命名为/sbin/init,只是他的代码名为upstart,而他的配置文件不再是/etc/inittab,而是/etc/init/*.conf,但是为了兼容CentOS5,红帽系列的系统依然会让其读取/etc/inittab,但是这个文件中仅用于定义默认运行级别。而后面的第二步系统初始化脚本的运行是在/etc/init目录下有一个文件中定义的,第三步关闭对应级别下需要停止的服务,启动对应级别下需要启动的服务也是/etc/init目录下有个文件定义的,包括后面的步骤都是在/etc/init目录中相应的文件定义的。相当于他把各功能步骤都切割成为了各配置文件片段。注意 *.conf为upstart风格的配置文件。
rcS.conf:系统初始化脚本
rc.conf:系统启动或关闭服务的
tty.conf:启动终端的
四、CentOS7操作系统启动流程
1、他在设计上尽量的兼容了upstart和Sysv,尤其是对Sysv的兼容几乎能做到完全兼容,但是对CentOS7来讲他就完全是另一套东西了,他的init程序为systemd,他的配置文件为/usr/lib/systemd/system/*,/etc/systemd/system/*,而对于systemd来讲他的独特之处在于,大家可以发现CentOS7他的启动非常快,为什么呢?我们开始讲过CentOS5和CentOS6有一个特点,这个服务我们只要定义在这个级别下该启动那么开机的时候他会自动启动起来,而且服务都启动了,不管你访问不访问他都在那里,但是对CentOS7来讲他就采用了一种非常精巧的方式,你定义成他要启动的服务他这边没启直接就给你开机了,相当于所有服务都没启,那你访问的时候怎么办呢?当你第一次访问的时候他就给你启动起来了,只要你不访问他就一直不启动。所以假如你定义开机要启动20个服务,这20个服务在开机的时候如果能访问三个那么这三个就运行起来,其它的都不运行。当然它的改进远不止这些,并且他们对服务的启动也不再靠/etc/init.d下的这些脚本,其实CentOS6启动服务就不应该靠/etc/init.d下的这些脚本的,而红帽为了能够兼容CentOS5才采取的这种软连接的方式进行服务的启动的。其实upstart的所有服务启动时都应该使用upstart来启动而不应该使用service或使用脚本来启动。到了CentOS7就不存在了,但是他也可以兼容CentOS6和5,因此CentOS5和6在CentOS7上依然可以用,但是为了保证启动速度和启动风格统一CentOS7把此前所有常用服务统统使用systemd来自己控制。但是他是可以兼容CentOS6的。
2、我们可以看到/usr/lib/systemd/system/*,/etc/systemd/system/*这两个目录下的文件都是以service结尾的。并且我们设定默认运行级别的方式也不再是/etc/inittab文件了。
[root@node1 /]# cat /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
a、我们可以看到他的提示为使用systemctl set-default命令设定
b、我们通过systemctl get-default命令查看
[root@node1 /]# systemctl get-default
multi-user.target
此时我们可以发现显示的结果为多用户目标。多用户目标是什么意思呢?他只是为了兼容,注意我们systemd没有级别的概念,但是为了兼容早些时候CentOS5或者6上0-6这7个级别分别定义了多个target来模拟运行级别,默认的target就是所谓的运行级别,但是运行级别3叫multi-user.tart,而运行级别5则是另外一个名字,如果要设定默认的优先级别就需要我们使用systemctl set-default去指明级别就行了,但是这一切我们systemctl命令解释起来还是比较复杂的。
其它用法和功能后面我们再说。
3、CentOS7操作系统的启动过程都是没有改变的,只是相应的程序和实现方式不一样了而已。