同一内核版本的两次编译:一次启动,一次无法找到根设备

同一内核版本的两次编译:一次启动,一次无法找到根设备

我有两个相同内核版本的编译(4.0.5+gentoo 补丁)。一种可以正确引导,但缺少几个内核 CONFIG 标志。

添加这些标志并运行make all && make install会给我一个“无法找到根设备/dev/sda4”错误。

我有一个沼泽标准/etc/fstab

/dev/sda1               /boot           ext2         noauto,noatime,discard  0 2
/dev/sda4               /               ext4         noatime,discard         0 1
/dev/sda3               none            swap            sw              0 0
/dev/cdrom              /mnt/cdrom      auto            noauto,ro       0 0
/dev/fd0                /mnt/floppy     auto            noauto          0 0

对 Google 的检查表明,这是由于 initramfs 中的某些配置造成的,这很有趣(而且据我所知很难调试!)。

我使用 Grub 1 并进行以下配置:

title Gentoo Linux 4.0.5 - no docker, has X.
root (hd0,0)
kernel /boot/vmlinuz-4.0.5-gentoo-x root=/dev/sda4 rootfstype=ext4
initrd /boot/initramfs-genkernel-x86_64-4.0.5-gentoo

title Gentoo Linux 4.0.5 - latest build.
root (hd0,0)
kernel /boot/vmlinuz-4.0.5-gentoo root=/dev/sda4 rootfstype=ext4
initrd /boot/initramfs-genkernel-x86_64-4.0.5-gentoo

请注意,第一个条目是引导构建,第二个条目是非引导构建。

我的怀疑是内核+ initramfs 有二进制匹配要求,新版本更改了二进制位置,导致固件无法加载。

如果有人有一些有关 kernels/initramfs/root 设备交互的权威文档的链接或权威答案,我们将不胜感激。

编辑:花一些时间研究这个,事实证明这UUID=<uuid>也没有帮助。然而,似乎在功能失调的启动中,进入 initramfs shell 表明它/dev/sda<1-4>不存在(这就是我试图找到的)。嗯。

答案1

您似乎对两个内核使用相同的 initramfs。 initramfs 包含可能需要从那里加载的内核模块,并且根据内核配置的差异,这可能会也可能不会成为问题。

一般来说,我认为只有当两个内核是在同一源代码树中生成的,并且模块在第二次内核编译时没有重新编译时,它们才是“兼容的”。因此,启用附加模块(不会导致现有模块重新编译)会导致“兼容”内核,而更改 CONFIG 标志会导致现有模块重新编译,从而导致“不兼容”内核。在不兼容的内核之间混合模块可能会出现问题。因此,您需要为不兼容的内核配置更改生成新的 initramfs。另外,在同一台机器上同时安装两个具有相同版本字符串的不兼容内核可能会给您带来问题,就像/lib/modules/<version>两个内核的模块位于一个位置一样 - 但您可以仅将其中一个的模块放在那里...您可以在内核树的根 Makefile 中添加一个字符串,EXTRAVERSION=以使您的内核版本字符串唯一。

相关内容