[Dica/Tuto] Initramfs mínimo (Debian e etc...) utilizando o dracut

[Dica/Tuto] Initramfs mínimo (Debian e etc…) utilizando o dracut

Para o Debian e etc…: [Dica/Tuto] Otimizando initramfs ( Debian) e adicionado Initramfs mínimo( menos 6s no boot em um Celeron®) - 03/09

Para Arch: [Dica/Tuto] Initramfs mínimo( Arch e etc...)

Com a dica do @anon58028541 fui pesquisar sobre o dracut. Vi o manual, e fiz alguns testes. Alguns deram certo, e outros não.

Este procedimento foi feito no Linux Mint Mate. Ao instalar o dracut, ele automaticamente remove o pacote initramfs-tools

Para ler:
https://wiki.gentoo.org/wiki/Dracut

Para instalar:

apt install dracut

O primeiro comando que vamos ver é para listar os módulos instalados.

$ dracut --list-modules | sort
dracut: Executing: /usr/bin/dracut --list-modules
aufs
base
bash
biosdevname
bootchart
btrfs
busybox
caps
cio_ignore
console-setup
convertfs
crypt
crypt-gpg
crypt-loop
dasd
dasd_mod
dasd_rules
dash
debug
dm
dmraid
dmsquash-live
dracut-systemd
drm
ecryptfs
fips
fips-aesni
fs-lib
fstab-sys
gensplash
img-lib
integrity
kernel-modules
lunmask
lvm
lvmmerge
masterkey
mdraid
modsign
multipath
multipath-hostonly
overlay-root
plymouth
pollcdrom
qemu
rescue
resume
rootfs-block
securityfs
selinux
shutdown
syslog
systemd
systemd-initrd
terminfo
udev-rules
usrmount
watchdog

Tem bastante módulo, mas só iremos precisar de dois para carregar o boot. Lembrando se usa lvm, raid e etc… terá que adicionar, por exemplo o dmraid.

OK
Para inicializar um sistema de arquivos ext (2,3,4), btrfs, xfs e etc…

Como falei só precisamos de dois o rootfs-block e o base.

Estes módulos irão carregar mais dois como dependência: udev-rules e fs-lib

Vamos começar a configurar, lembrando que o exemplo utiliza o sistema de arquivo ext4.

Vamos ver os drivers necessários de dispositivos que precisam ser carregados.

Assumindo que o /dev/sda1 seja o root

$ udevadm info --attribute-walk -n /dev/sda1 | grep 'DRIVERS=="[^"]'
    DRIVERS=="sd"
    DRIVERS=="ahci" 

Os drivers são sd_mod e ahci.
No dracut só sobem alguns drivers por padrão, então só precisamos adicionar o ahci.

Abra o arquivo para edição:

/etc/dracut.conf

E adicione
dracutmodules+=“rootfs-block base”
add_drivers+="ahci "

Caso tenha placa de vídeo Intel tem que adicionar o i915

add_drivers+="ahci i915 "

OK.

Vamos adicionar os seguintes opções também.

do_prelink=no
hostonly=yes
hostonly_cmdline="yes"
show_modules="yes"

Estas opções servem para otimizar ainda mais.
Recomendo ler o manual
man dracut.conf
http://manpages.ubuntu.com/manpages/bionic/man5/dracut.conf.5.html

Seguem as informações

  do_prelink="{yes|no}"
	 Prelink de Binários no initramfs (padrão = yes)
	
  hostonly="{yes|no}"
     Modo somente host: instale apenas o necessário para inicializar o host local em vez de um host genérico e gera configuração específica do host.
  
  hostonly_cmdline="{yes|no}"
     Se definido como "yes", armazene os argumentos da linha de comando do kernel necessários no initramfs
  
  show_modules="{yes|no}"
     Mostra o nome dos módulos incluídos na saída padrão durante a compilação.

Outras opções
omit_dracutmodules+=“systemd-initrd”
compress=“lz4 -l -9”

A opção omit_dracutmodules é para omitir módulos. O módulo systemd-initrd vem carregado por padrão. Ele serve para habilitar a exibição completa do comando 

~$ systemd-analyze

Caso não queira, insira no omit_dracutmodules+="

O **compress**, é a compressão utilizada na imagem.


   compress="{bzip2|lzma|xz|gzip|lzo|lz4|zstd|<compressor [args ...]>}"
      Compacta o initramfs gerado usando o programa de compactação informado. Se você informar apenas o nome de um programa de compactação, ele o programa. Se você informar os argumentos, ele será chamado exatamente com esses argumentos.
      Dependendo do que você informa, isso pode resultar em um initramfs que o kernel não pode descomprimir.
      
      **LZ4**
      
  compress="lz4 -l -9"

-l : compress using Legacy format (Linux kernel compression)
-9 : High compression

OK. Acabamos a configuração.

No exemplo , ficou assim

dracutmodules+="rootfs-block base"
add_drivers+="ahci hid hid_generic i915 "
#omit_dracutmodules+="systemd-initrd"
compress="lz4 -l -9"
do_prelink=no
hostonly=yes
hostonly_cmdline="yes"
show_modules="yes"

Caso queira habilitar o #omit_dracutmodules+, é só descomentar.

Pronto.

Agora vamos criar o imagem.
Caso use um só kernel recomendo fazer backup

sudo mv /boot/initrd.img-4.15.0-60-generic /boot/initrd.img-4.15.0-60-generic.backup

Faça com o mesmo nome.
sudo dracut -f /boot/initrd.img-4.15.0-60-generic

A opção -f é para se existir o arquivo, substituir.

Se não entrar
Ao iniciar a tela do grub, selecione uma imagem e tecle a tecla e.

Procure pelo initrd

initrd.img-4.15.0-60-generic

e substitua

initrd.img-4.15.0-60-generic.backup

Pressione o F10

e irá entrar. Remova a configuração no /etc/dracut.conf, e execute novamente.

sudo dracut -f /boot/initrd.img-4.15.0-60-generic

Só para finalizar.
Se quiser ver se tem o drive na imagem, utilize o comando lsinitrd

 $ lsinitrd /boot/initrd.img-4.15.0-60-generic | grep ext4
lrwxrwxrwx   1 root     root            6 Sep  9 15:31 sbin/fsck.ext4 -> e2fsck

O arquivo final da imagem ficou em torno de 10M

4 curtidas