(UEFI) Chainloading GRUB do GRUB

2

Terminologia: ESP = minha partição EFI FAT32.

Eu quero:

  • Instale um GRUB independente no meu ESP que carregue outro carregador de inicialização GRUB no sistema de arquivos raiz da minha distribuição ( / ). Atualmente tenho várias distros sem o GRUB instalado nas minhas partições. Cada um é instalado completamente em seu próprio ext4 / . Eu quero que todos tenham seu próprio bootloader secundário.
  • Também é aceitável que o GRUB principal do ESP reinicie / recarregue com um grub.cfg no sistema operacional. Efetivamente cadeia de carga-se.

O que eu tentei:

  • Os exemplos que encontrei incluem a inicialização do GRUB herdado do GRUB2 e vice-versa, mas eles não usam arquivos UEFI e .efi. A documentação do GNU GRUB nem menciona o UEFI, e os wikis Arch / Ubuntu / Gentoo fornecem as informações mínimas para configurar uma instalação básica (não-chainloading).

Até agora:

  • Eu instalei o GRUB no meu ESP usando grub-install e grub-mkconfig .Test boot funciona. Isso significa que minha pasta /boot/grub está vazia e meu ESP não precisa ser montado durante / após a inicialização.
  • Eu tentei instalar um segundo grub em /boot/efi/ e /boot/grub/ , mas a parte EFI não será instalada, grub-install reclama que o destino não é uma partição EFI. Mas como eu já tenho um GRUB primário instalado, não importa se meu GRUB secundário está no rootfs do ext4, certo? O grub pode ler ext4. Eu tentei a opção --force também.

Portanto, parece que preciso encontrar uma maneira de convencer o instalador de que não há problema em instalar grubx64.efi em /boot/EFI ...

Se alguém estiver curioso sobre como eu instalei o GRUB primário, foi apenas uma questão de usar as opções corretas em grub-install em relação ao meu ESP.

    
por jiggunjer 09.02.2017 / 06:38

3 respostas

4

Descobri como instalar manualmente o .efi em cada um dos meus / . A referência ao carregador de correntes do GRUB secundário a partir da configuração primária é simples:

menuentry "GRUB chainloader" {
 #Load grub on partition 7 of a gpt formatted drive. 
 #It will reference its own modules and config.
 chainloader (hd0,gpt7)/path/to/bootloader/on/myOS/core.efi
}

Para criar este secundário .efi usei grub-mkimage porque grub-install não me deixou gravar em um sistema de arquivos não-FAT. A sintaxe é muito exigente e não dá erros se você usar um caminho errado, então verifique os argumentos cuidadosamente:

grub-mkimage -o /path/to/mounted/targetOS/efidir/core.efi --format=x86_64-efi '--prefix=(hd0,gpt7)/boot/grub' ext2 part_gpt

Eu tentei deixar de fora os módulos do sistema de arquivos GPT ou ext2, mas isso não funcionou, esses dois módulos eram o requisito mínimo para o meu sistema (o ext2 funciona para ext2 / 3/4).

O diretório de prefixo é onde o gerenciador de inicialização secundário procurará por sua pasta de módulos e arquivo de configuração. Então eu criei manualmente um /boot/grub/ para cada sistema operacional que inclui uma pasta x86_64-efi/ (copiada de /usr/lib/grub) e grub.cfg que eu posso modificar usando grub-mkconfig com a análise do OS desativada (ou apenas editá-la manualmente).

Eu originalmente instalei cada sistema operacional sem o GRUB. Esse método me permitiu instalar carregadores de inicialização GRUB secundários em todos os sistemas operacionais usando um primeiro SO ou LiveCD com o GRUB. Eu posso alterar a configuração de inicialização de cada sistema operacional de forma independente, sem riscos de contaminação, porque o ESP nunca é montado.

    
por 13.02.2017 / 07:12
6

Existe uma outra maneira: você pode criar uma entrada de menu que diga ao GRUB para carregar outro grub.cfg secundário, como um de outra distribuição Linux.

Por exemplo, eu comecei com o Gentoo Linux do qual eu instalei o GRUB2 no MBR (a máquina é muito antiga para o EFI).

Eu então instalei o NixOS, que configurei para gerar o grub.cfg em seu próprio / boot (separado do / boot do Gentoo) mas sem instalando o GRUB.

Para esclarecer, grub-install foi executado a partir do Gentoo, mas não do NixOS.

Em seguida, para poder inicializar o NixOS, adicionei isso ao /etc/grub.d/40_custom no Gentoo:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

menuentry 'NixOS' --class gnu-linux --class gnu --class os $menuentry_id_option 'nixos-0aca58bc-8fdb-4a07-aa2f-56406bcf19b7' {
        set root='hd0,msdos4'
        configfile /nixos/root/boot/grub/grub.cfg
}

A chave é a linha configfile /nixos/root/boot/grub/grub.cfg . Diz ao GRUB para carregar outro grub.cfg. Em seguida, executei grub-mkconfig do Gentoo para aplicar as alterações.

Agora, quando eu inicializo e seleciono NixOS , a interface GRUB inteira é atualizada para refletir o NixOS grub.cfg, a partir do qual eu posso inicializar o sistema operacional. Diferentemente do chainloading, essa configuração utiliza uma única instalação do GRUB; simplesmente usa uma segunda configuração.

    
por 10.02.2017 / 01:45
0

Estou tentando fazer algo parecido com o i386-pc grub, e o chainloader do arquivo core.img não funciona, dando "erro: assinatura inválida"

Mas eu aprendi que o arquivo grub core.img é compatível com inicialização múltipla, então eu pude inicializar o core.img como:

multiboot (hd0,7)/core.img
boot

e obtém com sucesso o novo grub, seus módulos e configuração inicial.

Suponho que seu comando chainloader falhe em um efi para um non-efi grub, portanto, este failrue pode ser detectado e retroceder para multiboot no core.img antes do comando boot.

    
por 24.07.2018 / 17:41