为什么需要 initramfs 和 initrd

为什么需要 initramfs 和 initrd

例如,我们的磁盘上有外来文件系统,为了加载系统,我们需要挂载根文件系统。但我们不能,因为内核映像中不存在合适的驱动程序。

让我解释一下我是如何理解kernel和的initrd

  1. 编译内核时,我们可以选择要包含到内核映像中的不同模块(一个文件)
  2. 例如,我的根文件系统是,reiserfs并且我已配置内核不包含module该文件系统
  3. 在这种情况下,内核不知道如何挂载此类文件系统,它需要一些帮助 -> 因此加载initramfs到内存中
  4. 在 ram fs 中找到合适的模块(lib/modules 等)
  5. 将此模块加载到内核
  6. 现在内核可以挂载reiserfs它,然后卸载(释放)占用的内存ramfs

我对吗 ?

但我不明白为什么我们需要initramfs在每个发行版中(我在我安装过的每个发行版中都看到过它)如果大多数特定驱动程序已经存在于内核映像(单个文件)中,而且我们只需要内核时文件系统的驱动程序引导其他驱动程序可以在安装后从文件系统加载。

那么它真的是任何发行版的重要组成部分吗?

PS 什么最常用initramfsinitrd为什么?

答案1

力量来自于除了加载模块之外你可以做的所有其他事情。基本上,它为您提供了一个用户空间以及执行所有您可以执行的操作的可能性。

一个例子:我使用 initrd 来拥有加密的根文件系统,设置它需要内核中没有意义的代码。

的“基本原理”部分有关 initrd 的维基百科页面有更多的例子。

initramfs 是同一想法的较新(但仍然相当古老)的实现,但 initrd 这个名称经常被用来指代用作早期用户空间的映像。

我刚刚想到的一个完全不同的原因:嵌入式设备,它们可能没有足够的内存来应对包含所有内容的内核。

答案2

拥有 initramfs 的原因有很多,如下所示。

  1. 当您需要单独的 /usr、/var 时,因为某些发行版取决于 / 中的这些目录
  2. 当您想要加密 / 但您希望将 /boot 放在 U 盘上时,因为您无法拥有加密的 /boot
  3. 当您不想在内核内置内容而是作为模块时,这样您只加载您需要的内容,并且这是在早期用户空间中完成的
  4. 在 / 上使用 dmraid 时
  5. 当您需要更精细的控制时,即您有一个已加密的远程服务器/现在需要它在早期用户空间中设置一个网络以及dropbear(小型ssh守护进程),以允许您解密/并继续正常启动; )

我可以继续解释为什么你需要一个 initramfs,但最后如果有软件需要在“switch_root ...”之前运行,你将需要一个 initramfs。

答案3

我想这是真的现代的硬件不会介意例如 50MB 的内核。您可能会争辩说,将所有内容加载为单独的模块现在已经不再那么重要了。

然而,初始 RAM 系统允许引导任何可能的配置,而不需要在内核中进行任何特殊处理。编写内核代码是一件大事。最初的内存系统是正确的解决方案。我们可以使用许多与主系统类似的代码,例如systemd;-)。

从加密文件系统启动就是一个很好的例子。内核不必提示输入密码。

一个例子每一个现代安装使用的是通过 UUID(或者可能是 LVM 卷名称)查找根文件系统。这很有用,因为否则当您删除不相关的分区时,您的引导会中断,因为它们都被重新编号。或者当您在计算机之间或计算机之间移动磁盘时。或者当磁盘是 Live CD 时。

为什么我们需要 ram 文件系统?因为我们不想与固件/引导加载程序紧密耦合。它只需将数据作为内存块交给我们,我们就完成了。我们希望使启动过程尽可能简单。启动既重要又是一种特殊情况。我们不需要复杂的接口其他特殊情况软件。 尤其固件案例。固件是一种特殊情况,所以我们在其余时间不会关心它,它会充满没有人注意到的错误。而且固件非常重要,任何修复它的风险都非常大。以前是ROM,根本没法打补丁。

相关内容