atualizar-grub vs. grub-install?

atualizar-grub vs. grub-install?

Alguns exemplos encontrados online dizem que o update-grub deve ser executado APÓS o grub-install. Outros invertem a ordem. Qual é correto?

Se eu tiver duas instalações do Linux (uma no sda e outra no sdb), se eu executar o update-grub na instalação do sda, ele colocará a instalação do sda no topo do menu de inicialização. Se eu executar o update-grub na instalação do sdb, ele colocará a instalação do sdb no topo do menu.

Assumindo DEFAULT=0, isso deveria, teoricamente, permitir que eu selecionasse meu sistema operacional selecionando o dispositivo de inicialização no BIOS. O "grub-install /dev/sda" altera o menu de inicialização do sda para corresponder ao último "update-grub", independentemente de ter sido executado a partir da versão sda ou sdb do Linux?

Responder1

update-grub, pelo menos no Debian e seus parentes como o Ubuntu, é basicamente apenas um invólucro do grub-mkconfig. Então ele cria/atualiza/regenera o GRUBconfiguração, não o próprio bootloader.

O que grub-installrealmente faz depende de qual versão do GRUB você está executando: BIOS GRUB tradicional ou UEFI GRUB?

Com o BIOS GRUB tradicional, grub-installirá (re)escrever a parte do GRUB incorporada no Master Boot Record e codificar nele os números dos blocos do disco físico de onde ler a próxima parte do GRUB. Ele também determinará de qual partição o arquivo de configuração GRUB real ( /boot/grub/grub.cfg) será lido. Um fator importante aqui é o /boot/grub/device.maparquivo, que informa ao GRUB como a numeração de dispositivos do BIOS (e, portanto, do GRUB) é mapeada para dispositivos de disco Linux.

Com o UEFI GRUB, a parte principal do bootloader GRUB estará localizada como um arquivo na partição do sistema EFI, normalmente igual /boot/efi/EFI/<name of distribution>/grubx64.efiou semelhante. Este nome de caminho do bootloader é armazenado na NVRAM do sistema (= o local onde as configurações do BIOS são armazenadas) nas variáveis ​​de inicialização UEFI. A parte principal do GRUB pode ser completamente independente (e deve ser se o Secure Boot estiver em uso!) ou pode carregar funcionalidades adicionais como módulos GRUB, normalmente do /boot/grubdiretório da distribuição Linux da qual faz parte.

As variáveis ​​de inicialização UEFI identificarão o disco que o sistema deve usar para procurar a partição do sistema EFI e o arquivo do carregador de inicialização dentro dela. Você mesmo pode visualizar essas variáveis, usando efibootmgr -vo comando. O grub-installcomando atualizará essas variáveis, a menos que você use a --no-nvramopção para especificar o contrário.


Depois que o GRUB estiver em execução, a próxima coisa a ser determinada é: de onde ele deve ler seu arquivo de configuração?

grub-installtem a capacidade de inserir o valor desejado da prefixvariável GRUB diretamente na parte principal do GRUB. Esseprefixo incorporadopode especificar totalmente o caminho ou deixar algumas partes de fora para serem determinadas em tempo de execução, usando padrões específicos da arquitetura.

Com um BIOS GRUB tradicional, o prefixo incorporado geralmente deixa de fora o especificador de disco real, portanto, o mesmo disco do qual o GRUB foi carregado será usado. Nesse caso, o prefixo armazenado será, por exemplo, (,msdos1)/grubquando /boota primeira partição primária do disco em que o GRUB está instalado.

Com o UEFI GRUB, o prefixo incorporado geralmente especifica apenas o diretório e, em seguida, refere-se ao diretório da distribuição na partição do sistema EFI (ESP). Portanto, um prefixo incorporado típico seria /EFI/debianou /EFI/redhatsimilar. O valor padrão para o disco e partição será "a mesma partição da qual o binário UEFI GRUB foi carregado".

Algumas distribuições como o RHEL apenas colocarão a configuração real do UEFI GRUB diretamente no ESP. O Debian e distribuições relacionadas geralmente farão mais uma indireta: o miniarquivo grub.cfgno ESP conterá apenas algumas linhas que dirão ao GRUB para ler o arquivo de configuração real do que será /boot/grub/grub.cfgquando o Linux inicializar e montar todos os discos . Na sua forma mais simples, esta miniconfiguração terá apenas três linhas:

  1. Definir a raiz do GRUB para apontar para o sistema de arquivos que contém o arquivo de configuração real do GRUB (para o próximo configfilecomando), em distribuições modernas geralmente usando o searchcomando e um UUID do sistema de arquivos. As implementações mais antigas deste esquema podem ter usado uma especificação de partição GRUB fixa, por exemploset root=(hd0,gpt1)
  2. Configurando a prefixvariável GRUB (para ativar o carregamento automático do módulo GRUB se a inicialização segura não estiver em vigor). Se o sistema de arquivos onde a configuração será carregada for o sistema de arquivos raiz do Linux, esta linha será set prefix=($root)'/boot/grub'; se /bootfor um sistema de arquivos separado, esta linha seráset prefix=($root)'/grub'
  3. Lendo o arquivo de configuração real do GRUB com configfile $prefix/grub.cfg.

Se o sistema de arquivos que contém a configuração do GRUB estiver em um volume lógico LVM, volume criptografado ou conjunto RAID de software, a primeira linha será mais complexa ou poderá até haver linhas adicionais conforme necessário.


Como resultado, tanto com o BIOS tradicional quanto com o UEFI, a execução grub-installpode atualizar seu bootloader para ler um arquivo de configuração GRUB completamente diferente em um disco completamente diferente - embora os detalhes desse processo sejam completamente diferentes.

Com UEFI, você pode alterar a seleção do dispositivo de inicialização no sistema operacional, com efibootmgrou grub-install. Mas grub-installé um grande exagero: se ambas as instalações forem UEFI e tiverem suas próprias partições ESP separadas, elas terão suas próprias variáveis ​​de inicialização UEFI e a seleção entre elas pode ser feita facilmente com efibootmgrou mesmo nas configurações do UEFI BIOS.

Com o BIOS tradicional, é um pouco mais confuso: você vai querer ter certeza de que cada instalação /boot/grub/device.mapidentifica o disco daquela instalação específica como hd0, e a outra como hd1. Em seguida, use grub-installpara gravar o bootloader apenas no disco de cada instalação; nunca para o disco "oposto". Dessa forma, ambos os discos serão completamente independentes e inicializáveis, mesmo que o outro disco seja completamente removido. Você pode adicionar um item de menu nos arquivos de configuração de cada GRUB que permitirá inicializar a instalação "oposta", se desejar. Ou você pode simplesmente usar o BIOS para selecionar o disco a partir do qual inicializar.

O que você deve saber é que o seletor de ordem de inicialização dos BIOS tradicionais geralmente funcionará fazendo com que o disco selecionado para inicialização seja o "primeiro" disco para funções do BIOS e, portanto, o GRUB hd0sempre se referirá ao "disco que está atualmente selecionado para inicialização no BIOS ".

Portanto, se você estiver inicializando a partir /dev/sda(assim o BIOS diz sdaque é hd0) e quiser que um item de menu GRUB nesse disco mude para /dev/sdbo menu de inicialização de , você usaria algo como:

menuentry "Switch to /dev/sdb"
{
    # flip the disk mappings and reload configuration
    drivemap -s (hd0) (hd1)
    set root=<the identifier for sdb's partition that contains grub.cfg>
    configfile /boot/grub/grub.cfg  # or just /grub/grub.cfg is /boot is a separate partition
} 

... e da mesma forma na configuração GRUB do /dev/sdb também.

informação relacionada