Parece que eu sempre tenho que instalar arquivos em um --boot-directory
arquivo grub-install
.
E se eu já tiver arquivos grub existentes /boot
em minhas partições? Eu não deveria apenas instalar as partes MBR do grub e apontá-las para uma das minhas partições existentes /boot/grub
? Não consegui encontrar tal opção.
Fiz o downgrade do meu GPT para MBR e removi minha partição de inicialização do BIOS, o que significa que preciso reinstalar o Grub no meu MBR, se não entendi nada mal. Sem fazer isso, fico com um prompt de resgate do grub que nem pode listar minhas partições ao fazer ls
. Percebo que minhas entradas de menu ainda podem não funcionar após a reinstalação do grub no MBR, pois se referem a partições como hd0,gpt5
, mas ter um prompt utilizável seria bom o suficiente e me permitiria confirmar minha compreensão do grub mais facilmente.
Tenho que escrever em um --boot-directory
sempre que quiser instalar o grub, mesmo que já exista um diretório?
Quando o GRUB inicializa a partir de um MBR, o número de etapas de compatibilidade do BIOS herdado que ele precisa executar no início do processo de inicialização significa que o código realmente no MBR só é capaz de carregar um bloco de disco cujo número LBA é corrigido para o MBR código no momento da instalação. Esse bloco é geralmente o primeiro bloco da imagem principal do GRUB . Ele contém o código para carregar mais blocos e uma lista de números de bloco que definem onde o restante da imagem principal do GRUB está localizado.
Em um disco particionado por MBR, geralmente há espaço não utilizado entre o MBR e o início da primeira partição. Com o MS-DOS, a convenção original era iniciar a primeira partição no início da próxima faixa de disco, o que geralmente significa que haverá pelo menos 63 blocos de disco antes da primeira partição, incluindo o MBR. Em sistemas modernos, a primeira partição MBR é agora mais comumente colocada para iniciar exatamente 1MiB desde o início do disco, ou seja, no bloco #2048, para otimizar o alinhamento de dados para discos, SSDs e sistemas de armazenamento SAN que podem usar internamente um bloco tamanho maior que 512 bytes.
Portanto, em um disco particionado por MBR, o início do disco normalmente é organizado assim:
Observe que o carregamento da imagem principal do GRUB funciona exclusivamente por números de bloco pré-determinados: até que a imagem principal do GRUB seja totalmente carregada e extraída, o GRUB não terá conhecimento de tabelas de partição nem sistemas de arquivos de qualquer tipo.
Em um disco particionado por GPT, os blocos imediatamente após o bloco #0 são ocupados pela tabela de partição GPT, portanto, a imagem principal do GRUB é incorporada em uma "partição de inicialização do BIOS". Isso significa apenas que o número do bloco incorporado ao MBR não será 1, mas sim o número do primeiro bloco da partição de inicialização do BIOS, e o restante dos blocos pertencentes à imagem principal também será deslocado. Portanto, em um disco particionado por GPT com GRUB no estilo BIOS, o layout físico será algo assim, supondo que a partição de inicialização do BIOS seja a primeira no disco:
O fato de você ainda poder acessar o modo de recuperação do GRUB indica que, embora você tenha dito que removeu sua partição de inicialização do BIOS, você ainda não sobrescreveu seus blocos; embora o espaço ocupado pela partição de inicialização do BIOS agora possa ser espaço não alocado entre partições ou espaço não utilizado em outra partição redimensionada, ela ainda tem seu conteúdo antigo e o GRUB ainda pode carregar esses blocos e encontrar sua imagem principal. Mas nada em particular protege esses blocos agora de serem substituídos: assim que isso acontecer por qualquer motivo, a imagem principal do GRUB será destruída e o GRUB não conseguirá chegar até o modo de resgate.
Conteúdo da imagem principal do GRUB
A imagem principal do GRUB contém várias coisas:
/boot/grub/grub.cfg
e/boot/grub/i386-pc
respectivamente quando o sistema Linux está rodando normalmente.memdisk
ferramenta da família de bootloader SYSLINUXTudo isso é compactado em LZMA para minimizar seu tamanho, portanto, não pode ser lido ou modificado manualmente com facilidade.
Como agora você está entrando no modo de recuperação e não pode listar suas partições, isso indica que a imagem principal do GRUB contém o módulo de particionamento para GPT (
part_gpt.mod
), mas não para MBR (part_msdos.mod
). Sem o módulo de particionamento MBR, ele não pode acessar o/boot/grub/i386-pc
diretório que contém a partição, mesmo que a imagem principal do GRUB contenha o módulo de driver do sistema de arquivos aplicável a ele... e, portanto, o GRUB não pode carregar onormal.mod
que permitiria prosseguir além do modo de recuperação.O que precisa acontecer agora
/usr/lib/grub/i386-pc
ou diretório similar), a maneira mais simples de fazer isso é apenas pegar todos os componentes descompactados apropriados, construir uma nova imagem principal a partir deles e compactá-la. Descompactar o antigo e modificá-lo simplesmente não vale a pena: por que escrever outro pedaço de código ao reutilizar o código usado ao instalar inicialmente o GRUB do zero funciona bem?grub-install
comando precisará de alguma forma garantir que onormal.mod
e outros módulos GRUB localizados/boot/grub/i386-pc
sejam da mesma versão que a nova imagem principal do GRUB. Claro, ele poderia comparar os arquivos existentes com o conjunto de arquivos usado para reconstruir a imagem principal, mas novamente ... por que escrever e depurar código para outro caso especial ao simplesmente substituir o conteúdo existente pela/boot/grub/i386-pc
rotina de instalação do GRUB já existente funciona direitinho?O tamanho total não compactado de todos os
i386-pc
componentes do GRUB é definitivamente menor que 4 MiB. Isso não é nada. Tentar evitar reescrever que, se já existe, simplesmente não vale a pena, a menos que você esteja trabalhando com algo especial como os antigos SSDs PATA de primeira geração com um número muito restrito de ciclos de gravação disponíveis.Como o UEFI nativo faria isso?
Como o firmware UEFI inclui suporte ao sistema de arquivos FAT32 como padrão, a versão UEFI nativa do carregador de inicialização GRUB pode ser empacotada como um único
grubx64.efi
arquivo que contém todos os módulos necessários, inclusivenormal.mod
se você desejar. Ele é carregado como um arquivo normal: não há necessidade de mexer com números de bloco ou código embutido em locais de disco fixo.