CentOS开机顺序

  CentOS开机顺序,以x86构架的环境下的CentOS为例。

启动步骤概览

  • 1.上电,POST开机自检

  主板上的CMOS芯片随加电开始工作,该芯片里的内存芯片上面放着的BIOS程序会执行POST过程中的具体操作,检查各项硬件。检查完硬件后BIOS开始定位引导设备。

  • 2.boot loader载入,展示grub启动菜单

  对于BIOS固件(在主板Setup里BOOT类型处的设置):

  BIOS会将可引导设备(一般是硬盘)的第一个扇区的内容装入内存,这就是主引导记录(Master Boot Record)。MBR的512个字节中包含了被称作引导装载程序的引导机器的代码指令,以及分区表。此时BIOS将引导过程的控制权交给MBR中的这段代码程序,也就是boot loader。这里boot loader指的也就是GRUB(GNU GRand Unified Bootloader),目前基本都是版本2(GRUB 2)。这段boot loader代码分为两个阶段执行,第1阶段(前440 bytes所构成的boot.img)的功能是载入GRUB的第1.5阶段core.img(实际上boot.img只是指出了boot.img的开头第一个扇区diskboot.img的位置,由diskboot.img负责完成整个core.img的载入)。

  由于整个GRUB代码还需要负责展示启动项等一系列工作,在主引导记录MBR的512字节里根本放不下。对于MBR分区表的硬盘,GRUB的其余部分core.img一般放在MBR和第一个分区之间的空闲扇区里。对于GPT分区表的硬盘,core.img则放在专用的BIOS Boot Partition位置中(紧跟着主引导记录后的空间被GPT自己用掉了,在一定程度上该专用空间更安全)。具体分布可以参考wiki图例(https://en.wikipedia.org/wiki/GNU_GRUB)。

  等core.img载入后来到真正的GRUB阶段2,core.img会识别硬盘文件系统,并载入/boot/grub2/i386-pc/normal.mod,然后normal.mod会读取/boot/grub2/grub.cfg,完成其他mod的载入,展示出启动项菜单。

  对于UEFI固件(在主板Setup里BOOT类型处的设置):

  boot loader不再存放在MBR里,而是放在EFI System Partition (ESP)中。UEFI接口设备会根据这个特殊的GUID(globally unique identifier)找到该分区下的/efi/XXX/grubx64.efi文件,由固件加载该程序直接启动,代替boot.img所做的1阶段和1.5阶段的任务。第2阶段使用的mod文件一般放在/boot/grub/x86_64-efi/normal.mod中,grub配置则是/boot/efi/EFI/redhat/grub.conf。

  • 3.kernel和initramfs载入

  当用户选择了启动列表菜单中的kernel后,boot loader会寻找/boot/中对应的内核二进制文件vmlinuz-XXX,将其载入内存,并载入initramfs。initramfs用于帮助内核载入驱动和其他模块。当kernel镜像和initramfs镜像都被载入内存后,boot loader正式将剩下的启动流程交由kernel接管。

  • 4.内核初始化阶段

  (这个阶段就是我们看到屏幕上不停地跑字符串的阶段)当kernel接管启动以后,会马上初始化内存并配置硬件(包括硬盘)。然后将内存中的initramfs解压到/sysroot/下,载入需要的各种驱动后,创建虚拟设备(LVM、软RAID),完成initramfs阶段并清理initramfs占用的内存。

  接下来内核会创建root设备将其挂载为只读,并彻底释放其他内存。

  • 5.用户登录阶段

  此时内核已经完全开始正常工作,但尚未具备可供输入输出的用户环境。

  对于CentOS 6及以前的系列,内核会执行/sbin/init,初始化系统,运行所有的开机启动服务 init读取/etc/inittab获取运行级别。

  对于CentOS 7及以后的系列,内核会执行systemd读取系统的运行级别,将其载入到预配好的级别(systemd概念下的targets等同runlevel)。

# 附对应关系
runlevel0.target -> poweroff.target
runlevel1.target -> rescue.target
runlevel2.target -> multi-user.target  without NFS
runlevel3.target -> multi-user.target  full
runlevel4.target -> multi-user.target unused
runlevel5.target -> graphical.target
runlevel6.target -> reboot.target
  • 6.登录

  执行/bin/login程序,等待用户登录。


发表评论

评论列表,共 2 条评论

  • nqqnfexsnf
    fexwdqfdwjlxmpurnlpxkpkytwuiru
  • sptsytihwg
    skfkiuzmvruntgqlnthweomukrhgov