问题背景
我的电脑是双硬盘双系统环境:
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; done5.安装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
reboot6.进入到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,确认我的nvme0n1p1 是 vfat 或 fat32,然后执行下述命令:
# 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就可以了。
总结
独立 Boot 分区的路径陷阱:如果
/boot是独立分区,GRUB 访问它时,路径不需要加/boot前缀。挂载点检查:修复引导前,务必用
lsblk确认 EFI 分区到底挂载在/boot还是/boot/efi,这决定了grub-install的参数。Windows 引导:在双硬盘环境下,Windows 有时会将引导文件写入已存在的 EFI 分区,只要
os-prober能识别到,GRUB 就能完美管理双系统。
重启后,Arch Linux 和 Windows 启动项均已恢复正常。