Centos的开机启动流程
具体步骤解释: |
第一步:加电自检:POST
加电自检是检测硬件设备是否正常运行,以及一些外围设备的输入输出是否存在。
自检功能的实现是依靠BIOS软件程序实现的
BIOS即基本输入输出系统,它是装载在一个硬件芯片COMS上的,加电过程就是给硬件COMS通电,使其启动BIOS程序,然后BIOS会根据CMOS上面的配置信息去读取其他的硬件设备信息并检测是否存在,能够正常运行,之后进行硬件设备的初始化。
第二步:加载MBR
按次序查找各引导设备(引导设备为自定义),第一个有引导程序的设备即为本次启动要用到的设备。这里以mbr为例
在硬件设备初始化之后,BIOS会列出一些可启动的装置顺序,接下来就去读取第一个可以启动的设备中操作系统的核心文件,由于不同的系统的文件系统格式不同,为了避免不兼容的问题,就需要一个管理程序来处理这些核心文件的加载问题,即Boot Loader(引导加载程序) ,Boot Loader是一个程序,它存放于硬盘中的第一个扇区内,就是MBR(主引导记录)中。
MBR:主引导记录
总字节数:512bytes
前446bytes:存储BootLoader,引导加载器
中间64bytes:分区表,每16bytes标识一个分区
最后2bytes:前面信息的有效性标识,55AA表示前面510bytes有效
加载MBR主引导记录
第三步:GRUB菜单
GRUB:统一引导加载器
Centos5、6:GRUB0.X Grub legacy
Centos7:GRUB1.X Grub2
查看grub版本信息:grub –version
由于MBR的446字节太小,不足以提供Grub的功能实现,所以Grub就把其功能分为三段
Bood Loader:第1阶段 功能:运行主程序,这个程序必须要被安装在启动区,即MBR中,因为MBR的空间有限,因此在MBR中仅安装Boot Loader的最小程序,并没有安装Boot Loader的相关配置文件
Partition:filesystem driver 第1.5阶段 功能:在MBR随后的扇区中存放,主要用于与第二阶段所在分区的文件系统进行交互
Partition:/boot/grub 第2阶段 功能:通过Boot Loader加载所有配置文件及相关的环境参数信息,这些配置文件及相关的环境参数都存放与磁盘分区上的/boot目录中。该阶段提供了Grub启动菜单和交互式的grub的shell
Boot Loader原本是用来加载内核的,这里让Bood Loader去加载Grub的第二个阶段,第二阶段完成后,由它完成加载内核。
Boot Loader的第一个功能是去识别、加载操作系统中的核心文件,并提交到内存中,从而启动操作系统。不同的操作系统的文件格式不同,因此每一个操作系统都有自己的Boot loader程序
Boot Loader的第二个功能是提供一个菜单,允许用户选择要启动的系统或不同的内核版本,把用户选定的内核装载到MBR中的特定空间,解压、展开,而后把系统的控制权移交给内核;
第四步:加载系统内核 Kernel
在Bood Loader开始读取炒作系统内核文件后,接下来就会将内核文件解压后装在到内存当中,然后根据内核提供的功能开始测试与加载各个设备,这里的设备检查与之前的BIOS自检不同,此时内核程已经完全接管了BIOS的工作,之后的操作都是由内核来完成的。内核文件通常放置在/boot/目录中,并且是一个以vmlinuz开头的文件。
此时内核程序还没有加载到磁盘,又如何去读取文件系统上的内核文件呢? 为了解决这个问题,我们采用了一种叫做虚拟文件系统来解决这个问题,虚拟文件系统(Initial RAM DISK),同样它也放置在/boot/目录下面
Centos5的虚拟文件系统是基于ramdisk
文件为:/boot/initrd-VERSION-release.img
制作此文件工具:mkinitrd
Centos6、7的虚拟文件系统是基于ramfs
文件为:/boot/initramfs-VERSION-erlease.img
制作此文件工具:dracut、mkinitrd
Linux内核的特征之一:使用缓冲和缓存来加速对磁盘上的文件访问
ramdisk:把内存当作磁盘
ramdiskàramfs
这两种文件的特点是:能够通过Bood Loader程序将其加载到内存中,然后此种文件会被解压缩并且在内存中模拟一个根文件系统,这个根文件系统能够提供一个可以运行的程序,通过该程序可以加载在启动过程中所需要的核心模块(如:RAID、LVM、SCSI等文件系统与磁盘的驱动程序),加载完成后,会协助内核重新呼叫/sbin/init来执行后续的正常启动
内核的功能:
① 探测可识别到的所有硬件设备(CPU、硬盘、网卡等)
② 加载硬件驱动程序(有可能会借助于ramdisk加载驱动)
③ 以只读方式挂载根文件系统
④ 运行用户空间的第一个应用程序:/sibn/init
第四步:启动第一个进程 /sbin/init
在内核、硬件及驱动信息加载完毕后,内核会呼叫用户控件的第一个执行程序/sbin/init,init程序的主要功能是准备软件运行环境,包括系统的主机名称、网络配置、文件系统格式等其他服务的启动管理。而这些都是通过init的配置文件来定义的。
Init的配置文件:
Centos5:采用SysV init方式
特点:启动用户空间的服务程序,通常通过脚本进行,有依赖关系的服务将串行启动,所以,就导致了centos5的系统启动非常缓慢。
配置文件为:/etc/inittab
Centos6:采用Upstart方式
特点:守护进程间的通信依赖于D-Bus进行,因此,可以基本实现类似并行的方式启动
配置文件:/etc/inittab ,/etc/init/*.conf
Centos7:采用Systemd方式
特点:服务只有在第一次被访问时才会真正启动起来,centos7系统的启动过程非常快。
配置文件:/usr/lib/system/* ,/etc/system/system/*
在init的配置文件中有一个非常重要的配置项,就是默认的系统启动级别,分为一下几种:
1、0:关闭所有服务; 关机
2、1:维护模式,单用户模式,root用户直接登陆,多用于系统维护
3、2:维护模式,多用户模式,需要用户认证,会启动网络服务,但不支持FNS
4、3:正常级别,完全的多用户模式,文本界面
5、4:预留级别,默认与3级别相同
6、5:正常级别,完整的图形界面多用户模式
7、6:关闭所有服务;重启
3和6级别用的比较多
切换模式的方式为:init[0-6]
查看当前运行级别:runlevel 或 who –r
Centos5的配置文为/etc/inittab
打开配置文件:
id:runlevel:action:process //默认runlevel配置
解释:id:一个任务的标识符
runlevels:在哪些级别启动此任务,#,###(#代表上述的级别) 也可以为空,表示所有级别
action:在什么条件下启动此任务
wait:等待切换至此任务所在的级别时执行一次
respawn:此任务终止时,就自动重新启动
initdefault:设定默认运行级别;此时process省略
sysinit:设定系统初始化方式,此处一般指定/etc/rc.d/rc.sysinit脚本
si:sysinit:/etc/rc.d/rc.sysinit //系统软件运行环境的脚本
/etc/rc.d/rc.sysinit为初始化用户空间环境,会执行许多系统初始化任务,在完成初始化脚本后,系统还会启动对应级别下折定为要启动的服务,关闭那些设定为要停止的服务。
7个不同的runlevel 需要启动的服务的scripts放置位置:
l0:0wait/etc/rc.d/rc 0 <=runlevel 0在/etc/rc.d/rc0.d
l1:1wait/etc/rc.d/rc 1 <=runlevel 1在/etc/rc.d/rc1.d
l2:2wait/etc/rc.d/rc 2 <=runlevel 2在/etc/rc.d/rc2.d
l3:3wait/etc/rc.d/rc 3 <=runlevel 3在/etc/rc.d/rc3.d
l4:4wait/etc/rc.d/rc 4 <=runlevel 4在/etc/rc.d/rc4.d
l5:5wait/etc/rc.d/rc 5 <=runlevel 5在/etc/rc.d/rc5.d
l6:6wait/etc/rc.d/rc 6 <=runlevel 6在/etc/rc.d/rc6.d
在/etc/rc.d/rc#.d/下的所有链接文件来决定如何启动关闭服务,所有以S开头的链接文件,都会被传递start参数以启动;所有以K开头的链接文件;都会被传递stop参数以停止
Init的处理流程
Init是通过自上而下的读取inittab文件来一次执行的,因此init的处理流程是:
1、 读取默认的runlevel,这里使用的是默认级别3
2、 使用/etc/rc.d/rc.sysinit进行系统的初始化
3、 由于采用的是3级别,因此只能进行l3:3:wait:/etc/rc.d/rc3 其他的忽略
4、 配合好[ctrl]+[alt]+[del]组合键的功能
5、 配置不断电系统pf、pr两种机制
6、 启动mingetty6个终端
7、 如果是5级别,则会以/etc/X11/prefdm-nodaemon启动图形化界面
如果不想启用6个终端,可以将多余的注释掉 加#即可
在init执行的第二步执行系统初始化过程,init是根据/etc/rc.d/rc.sysinit中定义的内容进行系统初始化,做一下事情:
1、 根据配置文件中的设定来设定主机名(读取/etc/sysconfig/network文件中的HOSTNAM进行)
2、 打印文本欢迎信息
3、 激活SELinux和udev
4、 挂载所有定义在/etc/fstab文件中的文件系统
5、 激活swap设备
6、 检测根文件系统,并以读写的方式挂载
7、 设置系统时钟
8、 根据/etc/sysctl.conf文件设定内核参数值
9、 激活LVM和RAID设备
10、 加载额外的设备驱动程序
11、 清理操作
服务的启动:
服务的启动停止是通过inittab里面提到的l3:3wait:/etc/rc.d/rc 3配置,实际上是通过/etc/rc.d/rc3.d/下的所有链接文件来决定如何启动或关闭服务的。
/etc/rc.d/rc3.d下的所有链接文件其实都是在/etc/init.d/下面的所有脚本,这些脚本遵循LSB服务脚本的定义规范,接受至少四个基本参数:{start|stop|restart|status}
start:启动服务
stop:停止服务
restart:重启服务
status:查看服务状态
脚本在指定级别启停的控制方法:
脚本开头添加这些项:
#chkconfig: 哪些级别 启动数 停止数 例如: #chkconfig: 234 25 85
#description: 脚本描述 (centos5中必须填写,centos6可写可不写)
可通过chkconfig命令来管理服务脚本
chkconfitg –level 级别 脚本 on|off
–level:指明级别为on或off,其余的保持原状,默认级别为2345
chkconfig –list 脚本
查看服务在对应级别的状态
chkconfig –add | –del 脚本
–add :添加服务 为某存放在/etc/init.d的服务在对应的/etc/rc.d/rc0-6.d目录添加符号链接
–del :删除服务 把指定脚本在7个符号链接中都删除
注意:有一个S99local的符号链接,指向的是/etc/rc.local脚本,其功能为:那些不便定义为服务脚本,设定开机自动运行的脚本, 可直接把命令写入次脚本中,以实现开机即运行。
Linux系统启动后,一般会开启6个tty终端,每个中端启动后,会立即通过此终端附加一个应用程序——-lofin,如果运行级别为5还会启动一个图形虚拟终端。
Centos6的配置文件及其功能:
/etc/inittab
设置系统默认的运行级别
id:3:initdefault:
/etc/init/control-alt-delete.conf //设置ctrl+alt+del三键操作
/etc/init/tty.conf //控制tty终端的开启
/etc/init/start-ttys.conf //配置tty终端的开启数量,设备文件
/etc/init/rc.conf //兼容脚本,负责个运行级别的调用处理/
/etc/init/rcS.conf //加载rc.sysinit脚本,完成系统初始化任务
/etc/rcS-sulogin.cong //为单用户模式启动/sbin/sushell环境
centos6的启动过程:
1. 加载BIOS 的硬件信息,获取第一个启动设备。
2. 读取第一个启动设备MBR 的引导加载程序(grub) 的启动信息
3. 加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备。
4. 核型执行init 程序并获取运行信息。
5.Init 执行/etc/rc.d/rc.sysinit 文件。
6. 启动核心的外挂模块(/etc/modprobe.conf)。 。
7.Init 执行运行的各个批处理文件(scripts).
8.Init 执行/etc/rc.d/rc.local.
9. 执行/bin/login 程序,等待用户登录。
10. 登录之后开始以Shell 控制主机。
原创文章,作者:ZJM,如若转载,请注明出处:http://www.178linux.com/45716