Como criar stubs de inicialização arbitrários da UEFI?

1

Eu instalei o TinyCore como meu SO de manutenção. Eu dei aquele GRUB2. Mas as instruções de instalação do TinyCore dizem para você adicionar o GRUB2 usando o método MBR. (Funciona, mas isso é só porque o EFI é retrocompatível com o MBR.) Idealmente eu gostaria de encadear isso para que os vetores de stubs de inicialização EFI passem para o / boot / grub do TinyCore, para que do GRUB2 do TinyCore eu possa inicializar qualquer outro SO quer. Ou segunda opção, eu gostaria de encadear isso para que os vetores de stub de inicialização EFI para vmlinuz do TinyCore.

O TinyCore não possui efibootmgr. O efibootmgr está me dando o "sistema não suporta efivars" quando eu inicializo de um pendrive do Ubuntu.

Existe uma maneira de pegar o diretório grub do TinyCore, trazê-lo para alguma outra máquina Linux e criar um grub.efi dele que eu possa trazer de volta para esta máquina e copiar para o meu ESP nesta máquina?

    
por Joe C 22.03.2018 / 08:27

2 respostas

0

Veja como eu fiz isso. Primeiro, defino minhas opções de EFI para PC apenas para inicialização EFI. Então eu inicializei o Ubuntu 16.04.4 em um DVD. (Obviamente, foi uma inicialização UEFI.). Dentro do Ubuntu 16.04.4 eu fiz o seguinte.

  1. Montou minha partição ESP. (Era a partição 1 do disco 1)
  2. mkdir / path / para / mounted / esp / partição / EFI / prime_boot
  3. grub-mkimage -o /path/to/mounted/esp/partition/EFI/prime_boot/bootx64.efi --format = x86_64-efi '--prefix = (hd0, gpt1) / EFI / prime_boot' ext2 part_gpt
  4. Configure o seguinte arquivo grub.cfg em / path / para / mounted / esp / partition / EFI / prime_boot /

    menuentry "GRUB chainloader" {    chainloader (hd0, gpt2) /boot/efi/core.efi }

  5. efibootmgr -c -d / dev / sda -p1 -l \ EFI \ prime_boot \ bootx64.efi -L "Carregador principal"

  6. Configure a ordem de inicialização nos menus EFI para usar o "Carregador principal"

Agora você tem o EFI usando este carregador primário para enviar o vetor para o carregador de boot na partição TinyCore. Então agora você configura o gerenciador de inicialização da partição TinyCore.

  1. Monte a partição TinyCore. (Meu foi disco 1 partição 2)
  2. grub-mkimage -o /path/to/mounted/tinycore/partition/boot/efi/corex64.efi --format = x86_64-efi '--prefix = (hd0, gpt2) /boot / efi' ext2 part_gpt
  3. Agora crie o grub.cfg de inicialização múltipla em / path / to / mounted / tinycore / partition / boot / efi /

Eu sei que alguém se perguntaria por que eu pulo do gerenciador de inicialização primário para o carregador de inicialização múltipla. Eu só quero fazer o mínimo possível na minha partição esp. Eu quero que o TinyCore (meu sistema operacional de manutenção) seja o proprietário do gerenciador de inicialização multi-boot.

    
por 07.04.2018 / 18:42
2

efibootmgr is giving me the "system does not support efivars" when I boot from a Ubuntu USB stick.

Isso acontece porque você está inicializando a partir do pendrive USB usando o estilo de legado do BIOS, portanto, o módulo de suporte de compatibilidade do UEFI desativará a interface de tempo de execução do UEFI que seria usada para acessar as variáveis de inicialização. Se você puder inicializar o dispositivo USB no modo UEFI nativo, então efibootmgr funcionará. Se as configurações de inicialização do firmware incluírem se os métodos de inicialização herdados ou UEFI foram tentados primeiro, tente alterná-lo para o modo "UEFI primeiro" ao inicializar a partir do bastão.

Com um MBR herdado GRUB2, você só pode inicializar sistemas operacionais que são inicializáveis com o estilo MBR legado. Para encadear a um sistema operacional que foi instalado para inicializar usando UEFI nativo, você precisará de uma versão UEFI do GRUB2.

O problema em transplantar um UEFI GRUB de uma distribuição para outra é que diferentes distribuições configuram de maneiras ligeiramente diferentes: por exemplo, o Debian costumava plantar um grub.efi muito pequeno para o ESP com instruções embutidas para ler mais módulos do GRUB e o arquivo de configuração de outro sistema de arquivos especificado no momento da instalação do GRUB (normalmente o sistema de arquivos que contém o diretório /boot ).

O problema com essa abordagem é que o Secure Boot torna isso impossível se ativado: todo o código executável carregado deve ser assinado e como os módulos GRUB não estão usando o mesmo formato de arquivo binário que os binários padrão UEFI, eles não podem ser assinados em um maneira que seria reconhecível como tal para o firmware UEFI.

As distribuições derivadas de RedHat, por outro lado, tendem a incorporar todos os módulos GRUB necessários no principal binário grubx64.efi , que pode então ser carregado com êxito em uma operação pelo Secure Boot shim.efi . O arquivo de configuração do GRUB também é colocado no sistema de arquivos ESP, normalmente refletindo a nomenclatura do binário principal do UEFI GRUB, ou seja, se o binário for renomeado para foo.efi , ele procurará foo.cfg no mesmo diretório.

Sabendo disso, você pode apenas ter certeza que o Secure Boot está desabilitado, pegue o binário grub.efi de uma mídia de instalação RedHat / CentOS / Fedora, escreva um arquivo de configuração mínimo manualmente, coloque-o no seu ESP (talvez como \EFI\boot\bootx64.efi e \EFI\boot\bootx64.cfg , portanto, o UEFI deve buscá-los automaticamente sem necessidade de variáveis UEFI) e inicializar uma vez. Então você pode ver se o arquivo de configuração GRUB gerado pelo gerador de configuração GRUB nativo do TinyCore é compatível com essa versão do GRUB, e substituir o arquivo de configuração simplificado por um real ou substituir a versão transplantada do GRUB pela versão preferida do TinyCore do UEFI GRUB .

Se você quiser inicializar vmlinuz do TinyCore diretamente do firmware UEFI, o kernel precisa ser compilado com CONFIG_EFI_STUB=y e, em seguida, você precisará descobrir o que fazer com os parâmetros de inicialização e o arquivo initramfs. Fiz essa configuração uma vez, configurando as opções de inicialização na variável de inicialização do UEFI. Sem um gerenciador de inicialização, você provavelmente não terá como alterar os parâmetros de inicialização no momento da inicialização, então é melhor gerar várias configurações de variável de inicialização UEFI antecipadamente com diferentes parâmetros de inicialização, para que você tenha uma maneira de acessar o sistema se algo der errado com uma atualização do kernel, por exemplo.

(Se as opções de inicialização UEFI no nível do firmware incluírem uma maneira de inicializar no UEFI Shell, ele poderá ser muito útil na configuração de uma instalação inicializável por UEFI "sem bootloader".)

Os UUIDs usados nas variáveis de inicialização do UEFI podem ser descobertos executando o comando blkid . O GRUB usa o UUID do sistema de arquivos (= o campo UUID= ), enquanto as variáveis de inicialização do UEFI usam o UUID exclusivo da partição (= o campo PARTUUID= ).

    
por 22.03.2018 / 10:42

Tags