linux 内核使用一种 ram 磁盘在早期引导阶段访问模块。出于好奇,我想了解我有一个问题:在这个阶段,内核必须可以访问包含 initramfs/initrd 的文件。这意味着内核必须支持适当的文件系统。那么为什么 initramfs 的内容不能和普通文件在同一个文件系统中呢?
3 回答
在这个阶段,内核必须可以访问包含 initramfs/initrd 的文件。
这似乎是您困惑的核心:读取 initramfs/initrd 的不是内核,而是引导加载程序!内核不需要知道如何访问 initramfs/initrd。这就是练习的重点!
引导加载程序将initramfs/initrd 加载到内存中,并且有一个定义明确的通信协议,允许引导加载程序告诉内核它在哪个内存地址加载了 initramfs/initrd。
在 initramfs 的情况下,initramfs 映像也可以附加到内核映像。
首先,引导加载程序(可能是LILO或Grub)使用 BIOS 调用从引导驱动器读取内核映像。然后它将控制权传递给刚刚放置在系统 RAM 中的内核。
内核不使用 BIOS 调用来访问磁盘。当内核启动时,它会扫描系统中的设备,并为系统中的每个设备加载设备驱动程序模块,挂载根文件系统并启动第一个用户进程。
但是等等:内核是如何加载磁盘子系统的设备驱动模块的呢?这里有一个先有鸡还是先有蛋的问题,您需要访问磁盘以获取允许您访问磁盘的设备驱动程序。
解决方案是将所有这些驱动程序放在初始 ramdisk (initrd) 中;该 ramdisk 映像由引导加载程序读取并与内核一起放置在 RAM 中,这为内核提供了访问根文件系统所需的驱动程序集。
如果没有这个,您将需要访问内核中内置的根文件系统所需的所有驱动程序。
有可能。启动不需要 initrd 映像,但大多数都使用它。但是,这样做是允许您为文件系统进行不同的设置。例如,当使用非 ext2 文件系统(NFS?XFS?)、使用 RAID 或在不寻常的设备(USB 驱动器?带有 unionfs 的 CDROM?)上托管根文件系统时,通常需要 initrd。
当然,这可以通过将正确的文件系统或 RAID 驱动程序编译到您的内核中来避免,但这会使您的内核更大。