CentOS 6开机启动流程理论篇
- centos 系统的启动流程
- grub
- 破坏Linux的核心文件再修复体验系统启动流程
概述
任何系统启动的第一步必然是加电,然后计算机硬件会主动地读取BIOS来加载硬件设备信息并检测,之后系统会主动地读取第一个有引导程序的设备,该引导程序(grub)可以指定使用哪个内核来启动,并将其加载至内存当中运行,同时内核还要加载其他硬件设备以及对应的驱动程序,来例主机各个组件开始运行,等所有硬件设备加载完后,系统就真正地启动了,稍后系统会操作一些外部程序开始准备软件的运行环境,之后加载一些系统运行时所需要的软件程序,最后一公里就是等待用户的登陆.
本文主要以CentOS 5、6的启动说明Linux系统的启动流程,CentOS 7来日再叙!主要以CentOS 6为例说明!
从宏观上讲,centos 6的开机可简述为:
POST(加电自检)--> MBR引导--> grub--> 加载内核 --> 启动init进程 --> 用户登录
具体详情见下图:
1.加载BIOS的硬件信息,获取第一个启动设备 2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息 3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备 4.核心执行init程序,并获取默认的运行信息 5.init程序执行/etc/rc.d/rc.sysinit文件 6.启动核心的外挂模块 7.init执行运行的各个批处理文件(scripts) 8.init执行/etc/rc.d/rc.local 9.执行/bin/login程序,等待用户登录 10.登录之后开始以Shell控制主机
关键词:
bootloader: 引导程序,一个引导加载器
对于Windows而言,其bootloader为ntloader,仅启动的是OS.
对于Linux而言,目前流行的是gurb,其功能强大,允许用户选择要启动的系统(不同的内核版本),把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核。
MBR: 主引导刻录,位于硬盘的主引导扇区里面(硬盘的0柱面、0磁头、1扇区称为主引导扇区),其中bootloader占用了446bytes, 分区表占用了64bytes,2bytes的分区标识符55AA.
GRUB:
primary boot loader : 1st stage,1.5 stage secondary boot loader :2nd stage,分区文件
grub的程序运行本配置加载是分三个阶段(stage)来运行:
stage1:运行bootloader主程序,这个程序必须要被安装在主引导区,即MBR中,而MBR中仅安装了bootloader的最小主程序,并没有安装bootloader的相关配置文件。
stage1_5: 在MBR随后的扇区中存放,主要用于与stage2所有分区的文件系统进行交互。
stage2: 通过bootloader加载所有配置文件及相关的环境参数信息,这些配置文件及相关的环境参数都存放于磁盘分区上的/boot目录下。
当bootloader读取了这些文件系统所定义的数据后,就能够识别文件系统并读取在该文件系统上的内核文件了。
grub作为Linux系统使用最广泛的启动管理器,我们有必要了解一下其配置文件grub.conf的内容:
Note:
default=0 表示默认的启动条目 timeout=5 表示等待时间,如果超过5秒,则使用默认的启动条目defaultsplashimage=(hd0,0)/grub/splash.xpm.gz 定义启动时的背景图片信息 hiddenmenu 启动时是否要显示菜单,默认情况下是不显示菜单信息,如果要显示,注释掉该行即可 title 定义各个操作系统的名称 root (hd0,0) root: 表示内核文件存放的位置,这里指的是分区位置,而非根目录; 硬盘以hd表示,代号以()括起来,如(hd0,0)表示磁盘上的第一个分区,磁盘编 号是grub搜寻到的顺序。 kernel 内核的名称及一些启动时的核心参数,由于启动过程中需要挂载根目录,因此 就需要指定根目录所在的分区。 initrd initrd或initramfs,即虚拟文件系统
grub也支持命令行接口:直接在shell中输入grub
grub的保护机制:只有通过认证才能修改grub.conf信息,可以通过以下方式来对grub.conf进行保护:
1. 在第一个title之上添加password --md5 主要用于保护编辑功能; 2. 在某个title内添加password --md5 主要用于保护内核 生成密码的命令:grub-md5-crypt openssl passwd -1 # -1表示生成md5
Kernel: 自身初始化
探测可识别到的所有硬件设备 加载硬件驱动程序(可能借助于ramdisk加载驱动) 以只读方式挂载根文件系统 运行用户空间的第一个应用程序:/sbin/init
init:
SysV: init, CentOS 5之前 配置文件:/etc/inittabUpstart: init,CentOS6 配置文件:/etc/inittab, /etc/init/*.conf Systemd:systemd, CentOS 7 配置文件:/usr/lib/systemd/system /etc/systemd/system
ramdisk:
内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问 ramdisk--> ramfs提高速度 CentOS 5: initrd, 工具程序:mkinitrd CentOS 6: initramfs,工具程序:mkinitrd, dracut
在/etc/inittab中定义了系统的默认启动级别及所有的级别,通常默认为3或5级别,各级别之间可通过 init [0-6] 来切换,可通过runlevel或者who -r命令来查看当前的运行级别。
7个不同的run level 需要启动的scripts放置路径: /etc/rc.d/
其中,/etc/rc.d/rc.sysinit是系统的初始化脚本,其实现以下作用:
(1) 设置主机名 (2) 设置欢迎信息 (3) 激活udev和selinux (4) 挂载/etc/fstab文件中定义的文件系统 (5) 检测根文件系统,并以读写方式重新挂载根文件系统 (6) 设置系统时钟 (7) 激活swap设备 (8) 根据/etc/sysctl.conf文件设置内核参数 (9) 激活lvm及software raid设备 (10) 加载额外设备的驱动程序 (11) 清理操作
另外,centos 5中,/etc/inittab中还有这一字段:
rc N意味着读取/etc/rc.d/rcN.d/,里面的文件都是以K或S打头的链接文件。
K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务 S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务
注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本;
另外,不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中;
/etc/rc.d/rc.local在指定运行级别脚本后运行,可以根据情况,进行自定义修改
小结:CentOS 6的启动流程:
POST --> Boot Sequence(BIOS) --> Boot Loader --> Kernel(ramdisk) --> rootfs--> switchroot--> /sbin/init-->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别--> 系统初始化脚本rc.sysinit--> 关闭或启动对应级别的服务--> 启动终端
小结:grub
- stage1: mbr
- stage1_5: mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统
- stage2:磁盘分区(/boot/grub/), stage2及内核等通常放置于一个基本磁盘分区
在grub引导内核启动的过程中是可以设置内核参数的,譬如是否开启selinux, 系统的最大loop文件,系统要启动的第一个进程等,这些设置的内核参数可用如下命令查看:
[[email protected] ~]#cat /proc/cmdline ro root=UUID=02ca7016-e9e5-47c2-b015-cd99629f2df0 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet [[email protected] ~]#
当然,还有专门的内核参考文档:usr/share/doc/kernel-doc-2.6.32/Documentation/k ernel-parameters.txt
要想查看此文档,需要安装相应的kernel-doc包,直接挂载光盘可安装。
[[email protected] /usr/share/doc/kernel-doc-2.6.32/Documentation]#ls kernel-docs.txt kernel-docs.txt [[email protected] /usr/share/doc/kernel-doc-2.6.32/Documentation]#
关于临时根文件系统
临时根文件系统允许内核在没有挂载任何物理磁盘的情况下完整地实现引导,这个临时根文件系统就是initrd. 在内核引导过程中,初始 RAM 磁盘(initrd/initramfs)是由stage2加载到内存中的,它会被复制到RAM中,并挂载到系统上。当内核被引导之后,可以正式装备根文件系统了,此时会将 initrd 根文件系统卸载掉,并挂载真正的根文件系统,这就是所谓的switch root,即根切换.
了解了系统启动的基本流程,以下我们通过“破坏式实验”,即破坏系统启动过程中的一些关键环节,使系统无法启动,然后我们再通过修复这些文件使得系统正常重启,进而体验Linux系统的启动流程,这些关键环节包括破坏grub三个stage(stage1、stage1-5、stage2) 中的任何一个阶段,甚至是整个grub; 还有挂载文件/etc/fstab,内核文件vmlinuz, 系统引导时需要加载的驱动程序文件initramfs以及MBR中的相关信息等。
本文半前部分(理论篇)我们主要讲述了centos 6的启动流程,解析了相关的关键词,后半 部分(实验篇)将通过大量破坏式实验体验了相关的关键文件在Linux系统中起的作用。