我如何获得由 grub2 以与发行版无关的方式加载为根设备的 cpio 归档文件制成的 initrd?

How do I get an initrd made out of a cpio archive loaded as the root device by grub2 in a distro-agnostic way?

我正在 VM 中构建 LFS(Linux 从头开始​​)系统,到目前为止,我已经设法获得了一个可用的桌面系统,从已知设备启动,/dev/sda1就我而言。我现在正在尝试制作一个从 ISO 映像启动的实时系统。而不是使用 /dev/sr0 作为根,我已经建立了它是可能的(而且,因为它更有可能从 USB 记忆棒而不是实际的 CD-ROM 使用,太不灵活了)我设置了我的介意将其引导到 initrd root 中。这个想法是将它用作系统的根而不是将它用作临时根来加载 "real" 根,并且由于它已经在内存中,它省去了我设置 tmpfs 根的麻烦,复制所有文件,然后切换到它。

我之前一直在试验 squashfs 图像,因为我看到 Ubuntu 似乎使用它并且拥有我需要的东西:一个小尺寸的根,加载速度更快,使用更少的内存,并且速度很快(xz 是 SSLLOOWW 来提取,而 gzip 加载速度很慢)。起初我无法启动它,所以我切换到基于 cpio 的 initrd。由于存档中缺少文件而导致一些初始问题后,我确实设法启动了它。

我暂时(大约一个月前)将其搁置一旁,以便在系统上执行其他任务。我丢失了原始的 GRUB2 设置和内核配置,所以再次尝试这样做,但我 运行 遇到了麻烦。我希望这里有人可能知道我错过了什么。

当我启动时,我从来没有看到任何关于加载 initrd 文件的消息,它直接进入内核的加载、解压缩和启动。这最终导致消息

出现内核恐慌
VFS: cannot open root device "(null)" or unknown-block (1,0): error -6
Please append the correct "root=" boot option; here are the available partitions:

未显示任何分区,紧随其后的是 "kernel panic" 消息,只是重复第一行。如果我使用 "rootfstype=ramfs" 我得到:

VFS: mounted root (ramfs filesystem) readonly on device 0:15.
devtmpfs: error mounting -2

本质上,它是以 root 身份挂载 EMPTY ramfs 文件系统,因此挂载 devtmpfs 失败,因为 /dev 条目不存在。但可以肯定的是,我以前使用过该启动选项。

这是我的 GRUB 2 配置:

menuentry = "LFS (inird test)" {
        linux   /boot/kernel/initrd/linux ro rdinit=/etc/init
        initrd  /boot/kernel/initrd/root.cpio.gz
}

是的,/boot/kernel/initrd/目录项存在,linux是内核(编译内核产生的bzimage文件),root.cpio.gz是我压缩的initrd root cpio archive。

Here's 我内核的 .config 文件(抱歉不能粘贴到这里)。

如果需要更多信息,请随时询问。那个你。

好的,我成功解决了问题!显然,这不是内核的配置、GRUB2,甚至不是启动顺序。它是 initrd 档案本身。在 Linux 内核配置的深处隐藏着答案:存档必须使用 cpio 的 --newc 选项构建。我手动构建的那个没有这个选项,所以内核忽略了存档,只是继续正常的启动过程。

这是因为我偶然发现了一个我用来构建它们的旧脚本,并在其中看到了 cpio 的所有选项。我检查了我匆忙放在一起的更新的脚本并仔细检查了内核文档(以及 init/do_mounts.c 和 init/initramfs.c 文件)并意识到发生了什么。我尝试了更正,系统现在可以毫无问题地愉快地启动到 initrd! :D