我使用以下命令创建了一个图像文件:
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
将菜单项选项中以 linux 开头的行中的根值更改为 /dev/loopXX (我遇到了相同的错误)。
将菜单项选项中以 linux 开头的行中的 root 值更改为 /dev/sda1 (在本例中,消息相同,但块为
(8,1)
)。
任何人都可以告诉我我能做些什么来解决这个问题?
答案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
并且内核理解该分区,但无法找到这样的分区。这些数字是指设备节点的主设备号和次设备号:
ls -l /dev/sda1
brw-rw---- 1 root disk 8, 1 May 4 07:56 /dev/sda1
^^^^^
第一个错误在这里:
cfdisk linux.img
mkfs.ext4 linux.img
这表明您首先创建了一个分区表(具有未指定数量的未知类型的分区),然后覆盖分区表通过将整个映像初始化为单个ext4
文件系统。
因此,根本不会有分区:在 GRUB 术语中,不会有(hd0,0)
或(hd0,1)
或(hd0,2)
,只有(hd0)
。 MBR 分区表和嵌入 GRUB 核心映像的第一个分区的开头之间也不会有任何未分配的空间,因此您在安装 GRUB 时可能会看到一些警告。安装人员可能会通过恢复到现在的旧安装方式来适应这种情况严重地灰心。
为了创建整个磁盘映像,我建议执行以下过程:
dd if=/dev/zero of=linux.img bs=16M count=1024
cfdisk linux.img
losetup -P /dev/loop0 linux.img
ls /dev/loop0* #you should see loop0 and the first partition as loop0p1
mkfs.ext4 /dev/loop0pX # replace X with partition number
mkswap /dev/loop0pY # if you created a swap partition, use this for it and replace Y
... # LFS 11.3 chapter 2.6 and the 1st command of chapter 2.7
mount -v -t ext4 /dev/loop0pX $LFS # the 2nd command of LFS 11.3 chapter 2.7
... # continue according to the book
现在,在grub.cfg
文件中,set root=
条目应该采用以下形式,(hd0,<X-1>)
因为 Linux 从 1 开始计数分区,但 GRUB 从 0 开始计数。因此,如果您用于/dev/loop0p1
分区ext4
,请使用set root=(hd0,0)
GRUB。
另外,在线上linux
,root=/dev/hda1
指的是旧的已弃用的非libata
驱动程序,适用于过时的 PATA 磁盘控制器。大多数现代 Linux 磁盘控制器驱动程序现在都使用/dev/sdXN
样式名称。因此,即使您可能已经使用/dev/loop0p1
LFS 映像创建了 ext4 文件系统,一旦该映像在 QEMU VM 中呈现为虚拟硬盘,内核就会为其命名,/dev/sda1
除非您在内核配置中做出了一些奇怪的选择并使用了不同的 QEMU选项。所以你的最后一行grub.cfg
应该是:
linux /boot/vmlinuz-6.1.11-lfs-11.3 root=/dev/sda1 ro
(对于你目前准备不当的情况linux.img
,你可以尝试root=/dev/sda
一下,只是为了好玩;它可能有效,也可能无效。)