问题与现象

我的win10/fedora双体系在fedroa从34晋级到36之后,再次开机就无法再进入到win10了。grub引导的选项都在,可是不论选哪个进入的都是fedora。

所以我找来一个win10的U盘发动盘,开机进入到U盘的windows体系中,利用界面工具修正了一下发动引导。(这儿状况各不相同,我的这个U盘是一个PE盘,自身有一些修正的工具,一般的U盘安装盘应该也有修正发动引导这样的选项)

重启机器可以进行win10体系了,可是又来了一个新问题:发动引导的选项(按f10进入的体系发动页面,不是grub的黑屏选项页)都在,可是不论选哪个进入的都是windows,和刚才的状况正好相反!

然后开端了几天艰苦卓绝的修正之路……

预备与条件

当时体系是UEFI模式的,这个在BIOS中现已设置好了,现在体系大多是UEFI模式。

fedora的发动partition分区编号是8(GPT8),这儿存储的是fedora的各种boot文件。

fedora的体系partition分区编号是9(GPT9),这儿有个很不一般的状况:在这个分区中包含了三个逻辑分区lvm-fedora_fedora-lindeer-root, lvm-fedora_fedora-lindeer-home, lvm-fedora_fedora-lindeer-swap。最初这个状况让人不明所以,依照设想,应当有一个专门的partition分区是体系的root, 还有一个分区是home,可能是体系晋级形成的,当时这个fedora是从32晋级到34又晋级到36的。

Windows下修正(失利)

想着在win10下也能用上linux,然后折腾了一下wsl2,发现体系的版别太低。晋级win10也费了半天劲,最好便是直接用官方的晋级程序Windows10Upgrade9252.exe。然而我在发现这个办法之前,用的是体系设置傍边的windows更新,这种办法安装更新没完没了,并且还常常下载失利,这种办法仅仅打补丁,晋级不了版别号。

所以从win10的1803版别晋级到了当时最新的22H2版别(19045.2006)。

当时想当然地以为,已然fedora体系自身是好的, 那我在windows的发动引导里增加一个正确的引导入口,不就可以了?所以便是上一篇文章中的一番操作。

别的,bcdedit的办法是首要经过询问chatGPT才找到的办法,chatGPT实在太强大了!

结果是不成功的。

Grub页面手动引导(失利)

所以仍是回到grub的老路。先能进入fedora原有体系再说,要进体系先进grub页;要进入grub页,需求借助Live CD的U盘发动,但我原先的Fedora32 U盘发动之后,没有进入正常的grub黑屏发动选项页,而是直接进入到了grub指令页,当时并不知道是U盘的问题。

grub> ls

在这儿才检查到了一些分区的细节,ls指令可以便利的罗列已有的磁盘设备。由所以插着U盘,体系把U盘命名成hd0,自带的磁盘是hd1。所以有(hd0,gpt0),(hd1,gpt2),(hd0,gpt8),(hd0,gpt9)一众设备。当时只要(hd1,gpt2)(hd0,gpt8)可以经过ls指令检查目录下文件内容,如grub> ls (hd0,gpt8)/

经过指令才发现途径/boo/eif/下是空的!这就解说了,我不论在windows下bcdedit怎么设置path都是无效的,由于根本就没有任何efi文件。

经过这篇文章,了解了一些指令才能引导进入体系。文章中的指令好多无法运用,用的是自己试出来的:

set root=(hd1,gpt8)
linuxefi (hd1,gpt8)/vmlinuz-5.18.11-200.fc36.x86_64 root=/dev/sda8
set prefix=(hd1,gpt8)/grub2
initrdefi(hd1,gpt8)/initramfs-5.18.11-200.fc36.x86_64.img

但这个操作重复试了很多次都没有成功进入体系,显然我没搞清第二个指令里的root是目标体系的根目录,不是发动目录。怪异的是没有文中说的linuxinitrd指令,只要多了个efilinuxefiinitrdefivmlinuzinitramfs都可经过tab键自动完结,选取当时体系对应的即可。

不过经过ls至少知道fedora体系自身是没有出问题的。我这才怀疑是U盘的问题,所以新下载一个Fedora37的iso镜像,并用rufus-2.18.exe重新制造了一个U盘发动盘。

Fedora Live CD体系修正(失利)

用重新制造的U盘发动之后,果然进入到了了解的grub黑屏发动选项页,选择Fedora37进入到了Live CD体系傍边。

这儿首要参阅了这篇文章,首要讲的是在Live CD体系下怎么修正grub,为了避免混杂,我用/mnt/fedora作为了根目录:

sudo mount /dev/fedora_fedora-lindeer/root /mnt/fedora
sudo mount /dev/sda8 /mnt/fedora/boot
sudo mount --bind /dev /mnt/fedora/dev
sudo mount --bind /proc /mnt/fedora/proc
sudo mount --bind /sys /mnt/fedora/sys
sudo mount --bind /var/run /mnt/fedora/var/run
sudo ls /mnt/fedora/*

这儿特别要注意前两个指令。首要要挂载的是root目录,咱们的状况有点特殊,那便是root目录不是一个单独的partition分区,而是一个linux lvm;别的,rootboot只要一个字母之差,含义和作用也彻底不同。最终一个指令仅仅为了查验正确挂载。

挂载完结之后就进行修正操作:

sudo chroot /mnt/fedora
sudo cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bk
sudo grub2-mkconfig -o /boot/grub/grub.cfg

依照文章中提及的,可以用grub2-installgrub2-mkconfig,但后者会协助检测已有的操作体系并增加适当装备,更适合双体系,所以选择了这个。体系重启之后实际并没有成功

所以又来一遍同样的操作,不过最终一个指令改成grub2-install,可是指令履行失利,过错提示似乎有短少参数的状况,才发现途径/boot下只要i386-pc,改成以下:

sudo grub2-install --target=i386-pc /dev/sda

可是这个办法履行也失利了,真让人溃散!过错提示grub2-install error: will not proceed with blocklists,真是让人匪夷所思。

Fedora原体系下修正(成功)

已然用那坨复杂的办法是为了切换到原有体系的环境,那我直接进Fedora原体系进行修正不就完了?

所以经过Live CD发动进入grub黑屏选项页,再按字母键’c’进入grub指令页,预备经过手动引导先进入原体系:

grub> ls # 检查已加载的设备
grub> echo $root $prefix # 检查已设置的环境
# 以上指令不重要,是可选的

grub> set root=(hd1,gpt8)
grub> linux (hd1,gpt8)/vmlinuz-5.18.11-200.fc36.x86_64 root=/dev/dm-0
grub> set prefix=(hd1,gpt8)/grub2
grub> insmod normal
grub> initrd (hd1,gpt8)/initramfs-5.18.11-200.fc36.x86_64.img

这一步要确保在/dev目录下有体系发动的root设备,我的设备是/dev/fedora_fedora-lindeer/root,这是一个软链接,实际指向/dev/dm-0。这些信息在预备与条件那节现已提及。

fedora原体系成功发动!可是当时体系里没有grub-update指令。然后参阅这篇文章在指令行履行(以root权限):

rm /boot/grub2/grub.cfg
dnf update shim-* grub2-efi-* grub2-common
dnf reinstall shim-* grub2-efi-* grub2-common

由于体系目录/boot/efi之下是空的,所以也无所谓删除,这一步没有依照文章中所说。别的直接运转dnf reinstall shim-* grub2-efi-* grub2-common报了一个过错,过错信息现已找不到了,不过用update可以找到对应的晋级包,所以先运转update。

如上运转再次发动后,总算成功了,全部恢复如初!可以说,这个办法是之前好几个办法的一个综合!/boot/efi下也有途径了/boot/efi/EFI/fedora/,各种efi文件也都存在。

也便是说,这样的状况处理的根本步骤应当是:

  1. 先要可以正确进入到linux原体系傍边(不论是经过发动U盘的办法,仍是手动编辑grub的办法)
  2. 再更新grub并重装grub

我由于各种状况叠加,使得状况变得有点复杂,再加上一知半解,绕了一个大圈子,耗费了太长时间,但这个全体过程应当是不会变的。完毕吧,再也不想整这坨东西了!