Ambiente
Este artigo é específico para usuários do Slackware Linux, e os comandos apresentados foram testados na versão 15 do sistema. A parte conceitual é válida para todos os sistemas Linux, porém os mecanismos adotados para manipulação do initrd são desenvolvidos especificamente para esta distribuição. O ELILO é adotado como carregador de inicialização padrão.
Guia Rápido
Use os scripts geninitrd e eliloconfig para gerar e instalar, automaticamente e de forma simples, o novo initrd e o kernel no boot EFI. Para obter informações detalhadas sobre o processo manual e automatizado, continue lendo o artigo.
Introdução
Este artigo seguirá o formato proposto por Patrick Volkerding em seu tutorial intitulado "Slackware initrd mini HOWTO" e responderá às perguntas apresentadas por ele:
- O que é o initrd?
- Por que eu preciso de um initrd?
- Como faço para gerar o initrd?
- Agora que criei um initrd, como posso usá-lo?
O que é o initrd?
O initrd é um sistema de arquivos temporário carregado na memória RAM durante o processo de inicialização do Linux. Ele contém módulos e scripts necessários para montar o sistema de arquivos raiz real antes que o kernel possa assumir o controle completo do sistema.
Por que eu preciso de um initrd?
O initrd é necessário quando o kernel não possui drivers embutidos para acessar o hardware necessário para montar o sistema de arquivos raiz, por exemplo, drivers para controladores de disco (SCSI, RAID) ou sistemas de arquivos específicos (ext4, reiserfs, xfs).
Nos kernels Linux modernos, há uma grande variedade de opções e configurações disponíveis. Não é prático distribuir vários kernels diferentes para atender a todas as necessidades específicas, é muito mais flexível fornecer um kernel genérico acompanhado de um conjunto de módulos que podem ser carregados conforme necessidade.
É aí que o initrd entra em ação. Ele pode ser gerado via linha de comando para carregar os módulos específicos necessários para o hardware e o sistema de arquivos utilizados em um determinado sistema.
Dito isso, o Slackware disponibiliza uma versão do kernel chamada huge que contém drivers integrados suficientes para que, na maioria dos casos, um initrd não seja necessário para inicializar o sistema.
É fortemente recomendado usar um kernel genérico, pois isso economizará um pouco de memória, possivelmente evitará alguns avisos durante a inicialização e manterá uma melhor compatibilidade dos módulos do kernel.
Como faço para gerar o initrd?
Muito provavelmente, a primeira vez que você precisará criar um initrd será após a atualização do kernel. No Slackware 15, toda vez que o kernel for atualizado, será necessário recriar o initrd manualmente.
Felizmente, essa não é uma tarefa difícil nos dias atuais. Existem alguns scripts disponíveis para auxiliar nesse processo. Primeiro, será apresentada uma versão mais manual, o que ajudará a esclarecer o que está sendo feito e será útil para quem utiliza mais de um kernel e não quer que seus arquivos de configuração sejam sobrescritos.
Para criar o initrd, será necessário conhecer a versão do novo kernel após a atualização. Para encontrar essa informação, execute o comando:
# bash
uname -r
5.15.161
O script mkinitrd_command_generator.sh será usado para extrair as opções do sistema necessárias, que serão usadas como parâmetros no comando mkinitrd. Esse comando, por sua vez, será utilizado para gerar o novo initrd.
No comando a seguir, substitua 5.15.161 pela versão do seu kernel:
# bash
/usr/share/mkinitrd/mkinitrd_command_generator.sh -k 5.15.161
#
# mkinitrd_command_generator.sh revision 1.45
#
# This script will now make a recommendation about the command to use
# in case you require an initrd image to boot a kernel that does not
# have support for your storage or root filesystem built in
# (such as the Slackware 'generic' kernels').
# A suitable 'mkinitrd' command will be:
mkinitrd -c -k 5.15.161 -f ext4 -r /dev/sdb2 -m xhci-pci:ohci-pci:ehci-pci:xhci-hcd:uhci-hcd:ehci-hcd:hid:usbhid:i2c-hid:hid_generic:hid-asus:hid-cherry:hid-logitech:hid-logitech-dj:hid-logitech-hidpp:hid-lenovo:hid-microsoft:hid_multitouch:jbd2:mbcache:crc32c_intel:crc32c_generic:ext4 -u -o /boot/initrd.gz
Copie o comando gerado ao final da execução do script e execute-o para gerar o initrd:
# bash
mkinitrd -c -k 5.15.161 -f ext4 -r /dev/sdb2 -m xhci-pci:ohci-pci:ehci-pci:xhci-hcd:uhci-hcd:ehci-hcd:hid:usbhid:i2c-hid:hid_generic:hid-asus:hid-cherry:hid-logitech:hid-logitech-dj:hid-logitech-hidpp:hid-lenovo:hid-microsoft:hid_multitouch:jbd2:mbcache:crc32c_intel:crc32c_generic:ext4 -u -o /boot/initrd.gz
OK: /lib/modules/5.15.161/kernel/drivers/usb/host/xhci-hcd.ko added.
OK: /lib/modules/5.15.161/kernel/drivers/usb/host/xhci-pci-renesas.ko added.
OK: /lib/modules/5.15.161/kernel/drivers/usb/host/xhci-pci.ko added.
....
60343 blocks
/boot/initrd.gz created.
Be sure to run lilo again if you use it.
Seu novo initrd foi gerado e está localizado em /boot/initrd.gz.
Agora que criei um initrd, como posso usá-lo?
Após criar o initrd, você precisará carregá-lo junto com o kernel durante a inicialização. Se estiver usando o ELILO como carregador de inicialização, copie o arquivo gerado para a pasta do boot EFI em /boot/efi/EFI/Slackware/.
Copie o novo kernel junto com o initrd para o diretório do boot EFI:
# bash
cp /boot/initrd.gz /boot/efi/EFI/Slackware/ cp /boot/vmlinuz-generic /boot/efi/EFI/Slackware/vmlinuz
Pronto! Seu novo kernel e initrd já estão instalados e serão carregados corretamente na próxima inicialização.
A seguir, exploraremos mais opções e um pouco mais de contexto, caso queira entender melhor o que está fazendo. No entanto, as configurações necessárias para carregar o novo kernel e initrd com sucesso já foram concluídas nas instruções anteriores.
Um pouco de contexto
Dentro do diretório de boot EFI estão os arquivos responsáveis pela inicialização do sistema operacional. Vamos listar alguns deles:
# bash
ls -lh /boot/efi/EFI/Slackware/
total 17M
-rwxr-xr-x 1 root root 160 Dec 7 11:35 elilo.conf
-rwxr-xr-x 1 root root 233K Jun 12 2018 elilo.efi
-rwxr-xr-x 1 root root 9.2M Dec 7 11:31 initrd.gz
-rwxr-xr-x 1 root root 7.5M Jun 16 2024 vmlinuz
- elilo.conf
- Arquivo de configuração do bootloader.
- elilo.efi
- Arquivo de boot lido pela UEFI; é responsável por carregar o kernel e o initrd.
- initrd.gz
- Módulos do hardware e sistema de arquivos necessários para o correto funcionamento antes da inicialização do sistema.
- vmlinuz
- Kernel do Linux.
A localização do initrd é definida no arquivo elilo.conf. Vamos dar uma olhada nele:
# bash
vi /boot/efi/EFI/Slackware/elilo.conf
O conteúdo do arquivo deve ser algo como:
elilo.conf
chooser=simple delay=1 timeout=1 # image=vmlinuz label=Linux initrd=initrd.gz read-only append="root=/dev/sdb2 vga=normal ro"
Neste arquivo, são feitas as personalizações do bootloader, como a escolha de múltiplos kernels a serem selecionados durante a inicialização, o tempo de espera antes do carregamento automático e outras opções de configuração.
Mais sobre como gerar o initrd
Você pode definir opções padrão para o comando mkinitrd no arquivo de configuração /etc/mkinitrd.conf. Uma versão de exemplo desse arquivo está disponível em /etc/mkinitrd.conf.sample e serve como um bom ponto de partida.
Use man mkinitrd.conf para obter mais informações sobre o arquivo de configuração e man mkinitrd para detalhes sobre o comando.
O script mkinitrd_command_generator.sh, quando usado com a opção -c, exibirá os parâmetros baseados no sistema atual, que podem ser usados no arquivo de configuração.
# bash
/usr/share/mkinitrd/mkinitrd_command_generator.sh -c
SOURCE_TREE="/boot/initrd-tree"
CLEAR_TREE="1"
OUTPUT_IMAGE="/boot/initrd.gz"
KERNEL_VERSION="5.15.161"
KEYMAP="us"
MODULE_LIST="xhci-pci:ohci-pci:ehci-pci:xhci-hcd:uhci-hcd:ehci-hcd:hid:usbhid:i2c-hid:hid_generic:hid-asus:hid-cherry:hid-logitech:hid-logitech-dj:hid-logitech-hidpp:hid-lenovo:hid-microsoft:hid_multitouch:jbd2:mbcache:crc32c_intel:crc32c_generic:ext4"
LUKSDEV=""
ROOTDEV="/dev/sdb2"
ROOTFS="ext4"
RESUMEDEV=""
RAID=""
LVM=""
UDEV="1"
WAIT="1"
Vamos criar o arquivo de configuração mkinitrd.conf a partir do arquivo de exemplo mkinitrd.conf.sample e dos parâmetros gerados pelo script:
vi /etc/mkinitrd.conf
/etc/mkinitrd.conf
KERNEL_VERSION="$(uname -r)" KEYMAP="br-abnt2" MODULE_LIST="xhci-pci:ohci-pci:ehci-pci:xhci-hcd:uhci-hcd:ehci-hcd:hid:usbhid:i2c-hid:hid_generic:hid-asus:hid-cherry:hid-logitech:hid-logitech-dj:hid-logitech-hidpp:hid-lenovo:hid-microsoft:hid_multitouch:jbd2:mbcache:crc32c_intel:crc32c_generic:ext4" ROOTDEV="/dev/sdb2" ROOTFS="ext4"
Explicando
Foram omitidos do arquivo de configuração os parâmetros que já são assumidos por padrão, como SOURCE_TREE, OUTPUT_IMAGE, UDEV e WAIT. A opção CLEAR_TREE também foi omitida, pois não é recomendada quando se deseja manter suporte a múltiplos kernels. Outras opções, como LUKSDEV, RESUMEDEV, RAID e LVM, não se aplicam a este exemplo.
- KERNEL_VERSION
- Ao utilizar $(uname -r), a versão do kernel atual será automaticamente utilizada, dispensando a necessidade de digitá-la em cada comando.
- KEYMAP
- Define o mapa de teclado personalizado a ser carregado durante a inicialização.
- MODULE_LIST
- Especifica a lista de módulos a serem incluídos no initrd.
- ROOTDEV
- Define o dispositivo onde o sistema de arquivos raiz está localizado.
- ROOTFS
- Especifica o tipo de sistema de arquivos utilizado para a raiz do sistema.
As configurações dos parâmetros MODULE_LIST, ROOTDEV e ROOTFS foram retiradas da saída gerada pelo comando mkinitrd_command_generator.sh -c.
Com essas poucas linhas no arquivo de configuração, já é possível replicar o comando inteiro gerado pelo script, utilizando apenas mkinitrd -F. A opção -F instrui o comando a utilizar o conteúdo do arquivo de configuração como parâmetros.
Com essas configurações, a menos que haja uma mudança de hardware que impacte os módulos a serem carregados, será possível atualizar o initrd após um upgrade do kernel utilizando os seguintes comandos:
# bash
mkinitrd -F cp /boot/initrd.gz /boot/efi/EFI/Slackware/ cp /boot/vmlinuz-generic /boot/efi/EFI/Slackware/vmlinuz
Usando os scripts automatizados do Slackware
O processo fica bem mais fácil ao utilizar as opções padrão disponíveis no Slackware para criar o initrd e copiar o novo kernel para a pasta do boot EFI.
Então, por que tantas informações se isso tudo poderia ser resolvido rapidamente?
Muitas pessoas optam pelo Slackware porque ele oferece total controle sobre cada etapa da configuração, o que é especialmente útil quando você precisa realizar personalizações fora do escopo dos scripts automatizados.
Se este não for o seu caso, sua vida será mais simples. Após atualizar o kernel, basta executar:
# bash
geninitrd
A imagem anterior será exibida e, ao final, quando o prompt de comando for liberado, o novo initrd.gz estará disponível em /boot.
Para copiar o initrd e o kernel recém-atualizado para a pasta do boot EFI, execute o comando eliloconfig e siga as instruções até a conclusão do script:
# bash
eliloconfig
Selecione install ↓
Selecione install novamente. Use skip somente se você estiver utilizando hardware da Apple ↓
Remova a entrada de boot antiga. Selecione Yes ↓
Processo concluído com sucesso. OK ↓
Com os dois scripts, geninitrd e eliloconfig, seu sistema estará pronto para usar o novo kernel e o novo initrd, ambos gerados e instalados no setor de boot.
Conclusão
Neste artigo, aprendemos como criar e utilizar o initrd no Slackware, abordando desde a geração manual até o uso de scripts automatizados para facilitar o processo. Com as configurações e procedimentos detalhados, é possível garantir que o novo kernel e initrd sejam corretamente configurados e carregados durante a inicialização. Embora o Slackware ofereça métodos automáticos, a flexibilidade do sistema permite personalizações, garantindo controle total ao usuário para ajustes específicos de acordo com suas necessidades.
Referências
Algumas das fontes utilizadas na elaboração deste artigo:
- https://www.rodsbooks.com/efi-bootloaders/elilo.html
- https://manpages.org/elilo/8
- https://www.reddit.com/r/slackware/comments/ywjkr2/how_do_i_configure_elilo_after_a_kernel_upgrade/?rdt=52334
- https://www.linuxquestions.org/questions/slackware-14/v-15-update-initrd-4175709534/
- https://www.linuxquestions.org/questions/slackware-14/after-slackpkg-upgrade-all-upgrades-kernel-making-a-new-initramfs-is-necessary-but-not-automatic-right-4175709694/
- http://www.slackware.com/security/viewer.php?l=slackware-security&y=2024&m=slackware-security.1327811