为什么不只是普通文件而不是initramfs或initrd?

时间:2010-01-16 16:43:49

标签: linux-kernel kernel bootloader initrd

Linux内核使用一种ram磁盘在早期启动阶段访问模块。出于好奇,我想了解我有一个问题: 在此阶段,内核必须可以访问包含initramfs / initrd的文件。这意味着内核必须支持适当的文件系统。那么为什么initramfs的内容不能和普通文件在同一个文件系统中呢?

3 个答案:

答案 0 :(得分:6)

  

在此阶段,内核必须可以访问包含initramfs / initrd的文件。

这似乎是你困惑的核心:它不是内核读取initramfs / initrd,它是 bootloader !内核不需要知道如何访问initramfs / initrd。这是练习的全部

bootloader 将initramfs / initrd加载到内存中,并且有一个明确定义的通信协议,允许引导加载程序告诉内核它加载initramfs / initrd的内存地址。

对于initramfs,initramfs图像也可以附加到内核映像。

答案 1 :(得分:1)

可以。启动时不需要initrd映像,但大多数都使用它。但是,这样可以让您对文件系统进行不同的设置。例如,在使用非ext2文件系统(NFS?XFS?),使用RAID时,或在异常设备(USB驱动器?带有unionfs的CDROM?)上托管根文件系统时,通常需要initrd。

当然,这可以通过将适当的文件系统或RAID驱动程序编译到内核中来避免,但这会使内核变大。

答案 2 :(得分:1)

首先,引导加载程序(可能 LILO Grub )使用BIOS调用从引导驱动器读取内核映像。然后它将控制权交给刚放入系统RAM的内核。

内核不使用BIOS调用来访问磁盘。在内核启动时,它会扫描系统中的设备,并为系统中的每个设备加载设备驱动程序模块,安装根文件系统并启动第一个用户进程。

但是等一下:内核如何为磁盘子系统加载设备驱动程序模块?这里有一个鸡蛋和鸡蛋问题,你需要访问磁盘才能获得允许你访问磁盘的设备驱动程序。

解决方案是将所有这些驱动程序放在初始ramdisk(initrd)中; ramdisk映像由引导加载程序读取并放在内核的RAM中,这为内核提供了到达根文件系统所需的一组驱动程序。

如果没有这个,你需要拥有访问内核内置的根文件系统所需的所有驱动程序。