我想重新安装GRUB 2,并找到了以下的指示:
如何使用Ubuntu Live CD或USB修复、恢复或重新安装Grub 2。
在我的情况下,引导加载程序已安装在EFI分区中。如果我按照这个指南提供的命令操作,GRUB会自动重新安装到EFI分区吗?还是会安装到Ubuntu所在的根分区?显然,我不希望发生后者。
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
exit
mount -t efivarfs none /sys/firmware/efi/efivars
grub-install
命令:grub-install /dev/sdX
。sudo umount /dev/sdXX
sudo umount /dev/sdXY
sdX
= 磁盘 | sdXX
= efi 分区 | sdXY
= 系统分区grub-efi
,我们必须以UEFI模式启动;如果我们想要重新安装 grub-pc
,我们必须以传统模式启动。 - mook765sdXXX
= 系统分区”时,你是指分配给 /
、/home
还是 /boot
的分区?谢谢。 - Chris RogerssdXXX
是系统分区,意思是:/
(根分区)。 - cl-netboxgrub-pc
可用。首先运行sudo apt-get install grub-efi
,然后按照以下步骤进行操作。在运行grub-install
时仍然收到错误消息,但忽略它并运行update-grub
,该命令找到了Windows的EFI。然后我不得不重新启动,进入引导管理界面,并更新引导顺序选项。尽管它没有列出来,但它给了我添加引导选项的选项,然后搜索文件,在正确的文件系统+ EFI目录中找到了它。将新的引导选项设置为第一项,最终成功了! - iisisraelgrub-install /dev/sdXX
,即不是磁盘而是EFI分区用于安装grub,它起作用了。 - Duck Dodgersblkid
命令找到分区ID。 - Egor Tensinsudo blkid
命令获取的efi分区的UUID和/etc/fstab文件中的UUID即可。 - user634093for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
的作用吗? - kamer_kane/dev /dev/pts /proc /sys /run
从实时系统绑定到已安装的系统上,这样你在实时系统上执行的命令就可以有效地对已安装的系统进行更改。这是上述命令的简化版本:
sudo mount -o bind /dev /mnt/dev
sudo mount -o bind /dev/pts /mnt/dev/pts
sudo mount -o bind /proc /mnt/proc
sudo mount -o bind /run /mnt/run
sudo mount -o bind /sys /mnt/sys
- cl-netboxupdate-grub
之前,我编辑了/etc/defaults/grub
文件并删除了这些不好的设置。我不能百分之百确定它是如何找到非默认的grub文件的——在非chroot环境下,它具有正常的默认设置,但在chroot终端窗口中,我看到了我的“不好”的设置。 - Tim Cokersudo 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
--recheck
是什么作用?手册上说如果设备映射已经存在,则删除它。 - MrCalvin--bootloader-id=Ubuntu_02
,那么启动就会失败。它只会引导到grub控制台...有解决方法吗? - MrCalvingrub-install --recheck
命令。这个命令修复了我无法工作的USB硬盘驱动器的EFI问题。 - solsTiCe--target=x86_64-efi
选项生效,您需要一个名为 grub-efi-amd64-bin
的软件包。 - Hi-Angel# 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
这应该是:
正在为 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
mkfs -t vfat /dev/sda2
(在我的情况下!)将现有的/boot
分区从ext
格式格式化为fat
格式,然后挂载它到/mnt/boot/
,同时也挂载了我的根目录(LVM)。我将grub-install --force --target=x86_64-efi --boot-directory=/mnt/boot --efi-directory=/mnt/boot /dev/sda
命令中的两个目录选项都指向同一个位置。然后,我编辑了挂载在/mnt/root/etc/fstab
的fstab文件,并将UUID替换为/dev/sda2
+ vfat
和/dev/mapper/..
用于LVM。 <继续> - LuxZggrub-install /dev/sda --efi-directory=/boot
+ update-grub
+ 另一次重新启动。我通过安装另一个内核并强制执行 update-grub
进行了测试,一切都很好,grub 文件被正确更新,并为该内核创建了新的条目。所以再次非常感谢你,干杯! - LuxZggrub-install
创建的grub.cfg
引用了位于/boot/grub
(位于btrfs分区上)的grub.cfg
。这个文件中仍然包含之前磁盘的UUID,导致无法启动。我在那里修复了UUID(使用ls -l /dev/disk/by-uuid
命令找到新的UUID),现在一切都正常了。谢谢! - Patrick Echterbruchupdate-grub
这一步骤,我认为这是这个解决方案最大的缺陷,因为update-grub
通常是大多数人不能错过的关键步骤(而且我猜它必须在chroot
环境中完成)。 - xptefibootmgr -v
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
确保 efibootmgr
将您的 Linux 列为一个条目
efibootmgr -v
感谢@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
"grub-install --target=x86_64-efi /dev/sdb"
sudo apt get grub-efi-amd64-bin
sudo apt get grub-efi-amd64-bin
会做什么。 - mook765sudo apt get grub-efi-amd64-bin
不是一个有效的命令。也许你的意思是 sudo apt install ...
。 - Organic Marblefdisk
或parted
之类的分区工具来创建一个新的分区sdXY(例如sda1),类型为“EFI分区(1)”,并用以下格式进行格式化:sudo mkfs.msdos /dev/sdXY
sudo mount /dev/sdXY /boot/efi
sudo grub-install --efi-directory=/boot/efi
mount --bind
,而是使用mount --rbind
,然后对sys和dev使用mount --make-rslave
,proc只需重新挂载即可。
在gentoo中,我过去会像这样从一个实时系统创建挂载点:mount -t proc /proc /mnt/proc
mount --rbind /sys /mnt/sys
mount --make-rslave /mnt/sys
mount --rbind /dev /mnt/dev
mount --make-rslave /mnt/dev
chmod 1777 /mnt/dev/shm
--bind
和--rbind / --make-rslave
之间的确切区别吗? connect: No such file or directory
Please make sure that the zfs-fuse daemon is running
并且
grub-install: warning: Cannot read EFI Boot* variables.
grub-install: warning: read_file: could not read from file: Input/output error.
mount --bind /sys/firmware/efi/efivars /mnt/sys/firmware/efi/efivars
/dev/pts
)。 - Z4-tier/dev/pts
这个东西在很多教程和手册中都能找到。由于 /dev/pts
是伪终端和绑定挂载,可能并不需要它。 - schiffsratte--rbind
而不是--bind
,因为--rbind
可以访问在你创建的绑定挂载下面的其他绑定挂载。这里有一个更好的解释:[https://askubuntu.com/a/1188621/260981] - schiffsratte$ sudo chroot /mnt
# grub-install /dev/sdX
grub-install: error: /usr/lib/grub/i386-pc/modinfo.sh doesn't exist.
Please specify --target or --directory.
# ls /usr/lib/grub/
grub-mkconfig_lib x86_64-efi x86_64-efi-signed
# grub-install --target=x86_64-efi /dev/sdX
Installing for x86_64-efi platform.
Installation finished. No error reported.
https://wiki.debian.org/GrubEFIReinstall
以下是其他答案中缺少的具体细节:在chroot中安装grub时,包括efivars
for i in /dev /dev/pts /proc /sys /sys/firmware/efi/efivars /run; do sudo mount -B $i /mnt$i; done
不要忘记在chroot中挂载/boot
和/boot/efi
运行所有的grub命令
apt-get install --reinstall grub-efi
grub-install /dev/disk
update-grub