Linux 启动过程

/

从按下电源到 Linux 出现登陆提示,中间经历了什么呢?以下是 Linux 启动过程中经历的 6 个阶段:

BIOS

BIOS 是 Basic Input/Output System 的缩写,它执行系统完整性检查,从软盘、光盘和硬盘检索、加载并且执行引导装载程序,开始时按下 F12 或 F2(视系统而定)可以改变检索(启动)顺序,一旦引导装载程序被检索到加载入内存,BIOS 就会把控制权交给它。简而言之,BIOS 用于引导执行 MBR 引导装载程序。

MBR

MBR 是 Master Boot Record 的缩写,它位于可引导磁盘(例如 /dev/hda/dev/sda)的第一个扇区,小于 512 字节,由 3 部分组成:主引导装载信息位于最前面的 446 字节,分区表信息位于之后的 64 个字节,mbr 验证信息位于最后 2 个字节。MBR 包括 GRUB 信息。简而言之,MBR 用于引导执行 GRUB 引导装载程序。

GRUB

GRUB 是 Grand Unified Bootloader 的缩写,假如系统中有多个内核镜像,可以选择加载哪一个,GRUB 显示启动画面时,会等待几秒钟供用户选择,如果用户未作选择,它将加载在设置文件中指定的默认内核镜像。GRUB 能够理解文件系统,设置文件位置在 /boot/grub/grub.conf,下面是发行版 CentOS 中的 grub.conf 示例:

# boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-194.el5PAE)
    root (hd0,0)
    kernel /boot/vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/
    initrd /boot/initrd-2.6.18-194.el5PAE.img

从上面的设置可以看出,它包括内核和 initrd 镜像加载信息。简而言之,GRUB用于引导执行内核和 initrd 镜像。

Kernel

根据 grub.conf 中的 root= 设定挂载根文件系统,内核执行 /sbin/init 程序,作为被内核执行的第一个程序,其 PID 为 1。initrd 是 Initial RAM Disk 的缩写,在内核被完全引导、真实的文件系统被挂载前,initrd 被内核作为临时的根文件系统,它包含必要的驱动组件,以便它能访问硬盘分区和其它硬件。

Init

检索 /etc/inittab 文件决定 Linux 运行级别,有效的运行级别有:

  • 0 - 关机
  • 1 - 单用户模式
  • 2 - 无网络文件系统 NFS 的多用户模式
  • 3 - 完全的多用户模式
  • 4 - 未使用的
  • 5 - 桌面环境
  • 6 - 重启

Init1/etc/inittab 中识别默认的初始运行级别并引导所有相关的程序,改变程序默认的运行级别会带来麻烦,一般情况下可以设置运行级别为 3 或 5。

Runlevel 程序

当 Linux 系统启动时,用户会看到许多服务启动的信息,比如 starting sendmail ... OK,这些是 runlevel 程序,从相应的运行级别目录加载,对应关系如下:

运行级别 0 - /etc/rc.d/rc0.d/
运行级别 1 - /etc/rc.d/rc1.d/
运行级别 2 - /etc/rc.d/rc2.d/
运行级别 3 - /etc/rc.d/rc3.d/
运行级别 4 - /etc/rc.d/rc4.d/
运行级别 5 - /etc/rc.d/rc5.d/
运行级别 6 - /etc/rc.d/rc6.d/

/etc 目录中存在上述目录的链接,比如 /etc/rc0.d 链接到 /etc/rc.d/rc0.d。在 /etc/rc.d/rc*.d 中,可以看到一些以 S 和 K 开头的程序,S(startup)代表开始时执行,K(kill)代表关闭时执行,紧跟 S 或 K 之后的数字代表顺序,数字越小,越先执行,数字越大,越后执行。

参考:6 Stages of Linux Boot Process (Startup Sequence)

  1. 现代很多 Linux 发行版已经用新的 init 系统 systemd 替代了 sysVinit。 

Comments