Как восстановить загрузочный раздел EFI?

10

Я установил Fedora на свой компьютер с /разделом, swapразделом и ESPразделом для загрузки EFI.

Теперь я устанавливал ОС Elementary вместо Fedora.

  1. Я отформатировал /раздел (/ dev / sda3)
  2. Отформатировал раздел подкачки (/ dev / sda4)
  3. Но не форматировал загрузочный раздел EFI (/ dev / sda1)

Теперь, когда я загружаюсь, я получаю свое старое меню grub, которое было установлено Fedora. Я могу загрузиться только в Elementary OS:

  1. Вход в меню загрузки.
  2. Выбор загрузки из файла EFI
  3. Перейдите /dev/sda1/, чтобы получить elementaryкаталог, содержащий grubx64.efiфайл. Который есть /boot/efi/EFI/elementary/grubx64.efi.

Как я могу это исправить? Я думал о форматировании загрузочного раздела /dev/sda1/с fat16чем-то, а затем переустановил grub на него.

Мой /dev/sda1сейчас содержит это:

root@rafael:/home/rafael# ls /boot/efi/
EFI  mach_kernel  System

root@rafael:/home/rafael# ls /boot/efi/EFI/
BOOT/       elementary/ fedora/     

root@rafael:/home/rafael# ls /boot/efi/EFI/fedora/
BOOT.CSV  fonts  gcdx64.efi  grub.cfg  grubx64.efi  MokManager.efi  shim.efi  shim-fedora.efi

root@rafael:/home/rafael# ls /boot/efi/EFI/elementary/
grubx64.efi

Вот мой efibootmgrвывод:

BootCurrent: 003D
Timeout: 0 seconds
BootOrder: 2001,2002,2003
Boot0000* Notebook Hard Drive
Boot0010* Internal CD/DVD ROM Drive
Boot0011* Internal CD/DVD ROM Drive (UEFI)
Boot0012* Fedora
Boot0013* Fedora
Boot0014* Fedora
Boot0015* Fedora
Boot0016* Fedora
Boot0017* Fedora
Boot0018* Fedora
Boot0019* Fedora
Boot001A* Fedora
Boot001B* Fedora
Boot001C* Fedora
Boot001D* Fedora
Boot001E* Fedora
Boot001F* elementary
Boot2001* USB Drive (UEFI)
Boot2002* Internal CD/DVD ROM Drive (UEFI)

Любая помощь будет оценена.

Рафаэль Адель
источник
1
Я могу только предложить этот набор статей, никогда не использовал EFI сам: rodsbooks.com/efi-bootloaders/index.html , rodsbooks.com/efi-bootloaders/index.html , rodsbooks.com/gdisk/whatsgpt.html .
Борис Бурков
1
Есть ли в вашей реализации UEFI меню выбора загрузки, например, F8 или около того? Пожалуйста, опубликуйте efibootmgrвывод, чтобы было видно, есть ли запись элементарного элемента (кажется, что нет, но чтобы быть уверенным). Вам также может понравиться refind в качестве менеджера загрузки. На всякий случай, если вы хотите быстро взглянуть на E17 в этой системе, есть изображение, которое просто работает (490M ISO), а также еженедельные снимки . Вероятно, уступает в отношении E polis
Михаил Шигорин
@MichaelShigorin Хорошо, я добавил efibootmgrвывод.
Рафаэль Адель

Ответы:

5

Я не знаю, почему вы используете Grub в первую очередь. UEFI действует как загрузчик и позволяет выбирать различные операционные системы или отдельные ядра из меню загрузки. Хотя есть некоторые исключения, обычно нет необходимости связывать второй загрузчик, в данном случае, grub.

Вы упоминаете, что вы установили элементарную ОС вместо Fedora, что означает, что вам нужно загрузить только одну операционную систему. Здесь я представляю способ сделать это без использования Grub. Ядро должно быть скомпилировано с EFI_STUB, если это так, вы можете проверить с помощью

grep EFI_STUB /boot/config-<version>

Скопируйте ядро ​​и initramfs в ESP (системный раздел EFI)

cp /boot/vmlinuz-<version> /boot/efi/EFI/elementary/vmlinuz-<version>.efi
cp /boot/initrd.img-<version> /boot/efi/EFI/elementary/initrd.img-<version>

Зарегистрировать ядро ​​в качестве опции загрузки в UEFI

echo "root=UUID=<disk_uuid> ro quiet rootfstype=ext4 add_efi_memmap initrd=\\EFI\\elementary\\initrd.img-<version>" |
  iconv -f ascii -t ucs2 |
  efibootmgr \
    --create --gpt \
    --disk /dev/<disk> --part <partition_number> \
    --label "Elementary OS" \
    --loader "\\EFI\\elementary\\vmlinuz-<version>.efi" \
    --write-signature --append-binary-args -

--diskАргумент принимает имя устройства диска, например --disk /dev/sda, то --partаргумент принимает номер раздела ЭСПА, например , 4. Вы можете найти номер раздела ESP с помощью следующей команды:

gdisk -l /dev/sda | awk '$6=="EF00" {print $1}'

Убедитесь, что вы повторяете шаги после каждого обновления ядра

Либо вы делаете это вручную (просто повторите шаги, описанные выше), либо вы пишете небольшой скрипт, который выполняет эту работу. Чтобы полностью автоматизировать его, сценарий можно подключить к процедуре постустановки ядра, процедуре пост-обновления initramfs и процедуре ядра postrm (чтобы удалить загрузочную запись UEFI). На самом деле, я не знаю, почему это не делается по умолчанию в дистрибутивах, это всего лишь несколько строк кода.

Marco
источник
Хм, я сделал, grep EFI_STUB /boot/config-3.2.0-49-genericно ничего не получил.
Рафаэль Адель
Ядро 3.2 слишком старое (с января 2012 года) для поддержки EFI_STUB. Вам нужно как минимум ядро ​​3.3.
Марко
@RafaelAdel Если вы не хотите создавать свое собственное ядро, вы можете проверить наличие новой версии ядра в репозиториях программного обеспечения. Элементарный, кажется, основан на Ubuntu, и ядро ​​3.5 или 3.8 должно быть доступно. Более новые, более вероятно, будут иметь EFI_STUB включен.
Марко
На самом деле есть ядро ​​3.10.1 сейчас. Собираюсь попробовать.
Рафаэль Адель
2
Марко, советующий использовать заглушки, безответственен, если только вы не хотите направлять каждого пользователя через то, что не поддерживается его дистрибутивом, и не передавать его как «делайте после каждого обновления ядра». Это хорошо, но не так хорошо автоматизировать, я говорю вам это как парень, который отвечает за поддержку UEFI в ALT Linux.
Михаил Шигорин
2

Я это сделал !

Прежде всего, я удалил все ненужные загрузочные записи:

efibootmgr -b <entry_hex_number> -B

Затем переформатирование раздела ESP с FAT32файловой системой.

mkfs.vfat -F32 /dev/sda1

Затем установил личинку для /dev/sdaНЕ/dev/sda1

grub-install /dev/sda
Рафаэль Адель
источник
3
Вам не нужна grub-install, которая пишет MBR. Я не знаю, выполняет ли grub вашего дистрибутива две вещи вместе, но вам нужно скопировать grubx64.efi (или shim.efi) в / boot / efi / EFI / $ distro / и efibootmgr -c -l / boot /efi/EFI/$distro/grubx64.efi.
Линчжу Сян
1
grub-install научился обрабатывать EFI (вы можете принудительно сделать это с помощью --target = x86_64-efi, но efivars.ko должен быть загружен к этому времени в любом случае).
Михаил Шигорин