Grub2 com EFI em Slackware
Índice
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.
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.
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.
Deixe uma resposta