10.4. Usando o GRUB para Configurar o Processo de Inicialização

10.4.1. Introdução

[Atenção]

Atenção

Configurar o GRUB incorretamente pode tornar teu sistema inoperável sem um dispositivo alternativo de inicialização, como um CD-ROM ou uma unidade USB inicializável. Esta seção não é exigida para inicializar teu sistema LFS. Você possivelmente queira apenas modificar teu carregador de inicialização atual, por exemplo, Grub-Legacy ou GRUB2.

Certifique-se de que um disco de inicialização de emergência esteja pronto para resgatar o computador se o computador se tornar desusável (não inicializável). Se já não tiver um dispositivo de inicialização, você consegue criar um. Para a finalidade de que o procedimento abaixo funcione, você precisa saltar adiante para o BLFS e instalar xorriso oriundo do pacote libisoburn.

cd /tmp
grub-mkrescue --output=grub-img.iso
xorriso -as cdrecord -v dev=/dev/cdrw blank=as_needed grub-img.iso

10.4.2. Desativar Inicialização de Segurança

O LFS não tem os pacotes essenciais para suportar a Inicialização Segura. Para configurar o processo de inicialização seguindo as instruções desta seção, a Inicialização Segura precisa ser desativada a partir da interface de configuração do firmware. Leia-se a documentação fornecida pelo(a) fabricante do teu sistema para saber como desativar o suporte de Inicialização Segura.

10.4.3. Convenções de Nomenclatura do GRUB

O GRUB usa estrutura de nomenclatura própria dele para unidades e partições na forma de (hdn,m), onde n é o número da unidade rígida e m é o número da partição. Os números da unidade rígida começam do zero, porém os números da partição começam do um para partições normais (do cinco para partições estendidas). Observe que isso é diferente de versões anteriores, onde ambos os números começavam do zero. Por exemplo, a partição sda1 é (hd0,1) para o GRUB e sdb3 é (hd1,3). Em contraste com o Linux, GRUB não considera unidades de CD-ROM como unidades rígidas. Por exemplo, se usar um CD em hdb e uma segunda unidade rígida em hdc, essa segunda unidade rígida ainda seria (hd1).

10.4.4. Definindo a Configuração

Se inicializar o sistema via BIOS, o GRUB funcionará escrevendo um Código de Carregador de Estágio Inicial no primeiro setor (nominado de Master Boot Record, ou MBR) do disco rígido. Essa área não é parte de nenhum sistema de arquivos. O BIOS carrega e executa o conteúdo do MBR e, em seguida, o Código de Carregador de Estágio Inicial carrega a imagem principal do GRUB a partir da Partição de Inicialização do BIOS. A imagem do GRUB é armazenada como dados brutos em vez de um arquivo (precisa não existir sistema de arquivos na Partição de Inicialização do BIOS), de modo que o Código de Carregador de Estágio Inicial não precise suportar nenhum sistema de arquivos e possa ser pequeno o suficiente para caber no MBR.

Se inicializar o sistema via UEFI, o GRUB funcionará armazenando a imagem principal do GRUB como um arquivo executável PE-COFF em um local padrão na Partição EFI de Sistema: EFI/BOOT/BOOTX64.EFI (ou EFI/BOOT/BOOTIA32.EFI para i386-efi). O firmware UEFI o carrega a partir do local padrão e o executa, iniciando o GRUB.

Muitas funções do GRUB (incluindo inicializar o núcleo Linux) não estão incluídas na imagem principal do GRUB. Em vez disso, elas estão armazenadas em um sistema de arquivos como módulos do GRUB. Esse sistema de arquivos geralmente é montado de maneira que os módulos do GRUB possam ser acessados em /boot/grub na maioria das distribuições Linux. Para evitar o problema do ovo e da galinha, grub-install embute os módulos necessários para acessar esse sistema de arquivos na imagem principal do GRUB, de modo que ele consiga encontrar e carregar outros módulos.

O local da partição de inicialização é uma escolha do(a) usante que afeta a configuração. Uma recomendação é a de ter-se uma pequena partição separada (tamanho sugerido de 200 MB) apenas para informações de inicialização. Ao fazer isso, não apenas o LFS, mas qualquer distribuição Linux, poderá acessar os mesmos arquivos de inicialização e, consequentemente, qualquer sistema inicializado. Se optar por fazer isso, você precisará montar a partição separada, mover todos os arquivos no diretório atual /boot (por exemplo, o núcleo Linux que você recém construiu na seção anterior) para a nova partição. Você precisará, então, desmontar a partição e remontá-la como /boot. Se você fizer isso, certifique-se de atualizar o arquivo /etc/fstab.

[Nota]

Nota

Se a distribuição anfitriã utilizar uma partição separada para /boot e você quiser que o sistema LFS também use essa partição para /boot, basta montar a partição em $LFS/boot na distribuição anfitriã. O núcleo Linux suporta montar uma partição em múltiplos pontos de montagem.

Deixar /boot na partição LFS atual também funcionará, porém a configuração para múltiplos sistemas é mais complicada.

Para exemplos e mais informações acerca de esquemas de partição de inicialização, olhar para a Seção 2.4, “Criando uma Nova Partição” possivelmente seja informativo.

Usando as informações acima, determine o designador apropriado para a partição raiz (ou partição de inicialização, se uma separada for usada). Para o exemplo seguinte, é assumido que a partição raiz (ou inicialização separada) é sda2.

As seguintes seções explicam como inicializar com BIOS e UEFI. As instalações do GRUB para BIOS, UEFI de 64 bits e UEFI de 32 bits podem coexistir e compartilhar a mesma configuração. As imagens e os dados ficam em locais diferentes, de modo que você pode criar tanto a Partição de Inicialização do BIOS quanto a Partição EFI de Sistema e instalar o GRUB para todos os tipos suportados de firmware (ou seja, executando três comandos grub-install). Se você não tiver certeza acerca do teu tipo de firmware ou se planeja mover o disco rígido para um computador diferente, isso é algo que você pode fazer como uma estratégia abrangente.

[Nota]

Nota

Se você estiver fazendo inicialização UEFI, mas tiver criado a partição de BIOS do Grub, possivelmente seja uma boa ideia executar o comando para BIOS caso a inicialização UEFI não funcione como esperado.

[Nota]

Nota

Se você precisar instalar o GRUB somente para um método de inicialização, não tem que executar comandos para ambos os métodos. Você pode executar apenas o comando para o método de inicialização que precisar.

10.4.4.1. Inicialização com BIOS

Para inicializar com BIOS, certifique-se de que a partição de inicialização esteja montada (se usar uma separada) e de que a Partição de BIOS de inicialização exista. Depois disso, instale os arquivos do GRUB em /boot/grub e configure a trilha de inicialização:

[Atenção]

Atenção

O seguinte comando sobrescreverá o carregador de inicialização atual. Não execute o comando de isso não for desejado, por exemplo, se usar um gerenciador de inicialização de terceiro(a) para gerenciar o MBR.

grub-install /dev/sda --target=i386-pc

10.4.4.2. Inicializando com UEFI

Para inicializar com UEFI, certifique-se de que a partição de inicialização esteja montada (se usar uma separada) e de que a Partição EFI de Sistema esteja montada em /boot/efi. Depois disso, instale os arquivos do GRUB em /boot/grub e a imagem principal do GRUB em /boot/efi/EFI/BOOT/BOOTX64.EFI:

[Atenção]

Atenção

O seguinte comando sobrescreverá o arquivo /boot/efi/EFI/BOOT/BOOTX64.EFI. Se ele já existir, é provável que seja a entrada de outro carregador de inicialização (por exemplo, a instalação do GRUB proveniente da distribuição anfitriã ou o Gerenciador de Inicialização do Windows). Produza uma cópia de segurança do arquivo, de modo que ele possa ser restaurado posteriormente ou carregado como um carregador secundário de inicialização pela nova instalação do GRUB originária do LFS.

grub-install --target=x86_64-efi --removable

O comando acima assume que você tenha um firmware UEFI de 64 bits. Se você quiser tornar o sistema inicializável sobre um firmware UEFI de 32 bits, execute o comando com x86_64-efi substituído por i386-efi.

A opção --removable faz com que grub-install use o local padrão, EFI/BOOT/BOOTX64.EFI (ou EFI/BOOT/BOOTIA32.EFI para i386-efi), em vez do local que o GRUB prefere (EFI/GRUB/GRUBX64.EFI ou EFI/GRUB/GRUBIA32.EFI). Usar um local não padrão resultaria no local em uma variável EFI ser registrada, mas o LFS carece do pacote do BLFS efibootmgr, o qual é necessário para o GRUB registrar o local na variável EFI.

[Nota]

Nota

Algumas implementações de firmware UEFI, embora raras, ignoram o caminho EFI padrão. Tais sistemas, na maioria das vezes, são antigos, como Lenovo ThinkPads ou desktops/laptops HP. Quando a entrada de inicialização estiver ausente na configuração do firmware, você precisará instalar o pacote do BLFS efibootmgr para criar uma entrada de inicialização para UEFI. Se for mais fácil, o pacote pode ser instalado pelo gerenciador de pacotes da distribuição, se aplicável, e usado no anfitrião em vez de no sistema LFS. Isso consegue evitar a necessidade de baixar mais tarballs para o sistema LFS por enquanto.

Primeiro instale o pacote e, em seguida, monte o sistema de arquivos da variável EFI, se ele já não estiver montado:

mountpoint /sys/firmware/efi/efivars ||
  mount -v -t efivarfs efivarfs /sys/firmware/efi/efivars

Agora crie uma entrada de inicialização para a EFI:

efibootmgr -c -d /dev/sd<x> \
  -p <y> -L "LFS" -l '\EFI\BOOT\BOOT<X64>.EFI'

A unidade /dev/sd<x> deveria ser o nó de dispositivo para o disco onde a ESP existir. O número da partição <y> deveria corresponder ao número da ESP. Se a ESP estiver em /dev/sda2, então o número da partição seria 2. Se você estiver usando UEFI de 32 bits, substitua <X64> por IA32.

Algum firmware (quebrado) possivelmente exija parâmetros adicionais para efibootmgr, como --full-dev-path ou -e 1 -E. Leia-se a página de manual efibootmgr(8) para detalhes.

Agora desmonte o sistema de arquivos da variável EFI:

umount -v /sys/firmware/efi/efivars

10.4.5. Criando o Arquivo de Configuração do GRUB

Gere o /boot/grub/grub.cfg:

cat > /boot/grub/grub.cfg << "EOF"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5

insmod part_gpt
insmod ext2

set root=(hd0,2)
set gfxpayload=1024x768x32

menuentry "GNU/Linux, Linux 7.1.8-lfs-13.1-systemd" {
        linux   /boot/vmlinuz-7.1.8-lfs-13.1-systemd root=/dev/sda2 ro
}
EOF

Os comandos insmod carregam os módulos do GRUB nominados part_gpt e ext2. Apesar da nomenclatura, ext2 suporta, na verdade, os sistemas de arquivos ext2, ext3 e ext4. Em uma configuração típica, os módulos part_gpt e ext2 já estão embutidos na imagem principal do GRUB pelo grub-install, e os comandos insmod para eles não farão nada. No entanto, eles não danificam de qualquer maneira e podem ser necessários com algumas configurações raras.

O comando set gfxpayload=1024x768x32 configura a resolução e a profundidade de cor do framebuffer VESA a ser passado para o núcleo. Ele é necessário para o controlador SimpleDRM do núcleo usar o framebuffer VESA. Você pode usar um valor diferente de resolução ou de profundidade de cor que melhor se adeque para teu monitor. Essa linha não faz nada quando o sistema for inicializado via UEFI, mas ela não danifica de qualquer maneira.

[Nota]

Nota

A partir da perspectiva do GRUB, os arquivos do núcleo estão relativos à partição usada. Se você usou uma partição /boot separada, remova /boot da linha linux acima. Você também precisará mudar a linha set root para apontar para a partição de inicialização.

[Nota]

Nota

O designador do GRUB para uma partição possivelmente mude se você adicionou ou removeu alguns discos (incluindo discos removíveis, como dispositivos USB miniatura). A mudança possivelmente cause falha de inicialização, pois o grub.cfg se refere a alguns designadores antigos. Se desejar evitar tal problema, você possivelmente use o UUID de uma partição e o UUID de um sistema de arquivos, em vez de um designador do GRUB para especificar um dispositivo. Execute lsblk -o UUID,PARTUUID,PATH,MOUNTPOINT para exibir os UUIDs dos teus sistemas de arquivos (na coluna UUID) e partições (na coluna PARTUUID). Então substitua set root=(hdx,y) por search --set=root --fs-uuid <UUID do sistema de arquivos onde o núcleo estiver instalado>; e substitua root=/dev/sda2 por root=PARTUUID=<UUID da partição onde o LFS estiver construído>.

Observe que o UUID de uma partição é completamente diferente do UUID do sistema de arquivos nessa partição. Alguns recursos online possivelmente instruam você a usar o root=UUID=<UUID do sistema de arquivos>, em vez do root=PARTUUID=<UUID da partição>, porém fazer isso exigirá um initramfs, o qual está além do escopo do LFS.

O nome do nó de dispositivo para uma partição em /dev também possivelmente mude (muito frequentemente em alguns sistemas com múltiplos discos NVME). Você também pode substituir caminhos para nós de dispositivo, como /dev/sda1, por PARTUUID=<UUID da partição>, no /etc/fstab, para evitar uma potencial falha de inicialização no caso do nome do nó de dispositivo tiver mudado.

O GRUB é um programa extremamente poderoso e ele fornece um tremendo número de opções para inicializar a partir de uma ampla variedade de dispositivos, sistemas operacionais e tipos de partição. Existem também muitas opções para personalização, tais como telas gráficas de abertura; reprodução de sons; entrada gerada de mouse; etc. Os detalhes dessas opções estão além do escopo desta introdução.

[Cuidado]

Cuidado

Existe um comando, grub-mkconfig, que consegue escrever um arquivo de configuração automaticamente. Ele usa um conjunto de scripts em /etc/grub.d/ e destruirá quaisquer personalizações que você fizer. Esses scripts são projetados primariamente para distribuições não fonte e não são recomendados para o LFS. Se você instalar uma distribuição comercial do Linux, existe uma boa chance de que esse programa seja executado. Tenha certeza de produzir uma cópia de segurança do teu arquivo grub.cfg.