
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-install
realmente faz depende de qual versão do GRUB você está executando: BIOS GRUB tradicional ou UEFI GRUB?
Com o BIOS GRUB tradicional, grub-install
irá (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.map
arquivo, 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.efi
ou 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/grub
diretó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 -v
o comando. O grub-install
comando atualizará essas variáveis, a menos que você use a --no-nvram
opçã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-install
tem a capacidade de inserir o valor desejado da prefix
variá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)/grub
quando
/boot
a 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/debian
ou /EFI/redhat
similar. 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.cfg
no ESP conterá apenas algumas linhas que dirão ao GRUB para ler o arquivo de configuração real do que será /boot/grub/grub.cfg
quando o Linux inicializar e montar todos os discos . Na sua forma mais simples, esta miniconfiguração terá apenas três linhas:
- 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
configfile
comando), em distribuições modernas geralmente usando osearch
comando 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)
- Configurando a
prefix
variá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/boot
for um sistema de arquivos separado, esta linha seráset prefix=($root)'/grub'
- 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-install
pode 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 efibootmgr
ou 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 efibootmgr
ou 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.map
identifica o disco daquela instalação específica como hd0
, e a outra como hd1
. Em seguida, use grub-install
para 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 hd0
sempre 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 sda
que é hd0
) e quiser que um item de menu GRUB nesse disco mude para /dev/sdb
o 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.