![无法在 gentoo 上启动:GRUB2 - xfs - NVME SSD](https://linux22.com/image/154639/%E6%97%A0%E6%B3%95%E5%9C%A8%20gentoo%20%E4%B8%8A%E5%90%AF%E5%8A%A8%EF%BC%9AGRUB2%20-%20xfs%20-%20NVME%20SSD.png)
我目前正在一台使用 NVME 500Gb SSD 的新机器上配置 gentoo。
我重新启动计算机,选择要启动的磁盘,grub2 初始化,进而,我得到的错误如下:
!!Block device UUID="9a89bdb4-8f36-4aa6-a4c7-831943b0985c" is not a valid root device...
!!Could not find the root block device in UUID="9a89bdb4-8f36-4aa6-a4c7-831943b0985c"
Please specify another value or: Press Enter for the same, type "shell" for a shell, or q to skip..."
root block device() ::
这是我当前的分区方案:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 465.8G 0 disk
├─nvme0n1p1 259:1 0 2M 0 part /boot/efi
├─nvme0n1p2 259:2 0 128M 0 part /boot
├─nvme0n1p3 259:3 0 5G 0 part [SWAP]
├─nvme0n1p4 259:4 0 200G 0 part /
└─nvme0n1p5 259:5 0 260.6G 0 part /home
这是我的块:
/dev/nvme0n1p1: SEC_TYPE="msdos" UUID="DC09-2FD7" TYPE="vfat" PARTLABEL="grub" PARTUUID="2d5991fd-18ac-1148-a4d8-deb02f744ecb"
/dev/nvme0n1p2: UUID="6070-07C6" TYPE="vfat" PARTLABEL="boot" PARTUUID="5dba49e5-03cc-744e-bd47-a7570e83b08c"
/dev/nvme0n1p3: UUID="db229aaf-ddb4-4a86-8075-e7f035bfbf19" TYPE="swap" PARTLABEL="swap" PARTUUID="fdc303cc-e54e-c049-899a-e26286b5ec47"
/dev/nvme0n1p4: UUID="9a89bdb4-8f36-4aa6-a4c7-831943b0985c" TYPE="xfs" PARTLABEL="root" PARTUUID="da6232eb-58ab-9948-a3f6-8a7f14eebde4"
/dev/nvme0n1p5: UUID="e3237966-1b71-44b3-9d96-1ed7cc6f4d84" TYPE="xfs" PARTLABEL="home" PARTUUID="5b294354-fc3b-3148-bba2-418acfbb32bc"
这是我的配置的一部分/etc/default/grub
GRUB_CMDLINE_LINUX="rootfstype=xfs init=/usr/lib/systemd/systemd"
这是我的/boot/grub/grub.cfg
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
load_env
fi
if [ "${next_entry}" ] ; then
set default="${next_entry}"
set next_entry=
save_env next_entry
set boot_once=true
else
set default="0"
fi
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
else
menuentry_id_option=""
fi
export menuentry_id_option
if [ "${prev_saved_entry}" ]; then
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi
function savedefault {
if [ -z "${boot_once}" ]; then
saved_entry="${chosen}"
save_env saved_entry
fi
}
function load_video {
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}
if [ x$feature_default_font_path = xy ] ; then
font=unicode
else
insmod part_gpt
insmod xfs
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 9a89bdb4-8f36-4aa6-a4c7-831943b0985c
else
search --no-floppy --fs-uuid --set=root 9a89bdb4-8f36-4aa6-a4c7-831943b0985c
fi
font="/usr/share/grub/unicode.pf2"
fi
if loadfont $font ; then
set gfxmode=auto
load_video
insmod gfxterm
set locale_dir=$prefix/locale
set lang=en_CA
insmod gettext
fi
terminal_output gfxterm
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=menu
set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
set timeout=5
fi
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/10_linux ###
menuentry 'Gentoo GNU/Linux' --class gentoo --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-9a89bdb4-8f36-4aa6-a4c7-831943b0985c' {
load_video
if [ "x$grub_platform" = xefi ]; then
set gfxpayload=keep
fi
insmod gzio
insmod part_gpt
insmod fat
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 6070-07C6
else
search --no-floppy --fs-uuid --set=root 6070-07C6
fi
echo 'Loading Linux x86_64-4.19.44-gentoo ...'
linux /kernel-genkernel-x86_64-4.19.44-gentoo root=/dev/nvme0n1p4 ro rootfstype=xfs init=/usr/lib/systemd/systemd
echo 'Loading initial ramdisk ...'
initrd /initramfs-genkernel-x86_64-4.19.44-gentoo
}
submenu 'Advanced options for Gentoo GNU/Linux' $menuentry_id_option 'gnulinux-advanced-9a89bdb4-8f36-4aa6-a4c7-831943b0985c' {
menuentry 'Gentoo GNU/Linux, with Linux x86_64-4.19.44-gentoo' --class gentoo --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-x86_64-4.19.44-gentoo-advanced-9a89bdb4-8f36-4aa6-a4c7-831943b0985c' {
load_video
if [ "x$grub_platform" = xefi ]; then
set gfxpayload=keep
fi
insmod gzio
insmod part_gpt
insmod fat
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 6070-07C6
else
search --no-floppy --fs-uuid --set=root 6070-07C6
fi
echo 'Loading Linux x86_64-4.19.44-gentoo ...'
linux /kernel-genkernel-x86_64-4.19.44-gentoo root=/dev/nvme0n1p4 ro rootfstype=xfs init=/usr/lib/systemd/systemd
echo 'Loading initial ramdisk ...'
initrd /initramfs-genkernel-x86_64-4.19.44-gentoo
}
menuentry 'Gentoo GNU/Linux, with Linux x86_64-4.19.44-gentoo (recovery mode)' --class gentoo --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-x86_64-4.19.44-gentoo-recovery-9a89bdb4-8f36-4aa6-a4c7-831943b0985c' {
load_video
if [ "x$grub_platform" = xefi ]; then
set gfxpayload=keep
fi
insmod gzio
insmod part_gpt
insmod fat
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 6070-07C6
else
search --no-floppy --fs-uuid --set=root 6070-07C6
fi
echo 'Loading Linux x86_64-4.19.44-gentoo ...'
linux /kernel-genkernel-x86_64-4.19.44-gentoo root=/dev/nvme0n1p4 ro single rootfstype=xfs init=/usr/lib/systemd/systemd
echo 'Loading initial ramdisk ...'
initrd /initramfs-genkernel-x86_64-4.19.44-gentoo
}
menuentry 'Gentoo GNU/Linux, with Linux 4.19.44-gentoo' --class gentoo --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.19.44-gentoo-advanced-9a89bdb4-8f36-4aa6-a4c7-831943b0985c' {
load_video
if [ "x$grub_platform" = xefi ]; then
set gfxpayload=keep
fi
insmod gzio
insmod part_gpt
insmod fat
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 6070-07C6
else
search --no-floppy --fs-uuid --set=root 6070-07C6
fi
echo 'Loading Linux 4.19.44-gentoo ...'
linux /vmlinuz-4.19.44-gentoo root=/dev/nvme0n1p4 ro rootfstype=xfs init=/usr/lib/systemd/systemd
echo 'Loading initial ramdisk ...'
initrd /initramfs-genkernel-x86_64-4.19.44-gentoo
}
menuentry 'Gentoo GNU/Linux, with Linux 4.19.44-gentoo (recovery mode)' --class gentoo --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.19.44-gentoo-recovery-9a89bdb4-8f36-4aa6-a4c7-831943b0985c' {
load_video
if [ "x$grub_platform" = xefi ]; then
set gfxpayload=keep
fi
insmod gzio
insmod part_gpt
insmod fat
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 6070-07C6
else
search --no-floppy --fs-uuid --set=root 6070-07C6
fi
echo 'Loading Linux 4.19.44-gentoo ...'
linux /vmlinuz-4.19.44-gentoo root=/dev/nvme0n1p4 ro single rootfstype=xfs init=/usr/lib/systemd/systemd
echo 'Loading initial ramdisk ...'
initrd /initramfs-genkernel-x86_64-4.19.44-gentoo
}
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###
### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###
### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###
### BEGIN /etc/grub.d/41_custom ###
if [ -f ${config_directory}/custom.cfg ]; then
source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then
source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
最后,这是我的内容etc/fstab
:
# /etc/fstab: static file system information.
#
# noatime turns off atimes for increased performance (atimes normally aren't
# needed); notail increases performance of ReiserFS (at the expense of storage
# efficiency). It's safe to drop the noatime options if you want and to
# switch between notail / tail freely.
#
# The root filesystem should have a pass number of either 0 or 1.
# All other filesystems should have a pass number of 0 or greater than 1.
#
# See the manpage fstab(5) for more information.
#
# <fs> <mountpoint> <type> <opts> <dump/pass>
# NOTE: If your BOOT partition is ReiserFS, add the notail option to opts.
#
# NOTE: Even though we list ext4 as the type here, it will work with ext2/ext3
# filesystems. This just tells the kernel to use the ext4 driver.
#
# NOTE: You can use full paths to devices like /dev/sda3, but it is often
# more reliable to use filesystem labels or UUIDs. See your filesystem
# documentation for details on setting a label. To obtain the UUID, use
# the blkid(8) command.
#LABEL=boot /boot ext4 noauto,noatime 1 2
#UUID=58e72203-57d1-4497-81ad-97655bd56494 / ext4 noatime 0 1
#LABEL=swap none swap sw 0 0
#/dev/cdrom /mnt/cdrom auto noauto,ro 0 0
# /dev/nvme0n1p4
UUID=9a89bdb4-8f36-4aa6-a4c7-831943b0985c / xfs rw,relatime,attr2,inode64,noquota 0 1
# /dev/nvme0n1p2
UUID=6070-07C6 /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 2
# /dev/nvme0n1p1
UUID=DC09-2FD7 /boot/efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 2
# /dev/nvme0n1p5
UUID=e3237966-1b71-44b3-9d96-1ed7cc6f4d84 /home xfs rw,relatime,attr2,inode64,noquota 0 2
# /dev/nvme0n1p3
UUID=3128bf96-71f7-4a95-a81c-f82788c37f4f none swap defaults 0 0
我还执行了以下故障排除操作:
- 在内核中启用 NVME 支持
- 在内核中启用 xfs 文件系统支持
- 加载没有 rootfstype=xfs 的 grub
/dev/nvme0n1p4
替换我的 fstab 文件中的UUID- 用酒浇灭我的悲伤
答案1
!!Block device UUID="9a89bdb4-8f36-4aa6-a4c7-831943b0985c" is not a valid root device...
!!Could not find the root block device in UUID="9a89bdb4-8f36-4aa6-a4c7-831943b0985c"
Please specify another value or: Press Enter for the same, type "shell" for a shell, or q to skip..."
root block device() ::
这看起来不像 GRUB 生成的消息。
也许您的 GRUB 实际上工作得很好,但您的 initramfs 缺少一些必要的东西,例如 NVMe 驱动程序或 GPT 分区类型支持模块(当然,除非您将它们全部构建为固定到内核中)?那么也许是 Gentoo initramfs 崩溃进入了某种故障排除模式?
看起来 Gentoo 有多种方法来创建 initramfs 文件:genkernel
可以这样做,或者您可以使用dracut
.您使用的是哪一款?
您可能需要输入shell
该提示符并查看/dev/nvme*
设备节点是否存在、加载了哪些内核模块等。如果您的 initramfs 创建实用程序尚未内置对 NVMe 系统磁盘的特定支持,它可能很简单,只需告诉实用程序“在尝试查找根文件系统之前, initramfs 必须加载nvme-core.ko
和模块”;nvme.ko
它可能无法自动弄清楚。