Linux的boot和startup过程
Linux的启动主要分为两阶段的过程:boot和startup。boot过程在计算机启动后触发,完成代表内核初始化成功并且系统已经启动。之后startup过程接管并将计算机转变为可触发状态。
总的来说,主要由接下来的步骤完成:
1、BIOS POST
2、Boot loader (GRUB2)
3、Kernel initialization
4、Start systemd, the parent of all processes.
The boot process
启动过程可以由多种操作触发。首先,是计算机的电源键被点击。其次是用户手动执行reboot操作。
BIOS POST
- BIOS(Basic I/O System)
- POST (Power On Self Test)
POST是硬件自检,自检完成后,就触发BIOS中断,INT13H。然后就加载首个可用的Boot loader进RAM。linux distribution中常用3中boot loader:GRUB,GRUB2和LILO。其中GRUB2是最新和最常见的。
GRUB2
GRUB的主要功能是,将Linux kernel加载进内存并运行。GRUB的两个版本的工作方式类似,都具有3个阶段的工作。
stage 1
the boot record,通常位于MBR中。即一个分区中的第0号sector。
stage1的内容很小,需要小于512字节。它的主要目的是将stage1.5加载进RAM。
boot.img
stage1.5
相关的代码在boot record和磁盘上的首个分区之间。因为首个分区的起始位置在第63号sector。因此剩下的62个分区可以用于存储stage1.5的内容,即core.img。其中包含了常见的文件系统驱动。
所以stage2的文件可以放在EXT文件系统,但不能位于逻辑卷上。因为逻辑卷在系统启动前无法被激活和识别。
stage 2
stage2的功能是定位和加载linux Kernel到RAM中。并把控制权限转交个RAM。
内核和其相关的文件位于/boot目录。内核文件能够被是被是因为它们都以vmlinuz开头。
Kernel
在这个阶段,kernel会使用initial ram disk(initrd)建立临时的root file system。直到真正的文件系统被挂载。
Because there is no hard drive in many embedded systems based on Linux, the initrd also serves as the permanent root file system.
择的Kernel被加载到内存后,其首先会进行自我解压。解压完成后就会加载systemd。
此时boot阶段就完成了,不过还没有任何productive tasks正在执行。
因为有initrd的存在,kernel阶段就分为了两个阶段。首先执行kernel自己必要的驱动安装,然后调用initrd的内容。
The startup process
boot过程之后的startup过程,将linux带到一个可操作的阶段。
systemd
systemd是所有进程的parent。所有启动进程根据启动依赖顺序,依次启动。
启动的进程包括“挂载文件系统”、“加载分区文件”等。
不同进程间既有并行启动,也有串行启动。