记一次重装 Windows 后 Arch Linux 引导丢失的修复全记录
  配置

记一次重装 Windows 后 Arch Linux 引导丢失的修复全记录

 次点击
17 分钟阅读

问题背景

我的电脑是双硬盘双系统环境:

  • Arch Linux: 位于 nvme0n1,使用 Btrfs 文件系统,独立 /boot 分区(同时作为 EFI 分区)。

  • Windows 11 IoT Enterprise LTSC: 位于 nvme1n1

起因: 原先的双引导正常。但在重装 Windows 11 后,BIOS 的启动顺序被修改,且 Arch Linux 的 GRUB 引导项丢失。虽然通过 BIOS 强行切换回 Arch 所在的硬盘,但 GRUB 无法正常进入系统,只能进入命令行模式。

故障排查与急救

1. 尝试重新挂载

分别按照gpt和kimi的吩咐不断使用mount命令,未成功。

2. 尝试 chroot 修复(未完全成功)

起初尝试使用 Live USB 挂载系统并 chroot 重新安装 GRUB。实际上chroot一直报错。

最终解决方案

1.创建archlinux的启动u盘

2.跳转启动项,进入到Arch Live USB 环境

3.输入命令lsblk -f

输出结果如下:

NAME FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
zram0
     swap   1     zram0 bf885db5-82e6-4cf8-98ea-2e078589b74c                [SWAP]
nvme0n1
│
├─nvme0n1p1
│    ntfs         mine  6A8ADA988ADA5FDD
├─nvme0n1p2
│
├─nvme0n1p3
│    ntfs               C210F9D210F9CE03
└─nvme0n1p4
     ntfs               D4BE68C9BE68A5A8
nvme1n1
│
├─nvme1n1p1
│    vfat   FAT32       139D-65B5                             672.1M    34% /boot
└─nvme1n1p2
     btrfs              9cfe98eb-9efd-4622-894f-c6f2646472ec  246.9G    50% /swap
                                                                            /home
                                                                            /

你要问我能不能看懂,我也不能完全把所有信息讲明白。我做到的无非是记住了我arch装在了哪里而已。这是最重要的。所以我们需要记住的信息如下:

nvme1n1
│
├─nvme1n1p1
│    vfat   FAT32       139D-65B5                             672.1M    34% /boot
└─nvme1n1p2
     btrfs              9cfe98eb-9efd-4622-894f-c6f2646472ec  246.9G    50% /swap
                                                                            /home
                                                                            /

4.挂载

# 挂载系统根分区到 /mnt
sudo mount /dev/nvme0n1p2 /mnt

# 创建并挂载 EFI 分区
sudo mkdir -p /mnt/boot/efi
sudo mount /dev/nvme0n1p1 /mnt/boot/efi

# 绑定必要目录(一个都不能漏)
for i in dev proc sys run tmp; do sudo mount --bind /$i /mnt/$i; done

5.安装grub

# 跳过chroot,直接在Live环境重装GRUB,不知道为什么我的chroot就是报错
grub-install --target=x86_64-efi --efi-directory=/mnt/boot/efi --bootloader-id=Arch --root-directory=/mnt --recheck

# 然后需要手动生成grub.cfg
cat > /mnt/boot/grub/grub.cfg << 'EOF'
# 极简 GRUB 配置
set timeout=5
set default=0

insmod btrfs
insmod efi_gop

menuentry 'Arch Linux' {
  search --no-floppy --fs-uuid --set=root 9cfe98eb-9efd-4622-894f-c6f2646472ec
  linux /boot/vmlinuz-linux root=UUID=9cfe98eb-9efd-4622-894f-c6f2646472ec rw
  initrd /boot/initramfs-linux.img
}
# 重启进 BIOS
umount -R /mnt
reboot

6.进入到grub界面

如果你比较幸运,也比较懂实际原理,这里你或许就已经成功了。但是我既不是幸运的人,也不是大佬。于是,grub提示我应该先加载内核。也就是说,我linux的内核加载失败了。

不要担心,这时候你只需要按下c进入到grub的命令行,并继续尝试即可。

ls
# 查看有哪些盘
# 可能和之前看的不太一样,需要你去慢慢找,比如你看到(hd1,gpt2),你就可以尝试:
# ls (hd1,gpt2)和ls (hd1,gpt2)\来查看,直到你找到哪个有@等文件夹,哪个vmlinuz-linux等文件

比如,我查看之后的结果是:

我在hd2gpt1下有: intel-ucode.img vmlinuz-linux vmlinuz-linux-zen initramfs-linux.img grub/ efi/ 而在hd2gpt2下有: dev/ run/ boot/ @/ @home/ @swap/ tmp/ sys/ timeshift-btrfs/ proc/

然后在命令行输入:

# 1. 设 GRUB 根为内核分区
set root=(hd2,gpt1)

# 2. 加载内核(指向真正的系统根分区 + 子卷 @)
linux /vmlinuz-linux \
      root=/dev/nvme1n1p2 \ #这里如果用uuid会更好,反正我直接用dev是没有成功果 root=UUID=……
      rw \
      rootflags=subvol=@,compress=zstd,ssd,space_cache=v2 \
      intel_pstate=disable 

# 3. 加载 initramfs
initrd /initramfs-linux.img

# 4. 启动
boot

就可以成功启动,回到原来的系统了。接下来只剩下最后一步,修复grub了。

7.修复grub

输入lsblk -f,确认我的nvme0n1p1vfatfat32,然后执行下述命令:

# 1. 安装 GRUB (注意目录改为 /boot)
sudo grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=Arch --recheck

# 2. 生成配置文件
sudo grub-mkconfig -o /boot/grub/grub.cfg

然后输入sudo grep -A 10 "menuentry 'Arch Linux'" /boot/grub/grub.cfg查看一下,确保成功。我的输出如下:

menuentry 'Arch Linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-9cfe98eb-9efd-4622-894f-c6f2646472ec' {
        savedefault
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_gpt
        insmod fat
        search --no-floppy --fs-uuid --set=root 139D-65B5
        echo    'Loading Linux linux-zen ...'
        linux   /vmlinuz-linux-zen root=UUID=9cfe98eb-9efd-4622-894f-c6f2646472ec rw rootflags=subvol=@  loglevel=5 notwatchdog modprobe.blacklist=iTCO_wdt
        echo    'Loading initial ramdisk ...'

主要的就是linux这一行,如果你是 /vmlinuz-linux 或者像我一样的 /vmlinuz-linux-zen,就代表基本没有问题了。这时候你只需要reboot就可以了。

总结

  1. 独立 Boot 分区的路径陷阱:如果 /boot 是独立分区,GRUB 访问它时,路径不需要加 /boot 前缀。

  2. 挂载点检查:修复引导前,务必用 lsblk 确认 EFI 分区到底挂载在 /boot 还是 /boot/efi,这决定了 grub-install 的参数。

  3. Windows 引导:在双硬盘环境下,Windows 有时会将引导文件写入已存在的 EFI 分区,只要 os-prober 能识别到,GRUB 就能完美管理双系统。

重启后,Arch Linux 和 Windows 启动项均已恢复正常。

© 本文著作权归作者所有,未经许可不得转载使用。