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. ---