一旦引导加载程序将内核加载到内存中并将必要的参数传递过去,内核就会接管系统的控制权。让我们探索接下来会发生什么。
内核初始化与 Initramfs
启动过程中的一个经典挑战是:内核需要驱动程序才能访问硬件设备,但这些驱动程序通常驻留在内核尚无法访问的存储设备上。为了解决这个问题,Linux 使用了一个临时的根文件系统。
在旧系统中,这是由 initrd(初始 RAM 磁盘)处理的。内核会加载这个磁盘映像,找到必要的驱动程序,然后切换到真正的根文件系统。现代系统,包括 Ubuntu 等发行版,使用 initramfs(初始 RAM 文件系统)。与 initrd 不同,initramfs 是一个 cpio 归档文件,直接在内存中解压到一个临时文件系统中。这种方法更有效率,因为它避免了创建和挂载块设备的开销。initramfs 只包含内核访问实际的 boot partition(引导分区)和其他硬件所需的必要模块。
挂载引导根文件系统
加载了来自 initramfs 的驱动程序后,内核现在可以定位并挂载主要的 boot root(引导根)文件系统。该文件系统的位置通常由引导加载程序作为参数传递,该参数可以在 /etc/default/grub 等文件中进行配置。
首先,内核以只读模式挂载 boot root 分区。这是一种安全措施,允许 fsck(文件系统检查)实用程序运行并验证文件系统的完整性,而不会有数据损坏的风险。检查成功完成后,内核会以读写模式重新挂载文件系统。
最后,当根文件系统完全可用后,内核启动第一个用户空间程序:init。该程序负责使系统的其余部分联机。