A máquina UEFI não inicializa o Ubuntu através do bootcatalog NVRAM. Como consertar?

4
  

Uma resposta postada aqui deve:

     
  • Evite exigir que o usuário faça o download e instale pacotes ou PPAs adicionais.
  •   
  • Seja o mais rápido e simples possível. (Eu tentei reparo de inicialização e não se qualificou.)
  •   
  • Provavelmente, forneça um script para usuários que não têm muita experiência com o terminal.
  •   

Problemas semelhantes como estes foram publicados várias vezes no site:

  • Um lançamento recente do Ubuntu foi instalado com êxito em uma máquina compatível com UEFI que veio com uma cópia pré-instalada do Windows 8 ou posterior.
    • A saída de efibootmgr -v mostra que /efi/ubuntu/shimx64.efi foi registrado como ubuntu . (Essas novas entradas de inicialização são geralmente adicionadas com a prioridade mais alta. Consulte também Altere a ordem de inicialização usando efibootmgr )
    • Após a reinicialização, nenhum menu de seleção do sistema operacional (GRUB) foi exibido e a máquina inicializou diretamente no Windows.
  • Quando acessa o menu de configurações do firmware (anteriormente chamado de BIOS):
    • Não há nenhuma indicação de como alterar a ordem de inicialização para sistemas operacionais individuais ou não há sistemas operacionais (como Windows Boot Manager ) exibidos, apenas dispositivos.
    • O recurso Inicialização segura está desativado nas configurações de firmware.
  • O Ubuntu foi instalado por inicialização da mídia ao vivo no modo UEFI , não por executando o WUBI -Installer no Windows.
  • A própria instalação do Windows não foi modificada, substituída ou apagada.
    • A unidade contém uma tabela de partições GPT.
    • O Gerenciamento de Disco do Windows mostra que pelo menos as 3 partições a seguir existem no disco:
      • Partição do sistema EFI
      • partição do Windows
      • uma partição RAW ilegível que pode ser a instalação do Ubuntu
  • Você tentou remover o diretório \EFI\BOOT\ completamente, antes de (!) fazer o backup.

Isso geralmente indica um problema com o bootloader ou bootprocess padrão que é um pouco codificado para inicializar o Windows. Na maioria dos casos, isso pode ser corrigido facilmente substituindo \EFI\BOOT\BOOTx64.EFI por outro arquivo que também permita inicializar outros sistemas operacionais.

    
por LiveWireBT 14.11.2014 / 17:42

2 respostas

4

A resposta curta

Você pode criar um binário bootx64.efi dentro da mídia ao vivo do Ubuntu com grub-mkimage e escreva um grub.cfg personalizado para carregar em cadeia os carregadores que você não deseja inicializar e copiar ambos os arquivos para a partição de sistema EFI (ESP) no diretório \EFI\BOOT\ .

Se você não souber como se locomover no terminal, o script disponível na próxima seção desta resposta fará isso para você. Para mais detalhes, consulte a seção Detalhes técnicos em A resposta mais longa .

Escrito para sua conveniência

Com relação a este script:

  • Esteja avisado que este script instala o pacote grub-efi-amd64 em que ele é executado e, portanto, quebrará as instalações do MBR herdado . Provavelmente, apenas execute-o a partir de mídia ao vivo, se possível.
  • De preferência, você já conhece o nome do dispositivo do seu ESP.
  • Basta colar o código abaixo em um terminal aberto Ctrl + Alt + t e executá-lo Enter .
  • Você pode cancelar scripts e programas no terminal com Crtl + c .
  • Os arquivos na unidade em que a mídia ao vivo foi inicializada podem ser acessados por meio de /isodevice . GUI: Computador isodevice no Nautilus / File Manager.
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

A resposta mais longa

O problema

A especificação UEFI recomenda que os implementadores de firmware inicializem por meio de um carregador de inicialização padrão denominado \EFI\BOOT\BOOT{arch}.EFI para inicializar a partir de fontes externas. mídia, por exemplo onde depender de entradas NVRAM na plataforma - a placa principal dos computadores - para inicializar um sistema operacional específico não é possível. Os valores atualmente definidos para arch são x64 para AMD64, ia32 para i386 e ARM ou A64 para ARM.

O Windows e o Fedora instalam esse bootloader no ESP, enquanto o Ubuntu atualmente não o faz. O firmware em alguns computadores - como laptops econômicos - mostra um comportamento em que esses dispositivos parecem ignorar completamente os bootloaders UEFI registrados corretamente no bootcatalog da NVRAM e usar como padrão a inicialização de \EFI\BOOT\BOOT{arch}.EFI , o que geralmente resulta na inicialização do Windows em vez do Ubuntu.

Detalhes técnicos

Esta configuração atualmente não suporta Boot Seguro e também não foi testada para computadores Apple, já que não possuo tal máquina. (Ajuda é muito apreciada.)

Se não ficou claro até agora: Isso também permitirá inicializar as instalações do sistema operacional no disco em outro computador com capacidade para UEFI, semelhante a como foi com o MBR herdado.

Gerando a imagem bootx64.efi com o 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

Criando um arquivo grub.cfg correspondente

Esta configuração cobre os casos básicos de inicialização do Ubuntu, inicialização do Windows e inicialização da configuração do firmware. A última entrada permite montar o loop e inicializar uma imagem ISO, o que pode parecer estranho no início porque o ESP geralmente tem apenas algumas centenas de megabytes e não pode armazenar arquivos grandes, mas ambos os arquivos também funcionam em drives USB formatados pela FAT. Um drive USB de inicialização múltipla com vários ISOs está a apenas algumas edições. Além disso, você poderia facilmente substituir ubuntu por fedora para criar outra entrada de menu que inicialize o Fedora ou qualquer outra distribuição Linux, apenas dê uma olhada no conteúdo de seu 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
}

Apêndice

E quanto ao gummiboot e ao PreLoader?

Eu postei algo assim no passado e não há nada de errado com isso, tanto quanto eu posso ver. Até funciona com inicialização segura. Bom, se funcionou para você, mas a experiência do usuário, incluindo o download, a criação e a extração de vários arquivos manualmente, não é ideal e bastante difícil para o usuário comum.

Exemplo de saída

Exemplo de saída da execução do script a partir da mídia ao vivo:

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. ---
    
por LiveWireBT 14.11.2014 / 17:42
1
  

A saída do efibootmgr -v mostra que /efi/ubuntu/shimx64.efi tem   foi registrado como ubuntu. (Essas novas entradas de inicialização são geralmente adicionadas   com a maior prioridade.)

Uma saída do efibootmgr teria ajuda para determinar se o pedido estava correto.

Então, do meu ponto de vista, é uma questão de alterar a ordem de inicialização para que a entrada para o grub seja o padrão. Eu também tive esse problema.

Como você não pode inicializar no Ubuntu para resolver isso ou fazer isso no UEFI / BIOS, você pode inicializar um LiveCD do Ubuntu e instalá-lo em um terminal ou console

Você abre um temporário e roda

# 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

e você altera a ordem das entradas de inicialização

# efibootmgr -o 0002,0003,0004,2001

e execute novamente o efibootmgr para verificar se a mudança é efetiva. ele deve mudar o valor do bootnext demais que você pode executar

# efibootmgr -n 0002
    
por solsTiCe 04.12.2014 / 14:28