Usando o GRUB para Configurar o Processo de Inicialização com UEFI

Desligar a Inicialização Segura

O BLFS não tem os pacotes essenciais para suportar a Inicialização Segura. Para configurar o processo de inicialização com GRUB e UEFI no BLFS, a Inicialização Segura precisa ser desligada a partir interface de configuração do firmware. Leia a documentação fornecida pelo(a) fabricante do seu sistema para descobrir como.

Configuração do Núcleo para Suporte a UEFI

Habilite as seguintes opções na configuração do núcleo e recompile o núcleo se necessário:

Processor type and features --->
  [*] EFI runtime service support                                          [EFI]
  [*]   EFI stub support                                              [EFI_STUB]

-*- Enable the block layer --->                                          [BLOCK]
  Partition Types --->
    [ /*] Advanced partition selection                      [PARTITION_ADVANCED]
    [*]     EFI GUID Partition support                           [EFI_PARTITION]

Device Drivers --->
  Firmware Drivers --->
    [*] Mark VGA/VBE/EFI FB as generic system framebuffer       [SYSFB_SIMPLEFB]
  Graphics support --->
    <*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
                                                                      ...  [DRM]
      [*] Enable legacy fbdev support for your modesetting driver
                                                      ...  [DRM_FBDEV_EMULATION]
      <*> Simple framebuffer driver                              [DRM_SIMPLEDRM]
    Console display driver support --->
      [*] Framebuffer Console support                      [FRAMEBUFFER_CONSOLE]

File systems --->
  DOS/FAT/EXFAT/NT Filesystems --->
    <*/M> VFAT (Windows-95) fs support                                 [VFAT_FS]
  Pseudo filesystems --->
    <*/M> EFI Variable filesystem                                    [EFIVAR_FS]
  -*- Native language support --->                                         [NLS]
    <*/M> Codepage 437 (United States, Canada)                [NLS_CODEPAGE_437]
    <*/M> NLS ISO 8859-1  (Latin 1; Western European Languages)  [NLS_ISO8859_1]

O significado das opções de configuração:

CONFIG_PARTITION_ADVANCED

Se não estiver habilitado, CONFIG_EFI_PARTITION será habilitado automaticamente. Mas quando estiver habilitado, você precisa configurar CONFIG_EFI_PARTITION como habilitado também.

CONFIG_SYSFB_SIMPLEFB, CONFIG_DRM, CONFIG_DRM_FBDEV_EMULATION, CONFIG_DRM_SIMPLEDRM, CONFIG_FB e CONFIG_FRAMEBUFFER_CONSOLE

A combinação dessas opções fornece suporte ao console Linux no topo do framebuffer UEFI. Para permitir que o núcleo imprima mensagens de depuração em um estágio inicial da inicialização, elas não deveriam ser construídas como módulos do núcleo, a menos que um initramfs seja usado.

Criar um Disco de Inicialização de Emergência

Garanta que um disco de inicialização de emergência esteja pronto para resgatar o sistema no caso do sistema se tornar não inicializável. Para produzir um disco de inicialização de emergência com o GRUB para um sistema baseado em EFI, encontre uma unidade flash USB sobressalente e crie um sistema de arquivos vfat nela. Instale o dosfstools-4.2 primeiro, então, como o(a) usuário(a) root:

[Atenção]

Atenção

O comando a seguir apagará todos os diretórios e arquivos na partição. Certifique-se de que sua unidade flash USB não contém dados que serão necessários e mude sdx1 para o nó de dispositivo correspondente à primeira partição da unidade flash USB. Seja cuidado(a) para não sobrescrever sua unidade rígida com um erro de digitação!

mkfs.vfat /dev/sdx1

Ainda como o(a) usuário(a) root, use o utilitário fdisk para configurar a primeira partição da unidade flash USB para ser uma partição do sistema EFI (mude sdx para o nó de dispositivo correspondente à sua unidade flash USB):

fdisk /dev/sdx

Welcome to fdisk (util-linux 2.39.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): t
Partition number (1-9, default 9): 1
Partition type or alias (type L to list all): uefi
Changed type of partition 'Linux filesystem' to 'EFI System'.

Command (m for help): w
The partition table has been altered.
Syncing disks.

Ainda como o(a) usuário(a) root, crie um ponto de montagem para a partição EFI na unidade flash USB e monte-o:

mount --mkdir -v -t vfat /dev/sdx1 -o codepage=437,iocharset=iso8859-1 \
      /mnt/rescue

Instale o GRUB para EFI na partição:

grub-install --target=x86_64-efi --removable \
             --efi-directory=/mnt/rescue --boot-directory=/mnt/rescue

Desmonte a partição:

umount /mnt/rescue

Agora a unidade flash USB pode ser usada como um disco de inicialização de emergência em qualquer plataforma UEFI x86-64. Para saber como selecionar essa unidade flash como o dispositivo de inicialização, leia o manual da tua placa-mãe ou laptop. Ele inicializará o sistema e mostrará o shell do GRUB. Em seguida, você pode digitar comandos para inicializar teu sistema operacional a partir da unidade rígida.

Encontrar ou Criar a Partição do Sistema EFI

Em sistemas baseados em EFI, os carregadores de inicialização são instalados em uma partição especial FAT32 chamada EFI System Partition (ESP). Se o seu sistema suportar EFI e uma versão recente de alguma distribuição Linux ou Windows estiver pré-instalada, [então] é provável que o ESP já tenha sido criada. Como o(a) usuário(a) root, liste todas as partições em sua unidade rígida (substitua sda pelo dispositivo correspondente à unidade rígida apropriada):

fdisk -l /dev/sda

A coluna Type da ESP deveria ser EFI System.

Se o sistema ou a unidade rígida for novo(a) ou essa for a primeira instalação de um Sistema Operacional inicializado por UEFI no sistema, a ESP possivelmente não exista. Nesse caso, instale dosfstools-4.2 primeiro. Em seguida, crie uma nova partição, produza um sistema de arquivos vfat nela e configure o tipo de partição como EFI system. Vejam-se as instruções para o dispositivo de inicialização de emergência acima como uma referência.

[Atenção]

Atenção

Algumas (antigas) implementações UEFI possivelmente exijam que a ESP seja a primeira partição no disco.

Agora, como o(a) usuário(a) root, crie o ponto de montagem para a ESP e monte-a (substitua sda1 pelo nó de dispositivo correspondente à ESP):

mount --mkdir -v -t vfat /dev/sda1 -o codepage=437,iocharset=iso8859-1 \
      /boot/efi

Se você quiser montar a ESP automaticamente durante a inicialização do sistema, como o(a) usuário(a) root, adicione uma entrada para a ESP em /etc/fstab:

cat >> /etc/fstab << EOF
/dev/sda1 /boot/efi vfat codepage=437,iocharset=iso8859-1 0 1
EOF

Configuração Mínima de Inicialização com GRUB e EFI

Em sistemas baseados em UEFI, o GRUB funciona instalando um aplicativo EFI (um tipo especial de executável) na ESP. O firmware EFI pesquisará carregadores de inicialização em aplicativos EFI a partir de entradas de inicialização registradas em variáveis EFI e, adicionalmente, um caminho rigidamente codificado, EFI/BOOT/BOOTX64.EFI. Normalmente, um carregador de inicialização deveria ser instalado em um caminho personalizado e o caminho deveria ser registrado nas variáveis EFI. O uso do caminho codificado rigidamente deveria ser evitado, se possível. No entanto, em alguns casos, temos que usar o caminho codificado rigidamente:

  • O sistema não foi inicializado com EFI ainda, tornando as variáveis EFI inacessíveis.

  • O firmware EFI é de 64 bits, mas o sistema LFS é de 32 bits, tornando as variáveis EFI inacessíveis porque o núcleo não consegue invocar serviços de tempo de execução EFI com um comprimento diferente de endereço virtual.

  • O LFS é construído para um Live USB, de forma que não podemos confiar nas variáveis EFI, as quais são armazenadas em NVRAM ou em EEPROM na máquina local.

  • Você não consegue ou não quer instalar o efibootmgr para manipular entradas de inicialização em variáveis EFI.

Nesses casos, siga estas instruções para instalar o aplicativo EFI do GRUB no caminho codificado rigidamente e faça uma configuração mínima de inicialização. Caso contrário, é melhor pular à frente e definir a configuração de inicialização normalmente.

Para instalar o GRUB com o aplicativo EFI no caminho rigidamente codificado EFI/BOOT/BOOTX64.EFI, primeiro certifique-se de que a partição de inicialização esteja montada em /boot e de que a ESP esteja montada em /boot/efi. Então, como o(a) usuário(a) root, execute o comando:

[Nota]

Nota

Este comando sobrescreverá /boot/efi/EFI/BOOT/BOOTX64.EFI. Ele possivelmente quebre um carregador de inicialização já instalado lá. Produza uma cópia de segurança dele se não tiver certeza.

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

Esse comando instalará o aplicativo EFI do GRUB no caminho rigidamente codificado /boot/efi/EFI/BOOT/BOOTX64.EFI, de forma que o firmware EFI consiga achá-lo e carregá-lo. Os arquivos restantes do GRUB são instalados no diretório /boot/grub e serão carregados pelo BOOTX64.EFI durante a inicialização do sistema.

[Nota]

Nota

O firmware EFI geralmente prefere os aplicativos EFI com um caminho armazenado em variáveis EFI ao aplicativo EFI no caminho codificado rigidamente. Portanto, você possivelmente precise invocar o menu de seleção de inicialização ou a interface de configuração de firmware para selecionar manualmente o GRUB recém-instalado na próxima inicialização. Leia-se o manual da sua placa-mãe ou laptop para aprender como.

Se você tiver seguido as instruções nesta seção e configurou uma configuração mínima de inicialização, agora pule à frente para Criando o Arquivo de Configuração do GRUB.

Montar o Sistema de Arquivos de Variáveis EFI

A instalação do GRUB em uma plataforma UEFI exige que o sistema de arquivos de Variáveis EFI, efivarfs, esteja montado. Como o(a) usuário(a) root, monte-o se já não estiver montado:

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

Nota

Se o sistema for inicializado com UEFI e systemd, [então] o efivarfs será montado automaticamente. No entanto, no ambiente chroot do LFS ele ainda precisa ser montado manualmente.

[Atenção]

Atenção

Se o sistema não for inicializado com UEFI, [então] o diretório /sys/firmware/efi estará ausente. Nesse caso, você deveria inicializar o sistema no modo UEFI com o disco de inicialização de emergência ou usando uma configuração mínima de inicialização criada como acima, então montar o efivarfs e continuar.

Finalizando a Configuração

Em sistemas baseados em UEFI, o GRUB funciona instalando um aplicativo EFI (um tipo especial de executável) em /boot/efi/EFI/[id]/grubx64.efi, onde /boot/efi é o ponto de montagem da ESP e [id] é substituído por um identificador especificado na linha de comando do grub-install. O GRUB criará uma entrada nas variáveis EFI contendo o caminho EFI/[id]/grubx64.efi, de forma que o firmware EFI consiga encontrar o grubx64.efi e carregá-lo.

O grubx64.efi é muito leve (136 KB com o GRUB-2.06), de forma que não usará muito espaço na ESP. Um tamanho típico da ESP é de 100 MB (para o gerenciador de inicialização do Windows, que usa cerca de 50 MB na ESP). Assim que o grubx64.efi tenha sido carregado pelo firmware, ele carregará os módulos do GRUB a partir da partição de inicialização. O local padrão é /boot/grub.

Como o(a) usuário(a) root, instale os arquivos do GRUB em /boot/efi/EFI/LFS/grubx64.efi e em /boot/grub. Em seguida, configure a entrada de inicialização nas variáveis EFI:

grub-install --bootloader-id=LFS --recheck

Se a instalação for bem-sucedida, [então a saída gerada deveria ser:

Installing for x86_64-efi platform.
Installation finished. No error reported.

Emita o comando efibootmgr | cut -f 1 para verificar novamente a configuração de inicialização EFI. Um exemplo da saída gerada é:

BootCurrent: 0000
Timeout: 1 seconds
BootOrder: 0005,0000,0002,0001,0003,0004
Boot0000* ARCH
Boot0001* UEFI:CD/DVD Drive
Boot0002* Windows Boot Manager
Boot0003* UEFI:Removable Device
Boot0004* UEFI:Network Device
Boot0005* LFS

Observe que 0005 é o primeiro no BootOrder e Boot0005 é LFS. Isso significa que, na próxima inicialização, a versão do GRUB instalada pelo LFS será usada para inicializar o sistema.

Criando o Arquivo de Configuração do GRUB

Gere o /boot/grub/grub.cfg para configurar o menu de inicialização do GRUB:


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)

insmod efi_gop
insmod efi_uga
if loadfont /boot/grub/fonts/unicode.pf2; then
  terminal_output gfxterm
fi

menuentry "GNU/Linux, Linux 6.10.5-lfs-12.2" {
  linux   /boot/vmlinuz-6.10.5-lfs-12.2 root=/dev/sda2 ro
}

menuentry "Firmware Setup" {
  fwsetup
}
EOF

Consulte-se o livro LFS para o conhecimento básico acerca do arquivo grub.cfg. (hd0,2), sda2 e 6.10.5-lfs-12.2 precisam corresponderem à tua configuração.

As diretivas insmod efi_gop e insmod efi_uga carregam dois módulos para suporte de vídeo baseado em EFI. Na maioria dos sistemas, o módulo efi_gop é suficiente. O módulo efi_uga é útil somente para sistemas legados, mas é inofensivo carregá-lo de qualquer maneira. O suporte de vídeo é necessário para a diretiva terminal_output gfxterm realmente funcionar.

A diretiva terminal_output gfxterm muda a resolução da tela do menu do GRUB para corresponder ao teu dispositivo de exibição. Isso quebrará a renderização se o arquivo de dados da fonte unicode.pf2 não estiver carregado, de forma que ele é protegido por uma diretiva if.

[Nota]

Nota

Da perspectiva do GRUB, os arquivos são relativos às partições usadas. Se você usou uma partição /boot separada, [então] remova /boot dos caminhos acima (para o núcleo e para unicode.pf2). Você também precisará mudar a linha "set root" para apontar para a partição de inicialização.

A entrada Firmware Setup pode ser usada para entrar na interface de configuração fornecida pelo firmware (às vezes chamada de Configuração do BIOS).

Inicialização Dupla com o Windows

Adicione uma entrada de menu para o Windows no grub.cfg:

cat >> /boot/grub/grub.cfg << EOF
# Início da adição do Windows

menuentry "Windows 11" {
  insmod fat
  insmod chain
  set root=(hd0,1)
  chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
EOF

(hd0,1) deveria ser substituído pelo nome designado pelo GRUB para a ESP. A diretiva chainloader pode ser usada para dizer ao GRUB para executar outro executável EFI, nesse caso o Windows Boot Manager. Você pode colocar mais ferramentas utilizáveis no formato de executável EFI (por exemplo, um shell EFI) na ESP e, também, criar entradas do GRUB para elas.