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

时间:2018-11-30 21:26:38

标签: linux lfs grub2 initrd

我正在VM中构建一个LFS(Linux从零开始)系统,到目前为止,我已经设法获得了一个可行的桌面系统,从已知的设备/ dev / sda1启动。我现在正在尝试制作一个从ISO映像启动的实时系统。我已经设定了主意,而不是使用/ dev / sr0作为我已经建立的根(并且,由于它比实际的CD-ROM更可能通过USB记忆棒使用,因此太不灵活了),我已经下定决心在启动它到一个initrd根目录。想法是将其用作系统的根目录,而不是将其用作临时根目录来加载“实际”根目录,并且由于它已经在内存中,因此省去了设置tmpfs根目录,复制所有文件,并切换到它。

我以前一直在尝试squashfs映像,因为我发现Ubuntu似乎使用了该映像并且具有我所需要的:较小的root,加载速度更快,使用的内存更少,而且速度很快(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:

未显示任何分区,其后是“内核崩溃”消息,仅重复第一行。如果我使用“ 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根cpio归档文件。

Here's是我内核的.config文件(抱歉,无法将其粘贴到此处)。

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

1 个答案:

答案 0 :(得分:0)

好的,我设法解决了这个问题!显然,它不是内核的配置,GRUB2,甚至不是启动顺序。它是initrd存档本身。深入了解Linux内核配置的谎言:归档文件必须使用cpio的--newc选项构建。我手动构建的程序缺少此选项,因此内核会忽略存档,而只是继续执行正常的引导过程。

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