在今年八月底的某次更新后,再启动进入 Arch grub 引导之后显示:
loading linux linux...
error: invalid cluster 0.
Unable to mount root fs on unknown-block(0,0)
...
更新把引导弄坏了,只好自己修了,不过这对于 arch 也算是家常便饭,就顺便记录下。
进入安装启动盘
找到之前安装 Arch Linux 的U盘,丢了的话现做一个也行
连接网络
因为中间隔了几天没用,所以系统可能又有更新,就需要更新到最新,因此先进行网络连接
iwctl
# 进入 iwctl 交互
device list # 可以看到设备是 wlan0
station wlan0 scan
station wlan0 get-networks
station wlan0 connect wlan_name # 之后输入密码
# 推出 iwctl 交互
exit
挂载分区
查看硬盘分区情况
$ lsblk
output:
nvme0n1
| nvme0n1p1 400Mi efi
| nvme0n1p2 40Mi Windows mgr
| nvme0n1p3 1.9t windows
nvme1n1
| nvme1n1p1 400G ntfs
| nvme1n1p2 40G Linux swap
| nvme1n1p3 1.5t Linux filesystem
我是双系统,很容易理清各个分区的情况。接下来进行挂载,可以直接挂载/和/boot,也可以按照安装时从root开始完全挂载:
mount -t btrfs -o subvol=/@,compress=zstd /dev/nvme1n1p3 /mnt # 挂载 /
mount -t btrfs -o subvol=/@home,compress=zstd /dev/nvme1n1p3 /mnt/home # 挂载 /home
mount /dev/nvme0n1p1 /mnt/boot # 挂载 /boot
change root后进行修复
change root 重建 fstab 与 grub引导:
$ rm -rf /mnt/etc/fstab
$ genfstab -U /mnt > /mnt/etc/fstab
$ ls -l /dev/disk/by-uuid # 查看硬盘 uuid
$ cat /mnt/etc/fstab # 对应 uuid 查看重置分区配置文件是否正常
# 接下来修复引导
$ arch-chroot /mnt
[root@archiso] $ pacman -Syyu
[root@archiso] $ grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=ARCH
# 若要修改 grub 参数: vim /etc/default/grub
[root@archiso] $ grub-mkconfig -o /boot/grub/grub.cfg
[root@archiso] $ exit
$ umount -R /mnt
$ reboot
重启后发现,不仅没修改,arch的引导直接无了,重新进去安装盘看一下:
# 挂载同之前的操作,省略
$ ls -a /mnt/boot
# 查看是否有如下文件: { initramfs-linux.img, intel-ucode.img, vmlinuz-linux }, 发现只有 intel-ucode.img
$ arch-chroot /mnt
[root@archiso] $ pacman -S linux
# 若报错 GDBus.Error: ... org.cinnamon.SettingsDeamon was not provided by any .service files, 是pacman检测到非原来用户执行,可以执行: mkinitcpio -p linux
# 重新生成 grub
[root@archiso] $ grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=ARCH
[root@archiso] $ grub-mkconfig -o /boot/grub/grub.cfg
[root@archiso] $ exit
$ umount -R /mnt
$ reboot
重启后引导恢复,如果Windows引导确实可以进入系统后执行一下命令重建引导:
# 需要在 /etc/default/grub 中加入一行 GRUB_DISABLE_OS_PROBER=false
os-prober
grub-mkconfig -o /boot/grub/grub.cfg
至此,引导修复完毕。