0

我正在虚拟机中构建 LFS(Linux From Scratch)系统,到目前为止,我已经设法获得了一个可行的桌面系统,从已知设备启动,在我的例子中是 /dev/sda1。我现在正在尝试制作一个从 ISO 映像引导的实时系统。而不是使用我已经建立的 /dev/sr0 作为根是可能的(而且,因为它更有可能从 USB 记忆棒中使用而不是实际的 CD-ROM,所以太不灵活了)我已经下定决心在将其引导到 initrd 根目录时。这个想法是使用它作为系统的根而不是用它作为临时根来加载“真正的”根,并且由于它已经在内存中,它省去了设置 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:

没有显示分区,然后是“内核恐慌”消息,只是重复第一行。如果我使用“rootfstype=ramfs”,我会得到:

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

本质上,它将 EMPTY ramfs 文件系统挂载为 root,因此挂载 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归档。

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

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

4

1 回答 1

0

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

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

于 2018-12-02T17:59:44.927 回答