GO
1. Linux系统的启动流程
了解系统的启动流程,能够让我们在Linux系统在启动过程中遇到故障时,可以很快速地找到是在哪一步遇到了问题,这样我们就可以针对性地去排查故障。(以CentOS6系统为例说明)
1.1. 第一阶段:硬件引导启动
- 首先是BIOS加电自检,BIOS寻找启动介质,是硬盘还是光盘或者是其他启动介质。
- 找到启动介质后,在该介质中找到MBR。
- MBR是启动介质(比如硬盘)的第一个分区的第一个扇区,大小为512字节。
- 其中前面的446字节是bootloader(CentOS安装的时候会在这里安装一个grub程序),紧接着64字节是分区表,最后面2字节是用来校验的,我们把它叫做55AA。
1.2. 第二阶段:grub启动引导程序
- 找到了MBR,就找到了grub,它就是一个引导程序,它会引导我们想启动的系统。(grub的配置文件是 /boot/grub/grub.conf,与/etc/grub.conf是软链接)
- grub引导分为两个阶段:执行stage1和stage2。
- stage1是直接放在MBR中的,也就是前面446字节里面。
- stage2比较大,所以被放在了文件系统里。
- 对于目前较新的文献系统(如ext4)来说,stage2是不能识别到的,所以在执行完stage1后,需要借助于一个中间桥梁stage1_5来识别stage2所在的文件系统,然后再执行stage2。
- 执行完stage2后,它就会去解析grub的配置文件 /boot/grub/grub.conf,在该配置文件中它又找到了内核和内核映像(initrd)的位置。
1.3. 第三阶段:内核引导
- 内核和内核映像(initrd)找到了,所以内核接管掌控权
- 按理说内核能够识别到几乎所有的硬件设备,但实际上内核的身材是非常小的,它只含有最基本的硬件驱动,而其它的常见硬件驱动是放在 initrd 中的。
- 所以这个阶段,initrd先释放到内存中,临时构成一个只读的文件系统,在这个只读的文件系统中,内核去执行临时文件系统里面的init进程,目的是加载各种硬件的驱动。
- 当所需的驱动加载完后,内核才挂载真正的根文件系统,内核把控制权交给了/sbin/init进程。
1.4. 第四阶段:系统初始化阶段
/sbin/init 进程是系统其它所有进程的父进程,当它接管了系统的控制权后,首先会去读取/etc/inittab配置文件来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络等。主要包括以下工作:
- 执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统算是基本运行起来了,后面需要进行运行级别的确定及相应服务的启动。rc.sysinit所做的事情(不同的Linux发行版,该文件可能有些差异)如下:
- 获取网络环境与主机类型。首先会读取网络环境配置文件(/etc/sysconfig/network),获取主机名与默认网关等网络环境。
- 测试与载入内存设备 /proc、 /sys 及 usb设备。除了/proc 外,系统会主动检测是否有usb设备,并主动加载usb驱动,尝试载入usb文件系统。
- 决定是否启动SELinux。
- 接口设备的检测与即插即用(PNP)参数的测试。
- 用户自定义模块的加载。用户可以在 /etc/syscongfig/*.modules 加入自定义的模块,此时它会加载到系统中。
- 加载核心的相关设置。按 /etc/sysctl.conf 这个配置文件的设置值配置功能。
- 设置系统时间(clock)。
- 设置终端的控制台字形。
- 设置 raid 及 LVM 等硬盘功能。
- 检验磁盘文件系统。
- 进行磁盘配额 quota 的转换。
- 重新以读取模式载入系统磁盘。
- 启动 quota 功能。
- 启动系统随机数设备(产生随机数功能)。
- 清除启动过程中的临时文件。
- 将启动信息加载到 /var/log/dmesg 日志文件中。
- ==》当 /etc/rc.d/rc.sysinit 执行完后,系统就可以顺利工作了,只是还需要启动系统所需要的各种服务,这样主机才可以提供相关的网络和主机功能,因此会执行下面的脚本。
- 执行 /etc/rc.d/rc 脚本。
- 该文件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态是放在 /etc/rc.d/rc*.d(*代表启动级别0~6)目录下,所有的文件均是指向/etc/init.d下相应文件的软链接。
- rc.sysinit 通过分析 /etc/inittab 文件来确定系统的启动级别,然后才去执行 /etc/rc.d/rc*.d 下的文件。
- 注意:也就是说,/etc/目录下的 init.d、rc、rc*.d、rc.local和rc.sysinit 均是指向 /etc/rc.d 目录下相应文件和目录的软链接。我们以启动级别3为例来简要说一下:
- /etc/rc.d/rc3.d目录下的内容都是以S或者K开头的软链接文件,它们都链接到/etc/rc.d/init.d目录下的各种shell脚本。
- S表示启动时需 start 的服务内容,K表示关机时需关闭的服务内容。
- /etc/rc.d/rc*.d 中的系统服务会在系统后台启动,如果要对某个运行级别中的服务进行更具体的定制,通过 chkconfig 命令来操作,或者通过 setup、ntsys、system-config-services 来进行定制。
- 如果我们需要自己增加启动的内容,可以在init.d目录中增加相关的shell脚本,然后在rc*.d目录中建立指向该shell脚本的软链接文件即可。
- 这些shell脚本的启动或结束顺序是由S或K字母后面的数字决定,数字越小的脚本越优先执行。例如:/etc/rc.d/rc3.d/S01sysstat 就比 /etc/rc.d/rc3.d/S99local 先执行。
- 执行用户自定义引导程序 /etc/rc.d/rc.local。
- 其实当执行 /etc/rc.d/rc3.d/S99local时,它就是在执行/etc/rc.d/rc.local。前一个文件是后一个文件的软链接。
- 一般来说,自定义的程序,只需要将命令放在rc.local里面就可以了,这个shell脚本就是保留给用户自定义启动内容的。
- 完成了系统所有的启动任务后,Linux会启动终端或X-Window来等待用户登陆。
- tty1、tty2、tty3……这表示在运行等级1,2,3,4的时候,都会执行 /sbin/mingetty,而且执行了六个,所以Linux会有六个纯文本终端,mingetty就是启动终端的命令。
- 除了这6个之外还会执行 /etc/X11/prefdm-nodaemon ,它主要启动X-Window。
- 至此,系统就完全启动完毕了。
2. 系统启动流程的示意图
- Linux系统启动流程简图
- Linux系统启动流程详图
3. grub的配置文件
3.1. grub配置文件说明
grub的配置文件是 /etc/grub.conf,它的基本配置说明如下:
- default=0(1,2……)表示默认启动那个选项,可自定义
- timeout=5 表示等待几秒进入默认的选项,可自定义
- title后面的内容表示每个选项的标题,也就是在开机时候的各个选项的名字,可自定义
- 启动参数,最好不要改,改错了,就进不去系统了
3.2. grub加密
- 不加密密码的设置方式
- 在/etc/grub.conf配置文件中的title那行的上面添加一行”password=密码”即可
- 加密密码的设置方式
grub-md5-crypt
grub-crypt --md5|--sha-256|--sha-512
- 用以上的命令来获得加密的密码,然后将其复制到/etc/grub.conf文件中的”password –md5|–sha-256|–sha-512 加密的密码”即可
- 说明:–md5|–sha-256|–sha-512 这三种只选一种即可
OK