grub2-mkconfig 出错后修复 Fedora GRUB

grub2-mkconfig 出错后修复 Fedora GRUB

我尝试使用 ChatGPT 在 Fedora 39 中启用分数缩放,他推荐了以下内容:

# NVIDIA's proprietary driver requires DRM KMS to be disabled for Wayland to work. 
# Edit the file /etc/default/grub and ensure the parameter nvidia-drm.modeset=1 is not set. 
# If it is, change it to nvidia-drm.modeset=0 or remove it. Then update the grub configuration with:
sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg

我这样做并运行了命令,却发现我的 GRUB 菜单只显示 Windows 启动管理器。我可以毫无问题地启动到 Windows,但现在 GRUB 找不到 Fedora。

我正在尝试的解决方案

我用 Fedora 创建了一个 USB 可启动驱动器,在进行了快速的 Google 搜索(以及更多的 ChatGPT,除了罪魁祸首)之后,我偶然发现了以下看似合理的解决方案(我的/dev分区已经输入):

# Mount the root filesystem
sudo mount /dev/nvme0n1p7 /mnt/root

# Mount the EFI partition
sudo mount /dev/nvme0n1p6 /mnt/root/boot/efi

# Bind-mount the virtual filesystems
for dir in /dev /proc /sys /run; do
    sudo mount --bind $dir /mnt/root$dir
done

设置完毕后/mnt,我运行了sudo chroot /mnt,它按预期工作了。我将/etc/default/grub文件编辑回原来的样子,然后尝试grub.cfg使用以下命令再次重新生成文件:grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg。尽管如此,我仍然收到以下错误:/usr/sbin/grub2-probe: error: cannot find a device for / (is /dev mounted?).。我尝试了几种安装过程的组合,但没有成功,例如:

sudo mount --bind /dev /mnt/root/dev
sudo mount --bind /dev/pts /mnt/root/dev/pts
sudo mount --bind /dev/shm /mnt/root/dev/shm
sudo mount --bind /dev/disk /mnt/root/dev/disk
sudo mount --bind /proc /mnt/root/proc
sudo mount --bind /sys /mnt/root/sys
sudo mount --bind /run /mnt/root/run

我也尝试跟随本指南,它尝试解决类似的问题,并且该命令可以正常工作。我不知道我可能做错了什么。任何帮助表示赞赏!

lsblk 的输出

Device             Start        End   Sectors   Size Type
/dev/nvme0n1p1      2048     845151    843104 411.7M EFI System
/dev/nvme0n1p2    845824     878591     32768    16M Microsoft reserved
/dev/nvme0n1p3    878592  783736831 782858240 373.3G Microsoft basic data
/dev/nvme0n1p4 994082816  997033681   2950866   1.4G Windows recovery environmen
/dev/nvme0n1p5 997033984 1000214527   3180544   1.5G Windows recovery environmen
/dev/nvme0n1p6 783736832  785833983   2097152     1G EFI System
/dev/nvme0n1p7 785833984  977303551 191469568  91.3G Linux filesystem
/dev/nvme0n1p8 977303552  994080767  16777216     8G Linux swap

答案1

经过多次尝试和错误,我设法找到了解决问题的方法。我将其留在这里,以防有人偶然发现这个问题。

我的系统使用了 BRTFS 子卷,并且对于这种类型的文件系统来说,安装必要分区的步骤是不同的。这就是为什么我无法按照中的步骤操作的原因本指南。我的特殊情况是/dev/nvme0n1p6在中有一个 EFI 分区rootboot/dev/nvme0n1p7.在后者中,有一个根子文件夹,其中包含经典的 Linux 文件夹(binhomeopt等)。

转到该部分使用 GRUB2 引导提示符寻找对我有用的解决方案。为了完整起见,下一部分将解释如何grub2-mkconfig在正确使用 BRTFS 子卷的 chroot 系统中执行该命令。

chroot 到具有 BRTFS 子卷的系统

依照指示这个救星帖子出于绝望,尝试了多种安装过程的组合,我成功地正确地 chroot 到我的系统中:

sudo mkdir /mnt/sysimage
sudo mount -o subvol=root /dev/nvme0n1p7 /mnt/sysimage
sudo mount -o bind /dev /mnt/sysimage/dev
sudo mount -o bind /proc /mnt/sysimage/proc
sudo mount -o bind /sys /mnt/sysimage/sys
sudo mount -o bind /sys/firmware/efi/efivars /mnt/sysimage/sys/firmware/efi/efivars
sudo mount /dev/nvme0n1p6 /mnt/sysimage/boot/efi
sudo chroot /mnt/sysimage

笔记:如果您最终在 chroot 系统内没有网络连接,您可以按照 中详细的步骤操作同一个指南

之后,我可以在我的 chroot 系统中执行以下命令:

dnf reinstall shim-* grub2-efi-* grub2-common
grub2-mkconfig -o /boot/grub2/grub.cfg
sync && exit

对于umount所有事情,只需执行以下操作:

sudo umount /mnt/sysimage/sys
sudo umount /mnt/sysimage/proc
sudo umount /mnt/sysimage/dev
sudo umount /mnt/sysimage/boot/efi
sudo umount /mnt/sysimage/sys/firmware/efi/efivars
sudo umount /mnt/sysimage

/usr/sbin/grub2-probe: error: cannot find a device for / (is /dev mounted?)这样做,运行后我不再收到错误grub2-mkconfig -o /boot/grub2/grub.cfg,这是我问题的最初目的。然而,执行该命令并没有让我的 Fedora 返回 grub,即使在尝试了我在上找到的这些命令之后也是如此。这个要点:

# Check BIOS boot details [ Note: this command won't work if you are inside chroot. ]
efibootmgr -v
# In case you need to create new entry in BIOS
efibootmgr -c -d /dev/nvme0n1p1 -p 1 -L Fedora -l '\EFI\fedora\grubx64.efi' # or, shimx64.efi

使用 GRUB2 引导提示符

真正的解决方案最终出现在 Fedora 主要文档的这篇文章中,使用 GRUB2 引导提示符。我启动电脑,按下Esc,进入 BIOS 菜单并选择 Fedora。当然,那里不会有任何东西,所以它让我看到了经典的黑屏grub>。在那里,我执行了以下命令:

# Show all partitions
grub> ls
(hd0) (hd1) (hd0,gpt1) ...

# Try out every one of them until you find your EFI partition and your root partition. Mine was (hd2,gpt6) and (hd2,gpt7), respectively.
grub> ls (hd2,gpt6)/ # Had an EFI folder
grub> ls (hd2,gpt7)/ # Inside was the root folder and inside that, my beloved Fedora

# You set root to your EFI partition, mine being (hd2,gpt6)
grub> set root=(hd2,gpt6)

# And the following commands starting with the root partition, mine being (hd2,gpt7)
grub> linux (hd2,gpt7)/root/boot/vmlinuz-6.6.9-200.fc39.x86_64 root=/dev/nvme0n1p7 ro rootflags=subvol=root
grub> initrd (hd2,gpt7)/root/boot/initramfs-6.6.9-200.fc39.x86_64.img

# This command will finish the session and will boot up the chosen kernel and RAM filesystem
grub> boot

笔记:您需要找到要启动的内核 ( vmlinuz-...) 和 RAM 文件系统 ( initramfs-...-.img) 所在的确切路径。为此,您只需ls <your root partition>/root/开始逐个文件夹导航即可。对我来说,向ls (hd2,gpt7)/root/boot/我展示了我拥有的所有内核和 RAM 文件系统。我选择的是最新的,后缀为6.6.9-200.fc39.x86_64.另外,请注意命令root=/dev/nvme0n1p7 ro rootflags=subvol=root中的部分linux。这对于 BRTFS 系统至关重要;如果没有它,系统将无法正确启动。当然,root=必须设置为您自己的root分区,而其余的保持不变。

在你的系统内部

到现在为止,您应该已经启动了丢失的旧系统。在里面,我打开一个终端并执行以下命令来恢复我的grub,这样我就不必每次想登录 Fedora 时都执行上述过程。

# Back up your current GRUB configuration as a precaution:
sudo cp /boot/efi/EFI/fedora/grub.cfg /boot/efi/EFI/fedora/grub.cfg.bak

# Regenerate the GRUB configuration file with:
sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg

# Reinstall GRUB to ensure it's properly installed on the EFI partition:
sudo grub2-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Fedora

然后我重新启动了我的电脑,由于某种奇怪的原因,我没有在我的 BIOS 启动菜单中找到 Fedora(直到现在才出现这种情况,它总是显示它,只是它只引导到屏幕grub>)。我登录 Windows,再次重新启动,进入 BIOS 启动菜单,现在 Fedora 就在那里。我选择了它,我的电脑直接启动到它,而不进入菜单grub,这确实很奇怪,但到目前为止它绝对适合我。我现在可以毫无问题地登录我的 Fedora。

与往常一样,请小心执行这些命令,并仔细检查您的特定系统和配置。

相关内容