所以我已经研究这个问题有一段时间了,几天来一直在寻找答案,并且认为是时候寻求帮助了。我在 VMWare Fusion 中运行 Ubuntu 10.10,并下载了 3.2 内核的副本并使用所有默认设置构建它。当我在调用 make install 后尝试引导到新内核时,收到以下消息:
[ 1.581916] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[ 1.582260] Pid: 1, comm: swapper/0 Not tainted 3.2.4 #1
[ 1.582444] Call Trace:
[ 1.582552] [<ffffffff815e7447>] panic+0x91/0x1a7
[ 1.582666] [<ffffffff815e75c5>] ? printk+0x68/0x6b
[ 1.582799] [<ffffffff81ad2152>] mount_block_root+0x1ea/0x29e
[ 1.582929] [<ffffffff81ad225c>] mount_root+0x56/0x5a
[ 1.583047] [<ffffffff81ad23d0>] prepare_namespace+0x170/0x1a9
[ 1.583178] [<ffffffff81ad16f7>] kernel_init+0x144/0x153
[ 1.583304] [<ffffffff815f45f4>] kernel_thread_helper+0x4/0x10
[ 1.583436] [<ffffffff81ad15b3>] ? parse_early_options+0x20/0x20
[ 1.583570] [<ffffffff815f45f0>] ? gs_change+0x13/0x13
过去每次重新启动时都会出现。我发现如果我更改了虚拟机的硬盘驱动器类型,我至少可以让 GRUB 启动,但是如果我尝试加载新编译的内核,则会出现上面的消息。旧内核像以前一样工作。我已经检查并编译了对 ext4 的支持,这是我的 root 正在运行的文件系统。我还尝试通过调用“sudo update-initramfs -c -k 3.2.4”来生成 initrd 文件,但无济于事。
我认为编译是相当标准的:
make menuconfig
make
make modules_install
make install
update-grub
reboot
是一般步骤。在选项方面,我基本上都采用了默认值。如果相关的话,我的 fstab 看起来像这样:
proc /proc proc nodev,noexec,nosuid 0 0
#UUID=c75eddd9-f4fa-49be-927b-8c2da7074135 / ext4 errors=remount-ro 0 1
/dev/sda1 / ext4 defaults 0 1
#UUID=5bc6915e-fdfa-479a-885f-ea03cb14f9cd none swap sw 0 0
/dev/sda5 none swap sw 0 0
/dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0
我用 UUID 和 /dev/sd* 表示法尝试过。任何帮助或建议将不胜感激,因为它变得非常令人沮丧。
谢谢。
答案1
您忘记构建与内核一起使用的 initrd。运行update-initramfs -c -k kernelversion
然后update-grub
找到它并将其添加到 grub 菜单中。
答案2
您是否内置了挂载根分区所需的所有驱动程序?我的意思是,I/O 控制器驱动程序、文件系统驱动程序等等?
该错误的含义是,内核无法挂载根文件系统。
我不记得到底应该unknown block
是什么,但我猜这意味着它缺少 I/O 控制器驱动程序。
请注意,驱动程序必须内置到内核中,模块将无法工作(因为您需要安装文件系统才能访问模块)。