如何将 GRUB 重新安装到 EFI 分区?

Gen*_*oso 69 partitioning boot grub2 dual-boot uefi

我想重新安装 GRUB 2,我找到了以下说明: 如何使用 Ubuntu Live CD 或 USB 修复、还原或重新安装 Grub 2。就我而言,引导加载程序安装在 EFI 分区中。如果我使用本指南中提供的命令,GRUB 会自动重新安装到 EFI 分区,还是会安装到安装 Ubuntu 的根分区?显然,我不希望这种情况发生。

cl-*_*box 118

以这种方式在 EFI 模式下将 GRUB 引导加载程序重新安装到您的 Ubuntu 安装中...

从 Ubuntu 安装介质启动并选择“尝试 Ubuntu 而不安装”。
(在 EFI 模式下启动安装介质,选择前面带有 UEFI 的 Ubuntu 条目。)

进入 Live 桌面后,打开终端并执行以下命令:

sudo mount /dev/sdXY /mnt
sudo mount /dev/sdXX /mnt/boot/efi
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
sudo chroot /mnt
grub-install /dev/sdX
update-grub  
Run Code Online (Sandbox Code Playgroud)

注意:sdX= 磁盘 | sdXX= efi 分区 | sdXY= 系统分区

使用 GParted 识别分区,该工具包含在安装介质中。
运行命令后,GRUB 将安装在单独的 EFI 分区中。

  • 重要的一点是在正确的引导模式下引导安装介质,如果我们想重新安装 `grub-efi` 我们必须在 UEFI 模式下引导,如果我们想要重新安装 `grub-pc` 我们必须在传统模式。 (10认同)
  • @MarkYisri:非常感谢!:) 因为这是重新安装 GRUB 引导加载程序而不损坏内容的最安全方法,以防系统无法正常引导……这是唯一的方法!:) (3认同)
  • 在这个解决方案中,“grub-install”如何知道它应该在 EFI 模式下安装? (3认同)
  • +1 但你为什么不从 Ubuntu 本身安装? (2认同)
  • 这对我有用,除了一个改动:我做了`grub-install /dev/sdXX`,即不是磁盘,而是 EFI 分区用于安装 grub 并且它起作用了。 (2认同)
  • 先生,你是神,点赞还不够回报 (2认同)

小智 13

这是对我有用的唯一方法:(系统:sdb8,引导:sdb6,efi:sdb2)

sudo mount /dev/sdb8 /mnt 
sudo mount /dev/sdb6 /mnt/boot 
sudo mount /dev/sdb2 /mnt/boot/efi

sudo mount --bind /dev /mnt/dev &&
sudo mount --bind /dev/pts /mnt/dev/pts &&
sudo mount --bind /proc /mnt/proc &&
sudo mount --bind /sys /mnt/sys

sudo chroot /mnt

grub-install --target=x86_64-efi /dev/sdb

grub-install --recheck /dev/sdb

exit &&
sudo umount /mnt/sys &&
sudo umount /mnt/proc &&
sudo umount /mnt/dev/pts &&
sudo umount /mnt/dev &&
sudo umount /mnt
Run Code Online (Sandbox Code Playgroud)


Nic*_*lás 10

在过去的几个月里,相关库发生了一些更新。

以下步骤对我很有用。他们从旧答案以及其他论坛中汲取了想法。

确保您使用 EFI 启动

efibootmgr -v
Run Code Online (Sandbox Code Playgroud)

运行 grub 安装

sudo mount /dev/nvme0n1p5 /mnt 
sudo mount /dev/nvme0n1p1 /mnt/boot/efi

for i in /dev /dev/pts /proc /sys /sys/firmware/efi/efivars /run; do sudo mount -B $i /mnt$i; done

sudo chroot /mnt

grub-install --target=x86_64-efi /dev/nvme0n1
grub-install --recheck /dev/nvme0n1

# as a second attempt, you could also try (assuming _debian_ is your distro)
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian
# grub-mkconfig -o /boot/grub/grub.cfg

update-grub2

exit &&
sudo umount /mnt/sys &&
sudo umount /mnt/proc &&
sudo umount /mnt/dev/pts &&
sudo umount /mnt/dev &&
sudo umount /mnt
Run Code Online (Sandbox Code Playgroud)

确保将efibootmgr您的 Linux 列为条目

efibootmgr -v
Run Code Online (Sandbox Code Playgroud)


小智 7

这就是我在标准 x86_amd64 EFI 桌面上所做的,没有 chroot,假设您的硬盘驱动器上有一个包含 Ubuntu 的分区,并且可能是一个应该安装 GRUB 的 EFI 分区。

# boot on a live Ubuntu, I used 18.04 but more recent should work

# if you have currently no EFI partition (maybe it was deleted,
# or you are migrating to a new drive):
# sudo gparted
# - create a FAT 32 partition of around 100 MB on the disk of your choice
# (in general the one that host the Ubuntu partition). If you plan to
# move or resize some paritions, anticipate that (for instance by
# creating the EFI partition at the end of the free space).
# - set the flag esp on this partition (the flag boot will also be selected)

# now assuming that the Ubuntu partition is `/dev/sda2` and the (possibly new) EFI partition is `/dev/sda1`
sudo apt install grub-efi
sudo mkdir /media/root && sudo mount /dev/sda2 /media/root
sudo mkdir /media/efi && sudo mount /dev/sda1 /media/efi
sudo grub-install --target=x86_64-efi /dev/sda --efi-directory=/media/efi --boot-directory=/media/root/boot
Run Code Online (Sandbox Code Playgroud)

这应该给出:

为 x86_64-efi 平台安装。

安装完成。没有报告错误。

然后重新启动,你应该完成。您可能需要告诉您的 BIOS 使用哪个驱动器,或使用哪个 EFI 分区,或使用哪个 EFI 二进制文件。

如果您创建了一个新的 EFI 分区,您可能需要将其添加到其中/etc/fstab才能update-grub正常工作。

更多信息:https : //wiki.archlinux.org/index.php/Multiboot_USB_drive#Hybrid_UEFI_GPT_+_BIOS_GPT/MBR_boot


小智 6

感谢@cl-netbox 的指导!

在我升级(Linux Mint 18.2 Sonya 到 18.3 Sylvia)后,我的系统无法启动,所以我按照上面的说明进行了操作,但仍然没有成功。然而,我注意到我的机器在一个单独的分区中有 /boot(可能是因为我使用的是 LVM)所以我稍微修改的过程是:

sudo mount /dev/sdXXX /mnt
sudo mount /dev/sdXY /mnt/boot
sudo mount /dev/sdXX /mnt/boot/efi
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
sudo chroot /mnt
grub-install /dev/sdX
update-grub 
Run Code Online (Sandbox Code Playgroud)

注意:sdX = 磁盘 | sdXX = efi 分区 | sdXY = 启动分区 | sdXXX = 系统分区


小智 6

另外,如果从 Live CD 启动进行恢复,则可能会丢失该grub-efi-amd64-bin软件包,然后丢失以下行:

grub-install --target=x86_64-efi /dev/sdb 
Run Code Online (Sandbox Code Playgroud)

失败并显示错误消息:

grub-install: error: /usr/lib/grub/x86_64-efi/modinfo.sh doesn't exist. Please specify --target or --directory.
Run Code Online (Sandbox Code Playgroud)

在这种情况下,请在以下位置之外运行chroot

sudo apt get grub-efi-amd64-bin
Run Code Online (Sandbox Code Playgroud)

然后添加/usr/lib/grub/x86_64-efichroot坐骑。

顺便说一句,该/dev/sdb参数已过时并被忽略。