Как я могу переустановить GRUB в раздел EFI?

Я хочу переустановить GRUB 2, и я нашел следующие инструкции: Как восстановить, восстановить или переустановить Grub 2 с Ubuntu Live CD или USB. В моем случае, загрузчик установлен в разделе EFI. Если я использую команды, приведенные в этом руководстве, GRUB будет переустановлен в раздел EFI автоматически или он будет установлен в корневой раздел, где установлена ​​Ubuntu? Очевидно, я не хочу, чтобы это произошло.

14 ответов

Решение

Переустановите загрузчик GRUB в вашу установку Ubuntu в режиме EFI следующим образом...

Загрузитесь с установочного носителя Ubuntu и выберите "Попробуйте Ubuntu без установки".
(Загрузите установочный носитель в режиме EFI, выберите запись Ubuntu с UEFI впереди.)

На рабочем столе Live откройте терминал и выполните следующие команды:

sudo mount /dev/sdXXX /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  

Замечания: sdX = диск | sdXX = EFI раздел | sdXXX = системный раздел

Для идентификации разделов используйте GParted, инструмент входит в установочный носитель.
После выполнения команд GRUB будет установлен в отдельный раздел EFI.

Это единственный способ, который работал для меня: (Система: sdb8, boot: 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

Вот как я сделал это на стандартном рабочем столе x86_amd64 EFI без chroot, предполагая, что у вас есть раздел, содержащий Ubuntu на вашем жестком диске и, возможно, раздел EFI, на котором должен быть установлен GRUB.

# 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

За последние месяцы были внесены некоторые обновления в задействованные библиотеки.

Следующие шаги были полезны для меня. Они взяли идеи из старых ответов, а также с других форумов.

Убедитесь, что вы загрузились с помощью EFI


Запустить 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

Убедись, что перечисляет ваш 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 

Примечание: sdX = диск | sdXX = раздел EFI | sdXY = загрузочный раздел | sdXXX = системный раздел

Кроме того, при загрузке с live cd для восстановления может случиться так, что вам не хватает пакета grub-efi-amd64-bin, а затем строка

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

завершается с сообщением об ошибке: "grub-install: error: /usr/lib/grub/x86_64-efi/modinfo.sh не существует. Пожалуйста, укажите --target или --directory."

В этом случае запустите это вне chroot

sudo apt get grub-efi-amd64-bin

а затем добавьте / usr / lib / grub / x86_64-efi в монтирование chroot.

Кстати, параметр "/dev/sdb" устарел и игнорируется.

Я не могу комментировать (недостаточно репутации), но ответ @Chilu Pereira - это то, что нужно делать в ситуации с EFi или мультизагрузкой. Это похоже на подход в gentoo-guide. Они используют несколько иной подход: вместо mount --bindони используют mount --rbindс последующим mount --make-rslaveдля sys и dev и proc снова просто монтируются. В gentoo я создавал монтирования из live-системы следующим образом:

      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кстати ?)

Но сегодня я получил две ошибки в chroot от grub2, с которыми никогда раньше не сталкивался:

       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.

Ошибка zfs-fuse вроде не имеет значения, но для Efivars пришлось добавить еще одно монтирование:

      mount --bind /sys/firmware/efi/efivars /mnt/sys/firmware/efi/efivars

Я предполагаю, что /sys/firmware/efi/efivars не существует в chroot или, может быть, только для чтения, но в любом случае это сработало.

Если вы потеряли раздел EFI, его легко вернуть. Ты можешь использовать fdisk или же parted создать новый раздел GPT с типом "EFI partition (1)" и отформатировать его:

sudo mkfs.msdos /dev/sdX

затем смонтировать его, и вы можете следовать запустить:

sudo grub-install /dev/sdX

как и в других решениях.

В дополнение к ответу ci-netbox.
Если ваша версия pendrive OS не совпадает с версией, установленной на диске, у grub-install могут возникнуть трудности с определением правильной установки grub:

$ 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:

# grub-install --target=x86_64-efi /dev/sdX 
Installing for x86_64-efi platform.
Installation finished. No error reported.

Мне потребовалось некоторое время, чтобы заблудиться, делая это. У меня такая же настройка (незашифрованная/загрузка в ДОПОЛНЕНИЕ к vfat/boot/efi). Следующее руководство по Debian поможет вам в этом. Отсутствующие части из всех других руководств касались установки efivars и просто исчерпывающих шагов по переустановке grub и т. д. Надеюсь, это поможет!

https://wiki.debian.org/GrubEFIReinstall

Подробная информация о конкретных частях, которые отсутствовали в других ответах здесь:

  • включить efivars в chroot всю установку grub

            for i in /dev /dev/pts /proc /sys /sys/firmware/efi/efivars /run; do sudo mount -B $i /mnt$i; done
    
  • не забудьте смонтировать/bootа потом также/boot/efiв chroot

  • запустить все команды grub

            apt-get install --reinstall grub-efi
    grub-install /dev/disk
    update-grub
    

Спасибо дебиан!!

Поэтому я думаю, что причина проблемы в том, что установка Ubuntu не монтирует раздел efi, если fstab. и обновления grub. на обновлении.

Самым простым для меня было использовать этот небольшой инструмент (20 МБ), который позволит вам загрузить сломанную систему grub (я использовал Ventoy для загрузки инструмента):

https://www.supergrubdisk.org/category/download/supergrub2diskdownload/

И как только инструмент сотворит свое волшебство и загрузит вашу Linux-систему, выполните:

      sudo grub-install /dev/nvme0n1
sudo update-grub

Только что использовал этот инструмент https://help.ubuntu.com/community/Boot-Repair в Ubuntu. Это был самый простой способ, и все было автоматически.

Я использовал Grub-Customizer. Я знаю, что некоторым из вас не нравится эта программа, но в некоторых случаях она очень удобна (переименовать Ubuntu в Kubuntu (не обязательно делать это в 'etc/grub.d/10_Linux_Proxy'), добавить тему, или в этом случае.

Файл --> Установить в MBR.

И все было сделано.

Я не использую ОС на базе Linux так долго (уже 7 или 8 месяцев), и если мне нужно записать все для использования в командной строке, это не только займет много времени (в основном запись), но я так можно ошибиться.

У меня был мой загрузчик Windows в разделе 1 и grub2 в другом разделе EFI (8)(не хотел портить загрузчик Windows), поэтому каждый раз, когда я хотел использовать свой Kubuntu (ежедневно) или ОС Mint, мне приходилось нажимать F11, подождите, выберите USB (не спрашивайте меня, почему), выберите Ubuntu, затем снова подождите Grub, а затем выберите мою ОС на базе Linux. Теперь я получаю Grub2 почти мгновенно.

Обновление 211111/1135 Подобно тому, как Organic Marble прокомментировал: «MBR не подходит для системы UEFI», он прав. Это сработало, но только один раз. Что я сделал, так это установил Grub2Win в мою установку Win10. Из Kubuntu я мог экспортировать свой «grub.conf» в раздел «Мои документы» (NTFS, поэтому Win10 может его прочитать) и импортировать его в Grub2Win. Теперь он работает так, как должен.

PS. Я сохранил эту страницу, поэтому знаю, как это сделать, когда избавлюсь от Windows.

Другие вопросы по тегам