这篇文章上次修改于 263 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

之前笔电重装win10,不小心把EFI分区给干掉了,也忘记了备份。
Windows的EFI分区恢复比较轻松,用DISM++就可以轻松解决。
这里记录下使用archLinux livecd修复manjaro系统grub引导经过。

修复EFI启动文件

制作archLinux livecdU盘,然后通过u盘启动到arch临时系统。

还有可以用archlinux的UEFI Netboot文件,在UEFI shell启动它,就可以网络启动archlinux livecd了,还可以选择镜像源,非常方便。平时可以放在EFI分区里面,以备急用。

挂载并进入系统

fdisk -l 
Disk /dev/sda: 60 GiB, 64424509440 bytes, 125829120 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: FCD5BB38-3902-430F-B051-46ACDE205F63

Device       Start       End   Sectors  Size Type
/dev/sda1     2048   1050623   1048576  512M EFI System
/dev/sda2  1050624 125827071 124776448 59.5G Linux filesystem

查看磁盘分区

mount /dev/sda2 /mnt 

挂载系统根目录

mount /dev/sd1 /mnt/boot 

挂载EFI启动分区

arch-chroot 

切换到需要修复的系统

重建引导程序

pacman -S grub os-prober efibootmgr

manjaro通常带有这些软件包,可以跳过

grub-install --recheck /dev/sda --efi-directory=/boot

在EFI启动分区创建引导文件,注意/dev/sda对应的是整个磁盘

grub-mkconfig -o /boot/grub/grub.cfg

生成grub的配置文件

exit
reboot

重启检查能否启动

碰到的一些问题

grub启动项中没有manjaro启动项

修复重启后能够进入grub引导界面,但是只有Windows启动项,没有找到manjaro的启动项。
可以是安装了不同版本的内核,修复是只能修复系统默认版本的内核,其他版本的内核是不能被自动修复的,所以启动项里看不到启动内核项。
解决方法也比较简单,安装默认的系统内核,重新生成grub引导。
使用livecd U盘启动,挂载并进入系统

mount /dev/sda2 /mnt
mount /dev/sda1 /mnt/boot

arch-chroot /mnt
pacman -S linux
pacman -Syu

重新安装内核

update-grub

重建grub配置

Linux找不到EFI分区导致无法启动

使用livecd U盘启动,挂载并进入系统,上面讲过就不重复了。

查看EFI分区的UUID

ls -l /dev/disk/by-uuid/
lrwxrwxrwx 1 root root 10 Jul 18 06:16 3c17e54c-51a3-47ad-ad0e-3dc3a7b19421 -> ../../sda2
lrwxrwxrwx 1 root root 10 Jul 18 06:16 E300-7464 -> ../../sda1

结合fdisk -l命令找到EFI分区,找到其UUID

vim /etc/fstab

将EFI分区的UUID修改为当前的,保存并重启。