Gentoo 安装后内核崩溃——无法打开根设备

Gentoo 安装后内核崩溃——无法打开根设备

/dev/sda1我在( /) 和/dev/sda2(扩展、/dev/sda5/home、是交换)上有一个 Debian 系统/dev/sda6。我想并行安装 Gentoo,所以我缩小了 sda2 并创建了/dev/sda3,在其中安装了 Gentoo,并且/dev/sda4,作为 Gentoo 的/home

Disk /dev/sda: 931.5 GiB, 1000204885504 bytes, 1953525167 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xeb362e8f

Device     Boot      Start        End    Sectors   Size Id Type
/dev/sda1  *          2048   29296639   29294592    14G 83 Linux
/dev/sda2         29298686 1673951231 1644652546 784.2G  5 Extended
/dev/sda3       1673951232 1735391231   61440000  29.3G 83 Linux
/dev/sda4       1735391232 1953523711  218132480   104G 83 Linux
/dev/sda5         29298688   35547135    6248448     3G 82 Linux swap / Solaris
/dev/sda6         35549184 1673949183 1638400000 781.3G 83 Linux

Partition table entries are not in disk order.

我跳过了 Gentoo 手册中的“bootloader”部分,因为我想使用当前安装的 grub2 /dev/sda1,所以在完成安装后,我启动到 Debian 并运行update-grub,这成功地将 Gentoo 添加到菜单中。但是,当启动到它时,我收到内核恐慌和一条有关无法打开根设备的消息:

内核恐慌消息的图片

系统表对于 Debian 和系统表对于 Gentoo 来说。我尝试编辑 Gentoo 的 fstab 以使用像 Debian 一样的 UUID,但没有成功。我还尝试在 grub 中编辑 Gentoo 的启动选项。原来的:

### BEGIN /etc/grub.d/30_os-prober ###
menuentry 'Gentoo Base System release 2.2 (on /dev/sda3)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-1c46e4aa-e486-48ba-8f61-1484ed899e1e' {
        insmod part_msdos
        insmod ext2
        set root='hd0,msdos3'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-ieee1275='ieee1275//sas/disk@0,msdos3' --hint-bios=hd0,msdos3 --hint-efi=hd0,msdos3 --hint-baremetal=ahci0,msdos3  1c46e4aa-e486-48ba-8f61-1484ed899e1e
        else
          search --no-floppy --fs-uuid --set=root 1c46e4aa-e486-48ba-8f61-1484ed899e1e
        fi
        linux /boot/vmlinuz-4.1.12-gentoo root=/dev/sda3
}
submenu 'Advanced options for Gentoo Base System release 2.2 (on /dev/sda3)' $menuentry_id_option 'osprober-gnulinux-advanced-1c46e4aa-e486-48ba-8f61-1484ed899e1e' {
        menuentry 'Gentoo Base System release 2.2 (on /dev/sda3)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.1.12-gentoo--1c46e4aa-e486-48ba-8f61-1484ed899e1e' {
                insmod part_msdos
                insmod ext2
                set root='hd0,msdos3'
                if [ x$feature_platform_search_hint = xy ]; then
                  search --no-floppy --fs-uuid --set=root --hint-ieee1275='ieee1275//sas/disk@0,msdos3' --hint-bios=hd0,msdos3 --hint-efi=hd0,msdos3 --hint-baremetal=ahci0,msdos3  1c46e4aa-e486-48ba-8f61-1484ed899e1e
                else
                  search --no-floppy --fs-uuid --set=root 1c46e4aa-e486-48ba-8f61-1484ed899e1e
                fi
                linux /boot/vmlinuz-4.1.12-gentoo root=/dev/sda3
        }
}

### END /etc/grub.d/30_os-prober ###

我尝试使用set root="/dev/sda3"set root="sda3"但老实说我不知道​​这意味着什么,它似乎与恐慌消息有关。那么这里发生了什么以及我应该如何进行?值得一提的是,我是从通过 USB 插入的外部硬盘 ( /dev/sda) 启动的(我的内部硬盘坏了)。 Gentoo 安装没有任何错误/警告,我不认为我忘记将任何内容编译到内核中,但我想这是可能的......我很确定包含了 ext4、SCSI 和 USB 支持(不是作为模块)。

答案1

看来您没有将 SATA 驱动程序编译到 Gentoo 内核中(或编译为模块)。我关心的那行大约是您所附屏幕截图的一半,其中写着:

请附加正确的“root=”选项;以下是可用的分区:

但没有列出可用的分区。对我来说,Gentoo 根本无法与物理磁盘通信。如果您不知道哪种 SATA 控制器,您可以通过lshw在 Debian 中运行来查找。这不仅会告诉你该卡是什么,还会告诉你它正在使用什么内核驱动程序(在 SATA 部分下查找“configuration: driver=”行),这样你就可以将它添加到你的 Gentoo 内核中。

答案2

正如 David King 所说,罪魁祸首很可能是缺少内核驱动程序。 以下是使 USB 大容量存储正常工作所需的内核选项列表。 尝试从 gentoo livecd chroot 进入 gentoo 系统(您可能知道 Gentoo 手册对此进行了详细描述)。在那里你可以重新配置和重新编译内核(Gentoo 手册中也有很好的描述)。如果您创建了 initramfs,请不要忘记重新创建它,否则新编译的内核和驱动程序将在启动时不可用。

答案3

查看您的内核配置,看起来您启用了现代系统在没有 initrd 的情况下启动所需的所有功能,但您使用的是较旧的计算机;我注意到在你的lshw输出中你有一个 ISA 桥和一个 Pentium M 1.4 CPU。

我的猜测是您缺少像 CONFIG_PATA_MPIIX 或 ATA_GENERIC 或 PATA_LEGACY 这样的 PATA 选项,但我不会玩猜测游戏,而是这样做:

插入 USB 驱动器启动您的 debian 系统。
lsmod
看看您还需要添加什么到您的内核配置 (=y) 才能让它运行,或者发布输出,也许我们可以给您一些提示。

或者使用这个网站,http://kmuto.jp/debian/hcl/,并粘贴结果:
lspci -n

以下是我通常在 Gentoo 中配置内核的方式:

  1. 启动 ArchLinux USB 和 lsmod
  2. 从 Slackware 复制最新的内核配置,例如 http://mirrors4.kernel.org/slackware/slackware64-current/source/k/config-x86_64/config-generic-4.1.15.x64

    Slackware 与 Gentoo 类似两者都不使用 systemd(Gentoo 默认情况下不使用),他们使用长期发行的内核版本,而且我对他们的配置很满意。 Generic 是将他们认为您需要的所有内容构建为 =y 并将可选内容构建为 =m,巨大将所有内容构建为 =y (这几乎保证可以工作,但会给您一个非常臃肿的内核)。
  3. 制作旧配置
  4. 设置 EXT4=y 和任何其他文件系统模块(由于某种原因 Slackware 并不总是启用它)。
  5. 确保您已将 Gentoo 内核配置指南中的模块设置为 =y
  6. 通过 lsmod =y 设置除 ALSA 和 Wifi 模块之外的任何模块。
  7. 在处理器类型和功能 -> 处理器系列中选择正确的处理器类型
  8. 完成安装。

如果仍然不起作用,我猜测驱动器在 Debian 中正在抓取 /dev/sda,但在 Gentoo 中则抓取其他内容(可能是 /dev/sdb)。解决此问题的最简单方法是在 /etc/fstab 中使用 UUID= 并在传递给内核的引导加载程序参数中使用 PARTUUID= 。您可以从 blkid 输出中找到 PARTUUID。

答案4

几年来,USB 设备发现一直是异步过程。虽然您可能已经编译了所有驱动程序,并且您的屏幕截图确实显示了您的 USB 存储设备正在被枚举,但我怀疑内核正在尝试在 USB 大容量存储驱动程序完成初始化之前挂载根文件系统。

您的 grub 配置似乎没有指定加载 initramfs。

虽然我无法就 gentoo 的具体情况向您提供建议,但我希望我使用的 Debian 系统足够相似,可以帮助您找到正确的答案。在 Debian 中,initramfs 脚本将停止启动过程,直到可以安装必要的块设备为止。

据我所知,在 Debian 中,核心 initramfs 脚本之一 /scripts/local 具有启动 udev 并等待枚举根设备所需的逻辑。具体来说,我指的是 local_device_setup() 函数;看这里

我想gentoo有一些类似的系统?

相关内容