Como recriar a partição de inicialização EFI?


10

Eu instalei o Fedora na minha máquina com /partição, swappartição e ESPpartição para inicialização EFI.

Agora, eu estava instalando o Elementary OS em vez do Fedora.

  1. /Formatei a partição (/ dev / sda3)
  2. Formatou a partição swap (/ dev / sda4)
  3. Mas não formatou a partição de inicialização EFI (/ dev / sda1)

Agora, quando eu inicializo, recebo meu menu grub antigo que foi instalado pelo Fedora. Só consigo inicializar no sistema operacional elementar por:

  1. Entrando no menu de inicialização.
  2. Selecionando a inicialização do arquivo EFI
  3. Navegue até /dev/sda1/o elementarydiretório que contém o grubx64.efiarquivo. Qual é /boot/efi/EFI/elementary/grubx64.efi.

Como posso corrigir isso? Pensei em formatar a partição de boot /dev/sda1/com fat16ou alguma coisa, então re-instalar o grub nele.

Meu /dev/sda1agora contém isso:

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

Aqui está a minha efibootmgrsaída:

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)

Qualquer ajuda seria apreciada.



1
Sua implementação UEFI possui algum tipo de menu de seleção de inicialização, como o F8 ou mais? Por favor, publique a efibootmgrsaída para que seja possível ver se a entrada do elementary está lá (parece que não é, mas é claro). Você também pode gostar de refind como seu gerenciador de inicialização. Caso você queira dar uma olhada rápida no E17 nesse sistema, há uma imagem que funciona (link ISO 490M), bem como instantâneos semanais . Provavelmente é inferior em relação à E polis #
Michael Shigorin

@MichaelShigorin Ok, eu adicionei efibootmgrsaída.
Rafael Adel

Respostas:


5

Não sei por que você está usando o grub em primeiro lugar. O UEFI atua como um carregador de inicialização e permite selecionar diferentes sistemas operacionais ou kernels individuais em um menu de inicialização. Embora existam algumas exceções, geralmente não é necessário encadear um segundo carregador de inicialização, grub neste caso.

Você mencionou que instalou o sistema operacional elementar em vez do Fedora, o que significa que você só precisa carregar um sistema operacional. Aqui apresento uma maneira de fazer isso sem usar o grub. O kernel precisa ser compilado com EFI_STUB, se for esse o caso, você pode verificar com

grep EFI_STUB /boot/config-<version>

Copie o kernel e o initramfs para o ESP (partição do sistema EFI)

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

Registrar o kernel como opção de inicialização no 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 -

O --diskargumento usa o nome do dispositivo do disco, por exemplo --disk /dev/sda, o --partargumento usa o número da partição do ESP, por exemplo 4. Você pode encontrar o número da partição do ESP com o seguinte comando:

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

Certifique-se de repetir as etapas após cada atualização do kernel

Você faz isso manualmente (basta repetir as etapas acima) ou escreve um pequeno script que faz o trabalho. Para automatizá-lo completamente, o script pode ser conectado ao procedimento de pós-instalação do kernel, ao procedimento de pós-atualização do initramfs e ao procedimento postrm do kernel (para remover a entrada de inicialização UEFI). Na verdade, não sei por que isso não é feito por padrão nas distribuições, são apenas algumas linhas de código.


Hmmm, consegui, grep EFI_STUB /boot/config-3.2.0-49-genericmas não consegui nada.
Rafael Adel

o kernel 3.2 é muito antigo (é de janeiro de 2012) para dar suporte ao EFI_STUB. Você precisa pelo menos do kernel 3.3.
21713 Marco Marco

@RafaelAdel Se você não deseja construir seu próprio kernel, pode procurar uma versão mais recente do kernel nos repositórios de software. O Elementary parece ser baseado no Ubuntu e um kernel 3.5 ou 3.8 deve estar disponível. Os mais novos têm mais probabilidade de ter o EFI_STUB ativado.
21713 Marco Marco

Na verdade, existe o kernel 3.10.1 agora. Vou tentar.
Rafael Adel

2
Marco, aconselhar o uso do stub é irresponsável, a menos que você esteja ansioso para orientar cada usuário sobre o que não é suportado por sua distribuição e não transmiti-lo como "faça após cada atualização do kernel". É bom ter, mas não tão bom para automatizar, estou lhe dizendo isso como um cara responsável pelo suporte à UEFI no ALT Linux.
Michael Shigorin

2

Eu fiz isso !

Primeiro, removi todas as entradas de inicialização desnecessárias:

efibootmgr -b <entry_hex_number> -B

Em seguida, reformatando a partição ESP com FAT32sistema de arquivos.

mkfs.vfat -F32 /dev/sda1

Em seguida, instale o grub para /dev/sdaNÃO/dev/sda1

grub-install /dev/sda

3
Você não precisa do grub-install, que grava MBR. Não sei se o grub de sua distro faz as duas coisas juntos, mas o que você precisa é copiar o grubx64.efi (ou shim.efi) para / boot / efi / EFI / $ distro / e efibootmgr -c -l / boot /efi/EFI/$distro/grubx64.efi.
Lingzhu Xiang 21/07

1
O grub-install aprendeu a groki EFI (você pode forçá-lo a usar --target = x86_64-efi, mas o efivars.ko deve ser carregado a qualquer momento).
Michael Shigorin 4/13
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.