Dos bootloaders com suporte a UEFI (Unified Extensible Firmware Interface, ou em português Interface Unificada de Firmware Extensível) que tive a oportunidade de conhecer, continuo achando o Grub2 o mais versátil e eficiente. Umas de suas características que mais me agrada é a forma simples com que ele gerencia os kernels instalados, sem a necessidade de reinstalar o bootloader a cada compilação ou instalação promovida ao kernel.

Neste texto tento fazer uma breve descrição do processo de instalação do Grub2 no Slackware, essencialmente reunindo algumas informações garimpadas na rede e adicionando um pouco de experiências próprias. A essência do que será apresentado aqui está no texto “Set up Grub as boot loader on UEFI hardware”, uma excelente texto do Arubin, postado no Slackware Documentation Project.

1. Dependências e mais alguns Ferramentas

A primeira tarefa será instalar as dependências e algumas ferramentas para a construção do pacote do Grub2. Para estas instalações será usado o aplicativo SBopkg, o que agiliza muito o processo de instalação. Caso não conheça o SBopkg aconselho uma breve introdução no texto “Construindo/Instalando pacotes com o SBopkg”.

As dependências do Grub2 com suporte a UEFI são:

  • gnu-unifont – são fontes unifont multilingual utilizadas
  • help2man – ferramentas para gerar páginas de manual;
  • os-prober – aplicativos para detectar outros OSs instalados nas partições do disco;
  • efibootmgr – um aplicativo Linux para modificar/editar o Boot Manager “Intel Extensible Firmware Interface” (EFI).

O efibootmgr não é bem uma dependência para a construção do pacote do Grub2, mas é necessário para o grub-install poder gravar uma entrada na lista de boot, bootlist, da UEFI.

Ainda necessitará dos pacotes:

  • autogen – para gerar o configure das fontes do Grub2;
  • bzr – gerenciador de versões Bazaar para baixar as fontes do Grub2.

Todos os pacotes estão presentes no SlackBuilds.org, o repositório de SlackBuilds utilizado pelo SBopkg.

Instale-os com os comandos a seguir:

for pkg in gnu-unifont help2man os-prober \
autogen bzr efibootmgr; do
  sbopkg -i $pkg
done

Infelizmente o aplicativo sbopkg não possui uma flag para ser executado em modo “não interativo”, por isto terá que pressionar um “P” (Procced) a cada pacote a ser construído.

2. Preparando e Instalando o Grub2

Embora o SBopkg possua o SlackBuild para o Grub2, esta está sem suporte ao EFI habilitado. Por isto será necessário uma abordagem semiautomática aqui, utilizando os scripts do SlackBuild.org com alguns pequenos ajustes.

Instalar o Grub2 diretamente da versão 2.00 necessita de adicionar alguns patchs, muitos deles já introduzidas na versão em desenvolvimento. Por isto aconselho usar o código mais recente do Grub2. Baixe o código fonte do Grub2 através do Bazaar com os comandos abaixo:

mkdir grub2
[prompt]cd grub2
[prompt]bzr branch \
http://bzr.savannah.gnu.org/r/grub/trunk/grub grub-2.0r

A fonte ainda necessitam ser preparada e empacotada para ser usada pelo SlackBuild. Para isto gere o configure com o stript autogen.sh, na raiz das fontes do Grub2, e depois o empacote com o comando tar abaixo:

cd grub-2.0r
[prompt]./autogen.sh
...
[prompt]cd ..
[prompt]tar cJvf grub-2.0r.tar.xz grub-2.0r/
...

Com a fonte do Grub2 pronta, baixe os scripts para a construção do Grub2. Estes podem ser baixados do SlackBuild.org, ou copiados do repositório local criado pelo SBopkg. Supondo que tenha usando o SBopkg, proceda com os comandos a seguir:

source /etc/sbopkg/sbopkg.conf
[prompt]cp $REPO_ROOT/SBo/14.0/system/grub2/* .

Em seguida edite o grub2.SlackBuild, altere a versão para 2.0r e adicione a flag--with-platform=efi‘ à linha do comando ./configure. Esta flag é necessária para habilitar o suporte ao EFI. Abaixo segue os trechos do SlackBuild alterados com algumas outras linhas para referência:

#!/bin/sh
# Slackware build script for grub2
# Written by crocket (crockabiscuit@gmail.com)

PRGNAM=grub2
VERSION=${VERSION:-2.0r}
...
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
./configure \
  --prefix=/usr \
  --libdir=/usr/lib${LIBDIRSUFFIX} \
  --sysconfdir=/etc \
  --localstatedir=/var \
  --infodir=/usr/info \
  --mandir=/usr/man \
  --with-platform=efi \
...

Agora basta compilar e instalar o pacote:

. ./grub2.SlackBuild
...
[prompt]installpkg /tmp/grub-2.0r*

3. Criando e Registrando uma Entrada na UEFI bootlist

Esta é a última parte da instalação, onde deve ser criado um bootloader para o Grub e depois registrá-lo na bootlist da UEFI deve ser registrada. Para isto é necessário que o sistema tenha sido iniciado no modo UEFI e não o BIOS. Para checar isto, carregue o módulo efivars e verifique se as variáveis efi foram criadas, com os comandos abaixo:

modprobe efivars
[prompt]ls /sys/firmware/efi/vars/
AcpiGlobalVariable-af9ffd67-ec10-488a-9dfc-6cbf5ee22c2e/
AutoBootMenuVariable-78c7fa11-1b18-4fec-b317-fbfa03fd32c2/
Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c/
Boot0001-8be4df61-93ca-11d2-aa0d-00e098032b8c/
Boot0002-8be4df61-93ca-11d2-aa0d-00e098032b8c/
Boot0003-8be4df61-93ca-11d2-aa0d-00e098032b8c/
Boot0004-8be4df61-93ca-11d2-aa0d-00e098032b8c/
...

Se o sistema estiver iniciado no modo UEFI, o comando ls deve retornar diversos diretórios e arquivos, como no exemplo acima. Se estiver tudo certo, pule a próxima seção “3.2. Instalando o boot”

3.1. Iniciando no modo UEFI

Caso tenha algum problema com a inicialização no modo UEFI, reinicie o sistema e entre no setup (geralmente pressionando uma das teclas de funções: F1, F2, F9 ou F12. Veja a informação que aparece nos cantos da tela ao ligar o equipamento).

No setup, vá em opções de boot e configura o modo UEFI. Se tiver outra entrada para Windows, Ubuntu ou outro sistema na lista de boot da UEFI, neste momento desative-a. Em minha máquina isto é feito pressionando Shift 1, colocando uma exclamação à frente da opção de boot.

dell_uefi-01

Em uma segunda máquina, baixe da rede a pasta EFI do Slackware-currente 32 ou 64bits, e copie para um pendrive.

Coloque o pendrive na máquina e reinicie o sistema. Durante a inicialização deve aparecer uma tela como a da figura abaixo.

dell_uefi-02

Supondo que o seu Slackware tenha sido instalado em /dev/sda2, introduza a linha de parâmetros:

huge.s root=/dev/sda2 rdinit= ro

para iniciar o sistema. Substitua o /dev/sda2 pela partição raiz em que o seu Slackware foi instalado. Feito isto o sistema deve iniciar com a UEFI habilitado.

3.2. Instalando o boot

Para o restante deste texto vou supor que o sistema tenha sido instalado com um particionamento:

  • /dev/sda1 – partição FAT32, EFI Boot
  • /dev/sda2 – partição raiz do sistema (/)

Monte a partição EFI Boot em /boot/efi:

mkdir /boot/efi
[prompt]mount /dev/sda1 /boot/efi

Em seguida crie o bootloader para o grub com os comandos a seguir:

modprobe dm-mod
[prompt]modprobe efivars
[prompt]grub-install --target=x86_64-efi \
--efi-directory=/boot/efi --bootloader-id=Slackware \
--recheck
BootOrder: 0000,0001,0002,0003,0004,0005,0006,0008,0009
Boot0000  Setup
Boot0001  Boot Menu
Boot0002* Removable Drive
Boot0003  Network
Boot0004* USB Storage Device
Boot0005* CD/DVD/CD-RW Drive
Boot0006* Slackware
Boot0008  Diagnostics
Boot0009  Change boot mode setting
Installation finished. No error reported.

O módulo dm-mod é necessário apenas para uso com discos em RAID. Já a carga do módulo efivars foi adicionado apenas para o caso de não o ter carregado anteriormente. O comando grub_install irá criar o bootloader grubx64.efi em /boot/efi/EFI/Slackware/. Para terminar, crie o grub.cfg para configurar os sistemas em sua máquina:

grub-mkconfig -o /boot/grub/grub.cfg

Para verificar se o boot list da UEFI, use o comando efibootmgr. Neste momento sistema está pronto para iniciar no modo UEFI, com o boot diretamente do Grub2. Se instalar algum kernel novo basta repetir o comando grub-mkconfig, acima.

Se desejar remover um bootnum da lista de boots da UEFI, use o comando efibootmgr:

efibootmgr -b 6 -B

4. Mais Alguns Comentários

A reescrita do bootloader somente será necessária em dois casos:

  • atualização do Grub2 para a adição de alguma nova funcionalidade ou correção de bug;
  • instalação de um novo sistema que tenha sobrescrito a ordem de boot;

O primeiro caso é o menos provável, embora não seja impossível. Neste caso basta reinstalar o novo pacote do Grub2 e repetir os comandos grub-install e grub-mkconfig.

No segundo caso você, o que ocorre na instalação do Windows ou outro GNU/Linux, o esperado é que seja instalado uma nova entrada no bootlist da UEFI. Neste caso basta entrar no setup da máquina e comentar a nova entrada na bootlist, ou alterar a ordem para iniciar pelo Grub2 novamente. Após reiniciar o sistema, repita o comando grub-mkconfig, para adicionar entradas ao menu do Grub para o novo sistema.

Numa instalação que fiz em uma máquina, ao instalar o Windows ele simplesmente removeu a entrada do Grub da bootlist. Este não é o esperado de um sistema, mas … aconteceu. Neste caso desabilite o boot do Windows na bootlist e reinicie a máquina com um pendrive preparado como descrito na seção “Iniciando no modo UEFI” acima. Após isto reinstale o Grub com o comando grub-install, descrito acima.