Os sistemas Grub2 codificam a localização dos arquivos stage2. Esta informação é armazenada na partição do bootloader. Eu entendo que o grub-install escreverá isso e muito mais.
Minha pergunta é como o grub2-install descobre onde está o diretório /boot (sua própria partição). O grub-mkconfig pode descobrir isso, no entanto, não parece que o grub-install invoque o grub-mkconfig.
Eu realmente gostaria de uma explicação detalhada de como isso é resolvido.
A questão final é: "Qual é a maneira correta de atualizar o código do bootloader na partição mbr/bios-boot quando a localização de/boot muda"?
Serão apreciadas indicações para documentação oficial ou wikis.
Você está misturando a terminologia GRUB Legacy e GRUB2. O termo "stage2" é apenas para GRUB Legacy (ou seja, versões 0.9x). Mas acho que entendo o que você quer dizer.
Quando
i386-pc
a versão do GRUB é instalada no MBR e no espaço entre o MBR e a primeira partição ou na partição de inicialização do BIOS, os/boot/grub2/i386-pc/{core,boot}.img
arquivos são usados apenas pelogrub2-install
, não pelo processo de inicialização real.Como o sistema operacional na
i386-pc
arquitetura GRUB não tem uma maneira confiável de obter informações sobre como o BIOS viu pela última vez a ordem do disco no momento da inicialização,grub-install
basicamente tem duas opções disponíveis no momento da instalação, se configurado para contar com suporte de disco do BIOS (como é o modo usual):/boot/grub[2]/device.map
arquivo tiver sido fornecido, use as informações nele contidas para mapear os dispositivos do sistema operacional para nomes de dispositivos GRUB (que corresponderão diretamente aos números de disco do BIOS)device.map
arquivo não estiver disponível, adivinhe que a ordem atual dos discos do sistema operacional é a mesma que a ordem de detecção dos discos do BIOS. Essa suposição pode ou não estar correta.(Especificamente, ao executar um instalador ou mídia ao vivo a partir de USB, é comum que o dispositivo de armazenamento USB seja detectado como o primeiro "disco"; isso pode confundir o palpite
grub-install
, porque uma vez que o sistema operacional instalado inicializa sozinho, o A emulação de disco no nível do BIOS para armazenamento USB não estará mais disponível, pois o BIOS não inicializará a partir da mídia USB nesse ponto.)O código de inicialização do GRUB incorporado no bloco MBR real contém duas informações gravadas nele de
grub-install
cada vez: o número da unidade de inicialização e o número do bloco LBA que o GRUB deve ler a seguir. Nas versões modernas do GRUB, o número da unidade geralmente é codificado como0xff
, significando "use o mesmo disco BIOS usado para ler o MBR".Quando estiver em um disco particionado por MBR, o número do bloco LBA normalmente será
0x0000000000000001
, apontando para a lacuna entre o MBR e a primeira partição. Em um disco particionado por MBR, é onde o restante da imagem principal do GRUB, os módulos essenciais e a string de prefixo (que apontará para o local do/boot/grub
diretório) serão incorporados. Em discos particionados por GPT, tudo isso será gravado nabios-boot
partição, e o número do bloco LBA incorporado no código de inicialização MBR real será maior, pois apontará para o início dabios-boot
partição.O primeiro bloco do código incorporado inclui uma lista de blocos que identifica quais blocos serão lidos em seguida: quando incorporado a um disco particionado por MBR, será uma série contígua de blocos começando no bloco LBA nº 2. A duração desta série dependerá principalmente do número e tipo de módulos essenciais incorporados junto com a imagem principal do GRUB. A maior parte desse código incorporado será compactado LZMA e depois protegido com códigos de correção de erros Reed-Solomon, portanto, modificá-lo geralmente forçará você a reescrever tudo. Infelizmente, a string de prefixo que identifica a localização do
/boot/grub[2]
diretório estará definitivamente dentro da parte compactada.Em sistemas modernos, a lacuna entre o MBR e o início da primeira partição é geralmente de exatamente 2.047 blocos, para alinhar a primeira partição para iniciar exatamente 1 MiB no disco. Mas os sistemas mais antigos podem ter sido particionados com uma versão que
fdisk
não se importava com o alinhamento dos dados, mas em vez disso tentava manter a compatibilidade do DOS, posicionando o início da partição no início de uma trilha de disco (embora a geometria clássica do disco C/H/S tenha há muito tempo é apenas uma ficção mantida pelo firmware do disco). Nestes casos, a diferença entre o MBR e o início da primeira partição pode ser muito menor. Então, para maximizar a compatibilidade, ogrub-install
precisará incorporar o número mínimo absoluto de módulos GRUB essenciais junto com a imagem principal, para minimizar o tamanho do código incorporado. Para outros limites relevantes resultantes do hardware do PC e da implementação do BIOS, consulte a documentação do GRUB :i386-pc
é considerada uma "plataforma altamente limitada" nesse aspecto.Em uma instalação simples do RedHat/Debian em um disco baseado em MBR, tendo
/boot
como partição separada a primeira partição do disco, o conjunto típico de módulos incorporados seria:biosdisk.mod
usar funções do BIOS para acesso ao discopart_msdos.mod
para entender a tabela de partição MBR/boot
partiçãoNo mínimo (se a
/boot
partição for inicializada como um sistema de arquivos ext2), os módulos GRUB necessários para suporte ao sistema de arquivos ext2 serãoext2.mod
efshelp.mod
. Esta é uma configuração prática que provavelmente produzirá um dos menores tamanhos de código incorporado alcançáveis comi386-pc
a arquitetura moderna do GRUB.Se o diretório GRUB for nomeado
/grub
em um/boot
sistema de arquivos separado e/boot
for a primeira partição no disco, a string de prefixo incorporada normalmente será(,msdos1)/grub
. Observe que o identificador do disco GRUB está faltando: isso significa "usar o mesmo disco do qual o BIOS lê o MBR". Indicamsdos1
a primeira partição estilo MBR no disco e/grub
é simplesmente o caminho do/boot/grub
diretório começando na raiz do/boot
sistema de arquivos.E assim, usando apenas o código incorporado na lacuna do MBR ou na partição de inicialização do BIOS, o GRUB terá a capacidade de ler
normal.mod
usando(,msdos1)/grub/i386-pc/normal.mod
o BIOS para suporte de disco e os metadados do sistema de arquivos para encontrar os blocos corretos. Depois disso, o arquivo de configuração será lido(,msdos1)/grub/grub.cfg
respectivamente.Também é possível incorporar, por exemplo,
ahci.mod
esearch_fs_uuid.mod
junto com a imagem principal do GRUB para dar ao GRUB a capacidade de acessar controladores SATA AHCI diretamente e identificar a partição/sistema de arquivos correto por UUID, masahci.mod
é mais de 3x o tamanho debiosdisk.mod
, o que faz com que o limites de tamanho da imagem ainda mais prováveis.A única resposta prática é "reescrever o código do bootloader incorporado executando
grub[2]-install
novamente". Ao fazer isso, certifique-se de ter o novo/boot
montado como/boot
e, se necessário, forneça ao/boot/grub/device.map
arquivo o conteúdo apropriado para a configuração do sistema na próxima inicialização.No Debian e derivados como Ubuntu e Mint, o sistema de gerenciamento de pacotes lembra o dispositivo alvo de instalação da
i386-pc
versão do GRUB. Você pode visualizar essas informaçõessudo debconf-show grub-pc
e atualizá-las comsudo dpkg-reconfigure grub-pc
.RedHat não parece ter um recurso semelhante em sua embalagem.
RedHat e derivados não atualizam o código de inicialização incorporado.
Para efeito de comparação, na
x86_64-efi
arquitetura GRUB, geralmente não há restrições de tamanho para impedir que você incorpore todos os módulos GRUB disponíveis nogrubx64.efi
arquivo, resultando em um único binário UEFI que pode ser assinado para inicialização segura e nunca precisará carregar nenhum código executável para extra. funcionalidade. Na prática, isso garante que, enquanto o sistema puder lergrubx64.efi
, todas as funcionalidades da linha de comando do modo normal do GRUB estarão disponíveis, mesmo se o/boot/grub[2]
diretório for completamente destruído.