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

Eu quero:

  • Ter um GRUB independente instalado em meu ESP que carregue em cadeia outro carregador de inicialização GRUB em meu sistema de arquivos raiz da distro (/). Atualmente, tenho várias distros sem GRUB instalado em minhas partições. Cada um é instalado completamente em seu próprio ext4 /. Quero que todos tenham seu próprio carregador de inicialização secundário.
  • Também é aceitável que o ESP GRUB principal reinicie / recarregue com um grub.cfg do sistema operacional. Efetivamente encadeando a si mesmo.

O que eu tentei:

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

Até agora:

  • instalei o GRUB em meu ESP usando grub-install e grub-mkconfig .O teste de inicialização 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 “ve tentei instalar um segundo grub em /boot/efi/ e /boot/grub/, mas a parte EFI não foi “instalada”, grub-install reclama que o destino não é uma partição EFI. Mas, como já tenho um GRUB principal instalado, não deveria importar se meu GRUB secundário está no rootfs 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 pode instalar grubx64.efi em /boot/EFI

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

Resposta

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

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

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

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

Em seguida, para ser capaz de inicializar o NixOS, adicionei isso a /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. Eu então executei grub-mkconfig do Gentoo para aplicar as mudanças.

Agora, quando eu inicializo e seleciono NixOS , toda a interface do GRUB é atualizada para refletem o NixOS grub.cfg, a partir do qual posso inicializar o sistema operacional. Ao contrário do carregamento em cadeia, esta configuração utiliza uma única instalação do GRUB; ele simplesmente usa uma segunda configuração.

Comentários

  • Eu entendo, é a isso que me referia no ponto 3: " Carregamento em cadeia ". Eu encontrei esse método durante a pesquisa, mas estava evitando responder a mim mesmo, pois ' prefiro fazer o chainload de outro .efi que aponta para o seu próprio grub.cfg. Eu ' estou olhando para grub-mkimage com multiboot ou chainloader mas até agora eu não ' não fui capaz de criar um secundário funcional .efi ou core.img.

Resposta

Eu descobri como instalar manualmente o .efi em cada um dos meus / “s. Referir-se ao carregador de cadeia GRUB secundário 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 .efi secundário que 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 fornece erros se você usar um caminho errado, verifique os argumentos com cuidado:

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

Tentei omitir os módulos do sistema de arquivos GPT ou ext2, mas não funcionou, aqueles dois módulos eram o requisito mínimo absoluto para meu sistema (ext2 funciona para ext2 / 3/4).

O diretório de prefixo é onde o carregador de inicialização secundário procurará sua pasta de módulos e arquivo de configuração. criou um /boot/grub/ para cada sistema operacional que inclui uma pasta x86_64-efi/ (copiada de /usr/lib/grub) e um grub.cfg Posso modificar usando grub-mkconfig com a sondagem do SO desativada (ou apenas manualmente Edite-o).

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

Comentários

  • E se você quisesse usar o UUID em vez de (hd0, gpt7)? Como ficaria a linha de comando grub-mkimage nesse caso?

Resposta

Estou tentando fazer uma algo semelhante para o grub i386-pc e o chainloader do arquivo core.img não funcionaria, dando “erro: assinatura inválida”

Mas eu aprendi que o arquivo grub core.img é compatível com multiboot, então consegui inicializar core.img como:

multiboot (hd0,7)/core.img boot 

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

Suponho que seu comando chainloader falhe em um efi para um grub não efi, então este failrue pode ser detectado e retrocedido para multiboot em core.img antes do comando de inicialização.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *