我用这个命令创建了一个图像文件:
dd if=/dev/zero of=linux.img bs=16M count=1024
cfdisk linux.img
mkfs.ext4 linux.img
并按照 Linux From Scratch 11.3 一书的说明安装了 linux 系统。我可以通过 chroot 访问这个系统,但是当我尝试使用这个命令运行它时:
qemu-system-x86_64 -hda linux.img -vga std -m 4G
系统的初始化被这个问题标题中描述的错误中断。我的文件/boot/grub/grub.cfg
如下所示:
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5
insmod ext4
#set root=(hd0,2)
menuentry "GNU/Linux, Linux 6.1.11-lfs-11.3" {
linux /boot/vmlinuz-6.1.11-lfs-11.3 root=/dev/hda1 ro
我试过的:
在 grub 启动屏幕后取消注释行
set root=(hd0,2)' and trying the values
hd0,0or
hd0,1 hd0,X not found`。(the system not even initialize with this, and I got the error
将 menuentry 选项中以 linux 开头的行中的根值更改为 /dev/loopXX(我遇到了同样的错误)。
将 menuentry 选项中以 linux 开头的行中的根值更改为 /dev/sda1(在本例中,消息相同,但块为
(8,1)
)。
任何人都可以告诉我我能做些什么来解决这个问题?
错误消息
hd0,X not found
来自 GRUB,表明 GRUB 配置文件有错误,指向不存在或 GRUB 不可读的分区。名义上的错误消息
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
意味着您通过 GRUB 进入了 Linux 内核,但是内核找不到为根文件系统指定的设备,即您缺少应该包含在内核中的驱动程序(或 initramfs,如果您使用那...但 LFS 没有),或者您的root=/dev/...
内核引导选项不正确。更具体地说,
unknown-block(0,0)
意味着内核不知道你的根文件系统应该在哪个块设备上;unknown-block(8,1)
表示您指定/dev/sda1
并且内核理解但无法找到这样的分区。数字是指设备节点的主要和次要编号:第一个错误会在这里:
这建议您首先创建一个分区表(具有未指定数量的未知类型的分区),然后通过将整个映像初始化为单个文件系统来覆盖分区表
ext4
。因此,根本不会有分区:在 GRUB 术语中,不会有
(hd0,0)
nor(hd0,1)
nor(hd0,2)
,只有(hd0)
. 在 MBR 分区表和第一个嵌入 GRUB 核心映像的分区的开头之间也不会有任何未分配的空间,因此您在安装 GRUB 时可能已经看到了一些警告。安装程序可能已经通过回退到现在严重不鼓励的旧安装风格来适应这种情况。为了创建整个磁盘映像,我建议改为使用以下过程:
现在,在
grub.cfg
文件中,set root=
条目应该是这样的形式(hd0,<X-1>)
,因为 Linux 从 1 开始计算分区,但 GRUB 从 0 开始计算它们。因此,如果您用于/dev/loop0p1
分区ext4
,请使用set root=(hd0,0)
GRUB。此外,在线上
linux
,指的是陈旧的 PATA 磁盘控制器的root=/dev/hda1
旧的已弃用的非驱动程序。libata
大多数现代 Linux 磁盘控制器驱动程序现在都使用/dev/sdXN
样式名称。因此,即使您可能已经习惯于/dev/loop0p1
创建 LFS 映像的 ext4 文件系统,一旦该映像在 QEMU VM 中显示为虚拟硬盘,内核就会为其命名,/dev/sda1
除非您在内核配置中做出了一些奇怪的选择并使用了不同的 QEMU选项。所以你的最后一行grub.cfg
应该是:(对于您当前准备不当的
linux.img
,您可以试试root=/dev/sda
,只是为了好玩;它可能会或可能不会工作。)