Машина UEFI не загружает Ubuntu через NVRAM bootcatalog. Как зафиксировать?

Ответ, отправленный здесь, должен:

  • Постарайтесь не требовать, чтобы пользователь загрузил и установил дополнительные пакеты или PPAs.
  • Будьте так же быстры и просты как possbile. (Я попробовал восстановление начальной загрузки, и оно не квалифицировало.)
  • Вероятно, предоставьте сценарий пользователям, у которых нет большого опыта с терминалом.

Подобные проблемы как они несколько раз размещались на сайте:

  • Недавний релиз Ubuntu был успешно установлен на UEFI-способной машине, которая шла с предварительно установленной копией Windows 8 или позже.
    • Вывод efibootmgr -v шоу это /efi/ubuntu/shimx64.efi был зарегистрирован как ubuntu. (Эти новые записи загрузки обычно добавляются с самым высоким приоритетом. См. также порядок загрузки Изменения с помощью efibootmgr),
    • После перезагрузки никакое меню выбора OS (GRUB) не показали и машина, загруженная непосредственно к Windows.
  • При доступе к микропрограммному меню параметров (раньше названный BIOS):
    • Нет никакого признака того, как изменить порядок загрузки для indivual операционных систем или нет никаких операционных систем (как Windows Boot Manager) отображенный вообще, только устройства.
    • Функция Secure Boot выключена в микропрограммных настройках.
  • Ubuntu была установлена путем начальной загрузки живых медиа в режиме UEFI, не путем выполнения WUBI-установщика в Windows.
  • Сама установка Windows не была изменена, заменена или стерта.
    • Диск содержит таблицу разделов GPT.
    • Windows Diskmanagement показывает, что, по крайней мере, следующие 3 раздела существуют на диске:
      • Системный раздел EFI
      • Раздел Windows
      • нечитабельный НЕОБРАБОТАННЫЙ раздел, который мог быть установкой Ubuntu
  • Вы пытались удалить \EFI\BOOT\ каталог полностью, перед(!) резервным копированием его.

Это обычно указывает на проблему с загрузчиком по умолчанию или bootprocess, являющимся несколько hardcoded для начальной загрузки Windows. В большинстве случаев это может легко быть зафиксировано путем замены \EFI\BOOT\BOOTx64.EFI с другим файлом, который также допускает начальную загрузку других операционных систем.

4
задан 26 May 2018 в 20:20

2 ответа

Короткий ответ

Можно создать a bootx64.efi двоичный файл из Ubuntu живые медиа с личинкой-mkimage и записью пользовательское grub.cfg к chainload загрузчики Вы wan't, чтобы загрузиться и скопировать оба файла в Системный раздел EFI (ESP) в каталог \EFI\BOOT\.

Если Вы не будете знать свой путь вокруг в терминале, то сценарий, доступный в следующем разделе этого ответа, сделает это для Вас. Для получения дополнительной информации взгляните на раздел Технических деталей в более длинном ответе.

Заданный сценарием для Вашего удобства

Относительно этого сценария:

  • Предупредите, что этот сценарий устанавливает grub-efi-amd64 пакет, куда это работает и поэтому повредит установки MBR прежней версии. Вероятно, только выполните его из живых медиа, если это возможно.
  • Предпочтительно Вы уже знаете имя устройства своего ESP.
  • Вы просто вставляете код ниже в открытый терминальный Ctrl+Alt+t и работаете, он Входит.
  • Можно отменить сценарии и программы в терминале с Crtl+c.
  • Файлы на диске, от которого были загружены живые медиа, доступны до /isodevice. GUI: Компьютеризоустройство в Наутилусе/Файловом менеджере.
echo -en "\ec"; \
if [ -e "/boot/efi/EFI" ] && [ $(mount | grep -c "/boot/efi type vfat") -gt 0 ]; then \
    esp=$(mount | grep "/boot/efi type vfat" | sed -e 's/ on.*//'); \
    echo "The following device appears to be mounted as an EFI System Partition: $esp"; \
    read -p "Is that correct \"yes\" or \"no\"? Note, that answering \"no\" will unmount $esp! " correctesp; \
    if [ "$correctesp" == "no" ]; then \
        sudo umount "$esp"; \
    elif [ "x$correctesp" != "xyes" ]; then \
        echo "Invalid input, refusing to do anything."; \
    fi; \
fi; \
if ! [ -e "/boot/efi/EFI" ] && ! [ $(mount | grep -c "/boot/efi type vfat") -gt 0 ]; then \
    echo "Possible EFI System Partitions (ESP) found, but none appear to be mounted:"; \
    sudo blkid -t TYPE="vfat"; \
    read -p "Please enter the device name of your ESP (/dev/sd[a-z][1-9]): " esp; \
    sudo mkdir -p "/boot/efi"; \
    if [ "$(echo $esp | cut -c 1-5)" == "/dev/" ]; then \
        sudo mount "$esp" "/boot/efi"; \
    else \
        echo "Invalid input, refusing to do anything."; \
    fi; \
    sudo mkdir -p "/boot/efi/EFI"; \
    correctesp="yes"; \
fi; \
if [ -e "/boot/efi/EFI" ] && [ $(mount | grep -c "/boot/efi type vfat") -gt 0 ] && [ "$correctesp" == "yes" ]; then \
    project="$HOME/uefi-bootfix"; \
    mkdir -p "$project"; \
    echo "--- Begin installing grub-efi-amd64 package (could throw some dpkg errors) ---"; \
    sudo apt-get install -y grub-efi-amd64; \
    echo "--- End of installing grub-efi-amd64 ---"; \
    echo "--- Installing GRUB EFI image and configuration to ESP ---"; \
    grub-mkimage -o "$project/bootx64.efi" -p "/efi/boot" -O x86_64-efi fat iso9660 part_gpt part_msdos normal boot linux configfile loopback chain efifwsetup efi_gop efi_uga ls search search_label search_fs_uuid search_fs_file exfat ext2 ntfs btrfs hfsplus udf; \
    echo -e "set timeout=3\nmenuentry 'Ubuntu' {\n\tchainloader /efi/ubuntu/grubx64.efi\n}\nmenuentry 'Windows' {\n\tchainloader /efi/Microsoft/Boot/bootmgfw.efi\n}\nmenuentry 'Firmware Setup' {\n\tfwsetup\n}\nmenuentry 'ubuntu-14.04.1-desktop-amd64.iso' {\n\tset isofile="/efi/boot/ubuntu-14.04.1-desktop-amd64.iso"\n\tloopback loop $isofile\n\tlinux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile noprompt noeject quiet splash\n\tinitrd (loop)/casper/initrd.lz\n}" > "$project/grub.cfg"; \
    sudo mkdir -p "/boot/efi/EFI/boot"; \
    if [ -e "/boot/efi/EFI/boot/bootx64.efi" ]; then \
        sudo cp -v "/boot/efi/EFI/boot/bootx64.efi" "/boot/efi/EFI/boot/bootx64_uefi-bootfix-backup-$(date +%F_%H-%M-%S).efi"; \
    fi; \
    sudo cp -v "$project/bootx64.efi" "/boot/efi/EFI/boot/bootx64.efi"; \
    sudo cp -v "$project/grub.cfg" "/boot/efi/EFI/boot/grub.cfg"; \
    echo "--- Done. ---"; \
fi

Более длинный ответ

Проблема

Спецификация UEFI рекомендует микропрограммным реализаторам загрузиться через названный загрузчик по умолчанию \EFI\BOOT\BOOT{arch}.EFI для начальной загрузки от внешних медиа, например, где, полагаясь на записи NVRAM в платформе – системная плата компьютеров – для начальной загрузки конкретной операционной системы не возможна. В настоящее время определяемые значения для arch x64 для AMD64, ia32 для i386 и ARM илиA64 для ARM.

Windows и Fedora устанавливают такой загрузчик на ESP, в то время как Ubuntu в настоящее время не делает. Встроенное микропрограммное обеспечение в некоторых компьютерах – как ноутбуки за умеренную цену – показывает поведение, где эти устройства кажутся completly, игнорируют правильно зарегистрированные загрузчики UEFI в NVRAM bootcatalog и значении по умолчанию к начальной загрузке от \EFI\BOOT\BOOT{arch}.EFI, который будет обычно приводить к начальной загрузке Windows вместо Ubuntu.

Технические детали

Эта конфигурация в настоящее время не поддерживает Защищенную загрузку и также не была протестирована на компьютеры Apple, поскольку я не владею такой машиной. (Справка очень ценится.)

Если это не было ясно до сих пор: Это также позволит загружать установки ОС на диске в другом UEFI-способном компьютере, подобном тому, как это было с MBR прежней версии.

Генерация bootx64.efi изображение с GRUB

grub-mkimage -o bootx64.efi -p /efi/boot -O x86_64-efi fat iso9660 part_gpt part_msdos normal boot linux configfile loopback chain efifwsetup efi_gop efi_uga ls search search_label search_fs_uuid search_fs_file exfat ext2 ntfs btrfs hfsplus udf

Создание соответствия grub.cfg файл

Эта конфигурация касается основных случаев начальной загрузки Ubuntu, начальной загрузки Windows и запуска микропрограммной установки. Последняя запись позволяет, чтобы цикл монтировал и загрузил ISO-образ, который мог бы выглядеть нечетным сначала, потому что ESP обычно только несколько сотен мегабайтов шириной и не может хранить такие большие файлы, но оба файла также работают над отформатированными Картами памяти FAT. Карта памяти мультиначальной загрузки с несколькими ISOs является всего несколькими редактированиями далеко. Также Вы могли легко заменить ubuntu с fedora для создания другая запись меню, которая загружает Fedora или любой другой дистрибутив Linux, просто взгляните на содержание ESP.

set timeout=3
menuentry 'Ubuntu' {
    chainloader /efi/ubuntu/grubx64.efi
}
menuentry 'Windows' {
    chainloader /efi/Microsoft/Boot/bootmgfw.efi
}
menuentry 'Firmware Setup' {
    fwsetup
}
menuentry 'ubuntu-14.04.1-desktop-amd64.iso' {
    set isofile="/efi/boot/ubuntu-14.04.1-desktop-amd64.iso"
    loopback loop $isofile
    linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile noprompt noeject quiet splash
    initrd (loop)/casper/initrd.lz
}

Приложение

Что относительно gummiboot и PreLoader?

Я отправил что-то как этот в прошлом и нет ничего неправильно с этим насколько я вижу. Это даже работает с Защищенной загрузкой. Хороший, если это работало на Вас, но пользовательский опыт включая загрузку, создание и извлечение нескольких файлов вручную не является довольно оптимальным и довольно трудным для среднего пользователя.

Пример производится

Вывод в качестве примера запущения скрипта от живых медиа:

Possible EFI System Partitions (ESP) found, but none appear to be mounted:
/dev/sda1: LABEL="ESP W8" UUID="8AEF-2F66" TYPE="vfat" 
/dev/sdb1: LABEL="ESP HDD" UUID="CBB5-B769" TYPE="vfat" 
/dev/sdc1: LABEL="ESP EVO" UUID="288D-5954" TYPE="vfat" 
/dev/sdd1: LABEL="SANDISK" UUID="B67A-5BFF" TYPE="vfat" 
Please enter the device name of your ESP (/dev/sd[a-z][1-9]): /dev/sdb1
--- Begin installing grub-efi-amd64 package (could throw some dpkg errors) ---
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  efibootmgr grub-efi-amd64-bin
The following packages will be REMOVED:
  grub-gfxpayload-lists grub-pc
The following NEW packages will be installed:
  efibootmgr grub-efi-amd64 grub-efi-amd64-bin
0 upgraded, 3 newly installed, 2 to remove and 0 not upgraded.
Need to get 0 B/722 kB of archives.
After this operation, 2,399 kB of additional disk space will be used.
Preconfiguring packages ...
(Reading database ... 169555 files and directories currently installed.)
Removing grub-gfxpayload-lists (0.6) ...
Removing grub-pc (2.02~beta2-9ubuntu1) ...
Processing triggers for man-db (2.6.7.1-1) ...
Selecting previously unselected package efibootmgr.
(Reading database ... 169536 files and directories currently installed.)
Preparing to unpack .../efibootmgr_0.5.4-7ubuntu1_amd64.deb ...
Unpacking efibootmgr (0.5.4-7ubuntu1) ...
Selecting previously unselected package grub-efi-amd64-bin.
Preparing to unpack .../grub-efi-amd64-bin_2.02~beta2-9ubuntu1_amd64.deb ...
Unpacking grub-efi-amd64-bin (2.02~beta2-9ubuntu1) ...
Selecting previously unselected package grub-efi-amd64.
Preparing to unpack .../grub-efi-amd64_2.02~beta2-9ubuntu1_amd64.deb ...
Unpacking grub-efi-amd64 (2.02~beta2-9ubuntu1) ...
Processing triggers for man-db (2.6.7.1-1) ...
Setting up efibootmgr (0.5.4-7ubuntu1) ...
Setting up grub-efi-amd64-bin (2.02~beta2-9ubuntu1) ...
Setting up grub-efi-amd64 (2.02~beta2-9ubuntu1) ...
Installing for x86_64-efi platform.
grub-install: error: failed to get canonical path of `/cow'.
dpkg: error processing package grub-efi-amd64 (--configure):
 subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
 grub-efi-amd64
E: Sub-process /usr/bin/dpkg returned an error code (1)
--- End of installing grub-efi-amd64 ---
--- Installing GRUB EFI image and configuration to ESP ---
‘/boot/efi/EFI/boot/bootx64.efi’ -> ‘/boot/efi/EFI/boot/bootx64_uefi-bootfix-backup-2014-11-13_22-39-42.efi’
‘/home/ubuntu/uefi-bootfix/bootx64.efi’ -> ‘/boot/efi/EFI/boot/bootx64.efi’
‘/home/ubuntu/uefi-bootfix/grub.cfg’ -> ‘/boot/efi/EFI/boot/grub.cfg’
--- Done. ---
4
ответ дан 1 December 2019 в 09:36

вывод efibootmgr-v показывает, что/efi/ubuntu/shimx64.efi был зарегистрирован как человечность. (Эти новые записи загрузки обычно добавляются с самым высоким приоритетом.)

вывод efibootmgr имел бы справку определенной, если бы порядок был корректен.

Так от моего понимания, это - вопрос изменения порядка загрузки так, чтобы запись для личинки была значением по умолчанию. У меня была та проблема также.

, Поскольку Вы не можете загрузиться в человечность, чтобы решить это или сделать это в UEFI/BIOS, можно загрузить LiveCD Ubuntu и заскочить в терминал или консоль

, Вы открываете teminal и работаете

# sudo -i
# apt-get install efibootmgr
# efibootmgr
BootCurrent: 0003
Timeout: 0 seconds
BootOrder: 0003,0002,0004,2001
Boot0000* UEFI Onboard LAN IPv6
Boot0001* UEFI Onboard LAN IPv4
Boot0002* ubuntu
Boot0003* Windows Boot Manager
Boot0004* Ubuntu
Boot2001* EFI USB Device

, и Вы изменяете порядок записей загрузки

# efibootmgr -o 0002,0003,0004,2001

и работаете снова efibootmgr, чтобы проверить, что изменение является эффективным. это должно изменить значение bootnext слишком еще, можно работать

# efibootmgr -n 0002
1
ответ дан 1 December 2019 в 09:36

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

Похожие вопросы: