为了测试docker windows把Windows10重装了,安装之后发现centos不能启动了,还以为在windows下使用ext2fsd把根分区破坏了,进去看访问却是正常的,看了一下windows下的ESP分区(EFI System Partition),实际上也是Linux的EFI挂在的分区,即:

[oen@han EFI]# df | grep efi
/dev/nvme0n1p2     98304     47432     50872  49% /boot/efi
[oen@han EFI]# ls /boot/efi/EFI/
Boot  centos  Dell  Microsoft
[oen@han EFI]# ls /boot/efi/EFI/centos/
BOOT.CSV  BOOTX64.CSV  fonts  fw  fwupia32.efi  fwupx64.efi  grub.cfg
grubenv  grubx64.efi  mmx64.efi  MokManager.efi  shim.efi
shimx64-centos.efi  shimx64.efi

EFI目录下是有centos目录的,且下面是centos的相关引导文件,而当时看是没有centos目录的,才意识到安装windows时手贱把ESP分区格式化了,本文就记录如何恢复Linux引导等类似的问题,以免下次手贱时再折腾。

首先需要将centos7刻录一个USB启动盘,iso镜像没版本要求

从USB启动进入到live模式

确保能执行efibootmgr命令,安装对应的包

[oen@han EFI]# rpm -qf <code>{{EJS0}}</code>
efibootmgr-17-2.el7.x86_64

将根分区和efi分区挂在指定目录:

mkdir -p /mnt/system
mount /dev/nvme1n1p1 /mnt/system
mount /dev/nvme0n1p2 /mnt/system/boot/efi

挂在sys,proc,dev,然后chroot

mount --bind /proc /mnt/system/proc
mount --bind /dev /mnt/system/dev
mount --bind /sys /mnt/system/sys
chroot /mnt/system/

在chroot内重装相关RPM

[oen@han centos]# pwd
/boot/efi/EFI/centos
[oen@han centos]# for i in <code>{{EJS1}}</code>;do rpm -qf $i;done | sort | uniq
fwupdate-efi-12-5.el7.centos.x86_64
grub2-efi-x64-2.02-0.76.el7.centos.1.x86_64
shim-x64-15-2.el7.centos.x86_64

在chroot内生成grub2.conf:

grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

退出chroot。

添加EFI启动项,注意具体参数配置:

efibootmgr -c -d /dev/nvme0n1 -p 2 -l '\EFI\centos\shimx64.efi' -L CentOS

如果启动看不到windows或者CentOS,注意看一下efibootmgr BootOrder的配置。


CentOS EFI格式化后恢复来自于OenHan

链接为:https://oenhan.com/centos-grub2-efi-esp-recovery

发表回复