Initramfs mínimo
Procedimento no Debian, Ubuntu, Mint e etc...
Na primeira mensagem vimos como otimizar adicionando todos os drivers em uso. Agora vamos fazer colocando só o que for necessário para carregar o boot. Depois de carregado o próprio udev do sistema carregará os drivers necessário para o funcionamento do sistema.
Com este procedimento em uma máquina com processador celeron, 2Gde ram com HDD tirou 6 segundos do boot, segue o resultado.
Para fazer o teste desligue a máquina, espere 5 segundos e ligue novamente. Não reinicie. Reiniciar a máquina é sempre mais lento.
~$ systemd-analyze
Startup finished in 7.568s (kernel) + 41.636s (userspace) = 49.205s
graphical.target reached after 41.602s in userspace
~$ systemd-analyze
Startup finished in 6.222s (kernel) + 36.791s (userspace) = 43.013s
graphical.target reached after 36.769s in userspace
Para fazer no Linux Mint Mate tive que ler no manual sobre initramfs-tools, pois não conhecia. Diferente do Arch ele por padrão já carrega alguns HOOKS, como teclado, e a maioria não pode ser removida, que são scripts na pasta /usr/share/initramfs-tools/hooks/.
Para entender vamos ver o arquivo /etc/initramfs-tools/initramfs.conf.
Por exemplo o tipo de MODULES
#
# MODULES: [ most | netboot | dep | list ]
#
# most - Add most filesystem and all harddrive drivers.
#
# dep - Try and guess which modules to load.
#
# netboot - Add the base modules, network modules, but skip block devices.
#
# list - Only include modules from the 'additional modules' list
#
MODULES=list
Por padrão ele vem com o most, que adiciona a maioria dos sistemas de arquivos e todos os drivers de disco rígido.
Isso quer dizer que ele utiliza vários módulos desnecessários no carregamento. Iremos trocar para list , que irá incluir apenas os módulos que forem citados no arquivo /etc/initramfs-tools/modules.
Um outro item importante é o BUSYBOX.
#
# BUSYBOX: [ y | n | auto ]
#
# Use busybox shell and utilities. If set to n, klibc utilities will be used.
# If set to auto (or unset), busybox will be used if installed and klibc will
# be used otherwise.
#
BUSYBOX=n
Por padrão é auto. Está opção carrega alguns HOOKS que veremos a seguir. Se não vai utilizar deixar como n. Aqui deixei como n.
Os arquivos de HOOKS são:
/usr/share/initramfs-tools/hooks/klibc-utils
/usr/share/initramfs-tools/hooks/zz-busybox-initramfs
/usr/share/initramfs-tools/hooks/cryptroot
/usr/share/initramfs-tools/hooks/dmraid
Para ver se existe mais algum além destes, execute o comando:
grep -ri BUSYBOX /usr/share/initramfs-tools/hooks/
E por fim, vamos ver a opção COMPRESS
#
# COMPRESS: [ gzip | bzip2 | lzma | lzop | xz ]
#
COMPRESS=lzop
Por padrão usa o gzip, mas vamos trocar para lzop, pois é mais rápido para extrair. Contudo o arquivo fica maior, não muito, pouca coisa.
Agora vamos ver quais módulos temos que realmente usar para carregar.
Como veremos na página falconindy : Optimizing Bootup With mkinitcpio [Dave Reisner]
Lembrando da opção most em MODULES. Adicione a maioria dos sistemas de arquivos e todos os drivers de disco rígido.
Então só precisamos do módulos de sistema de arquivo e disco rígido.
Para fazer isso executamos o comando abaixo:
$ udevadm info --attribute-walk -n /dev/sda1 | grep 'DRIVERS=="[^"]'
DRIVERS=="sd"
DRIVERS=="ahci"
Veja que só precisamos dos módulos sd_mod e ahci
Ok. Estamos quse terminando.
Escolhema opção list em modules (MODULES=list)
Lembra?
Que irá incluir apenas os módulos que forem citados no arquivo /etc/initramfs-tools/modules.
Vamos ver o arquivo agora.
# List of modules that you want to include in your initramfs.
# They will be loaded at boot time in the order below.
#
# Syntax: module_name [args ...]
#
# You must run update-initramfs(8) to effect this change.
#
# Examples:
#
# raid1
# sd_mod
Adicionamos os dois módulos necessários.
# List of modules that you want to include in your initramfs.
# They will be loaded at boot time in the order below.
#
# Syntax: module_name [args ...]
#
# You must run update-initramfs(8) to effect this change.
#
# Examples:
#
# raid1
# sd_mod
ahci
sd_mod
O ext4 não precisa adicionar, pois já é carregado por padrão no initramfs, veja com o comando:
lsinitramfs /boot/initrd.img-4.15.0-60-generic | grep -i ext4
Caso utilize outro recomendo verificar com este comando acima. Se não existi adicione.
Outro exemplo, i915, que também vem adicionado por padrão.
Um método para saber o que vem adicionado por padrão, é deixar o MODULES como list e não adicionar nada em /etc/initramfs-tools/modules. Atualize e o kernel e rode o comando. Atenção, não reinicie a máquina, pois terá problema. Faça isso, e execute lsinitramfs para saber se tem o módulo. Recomendo só fazer isso, se tiver interesse em saber o que é carregado por padrão.
O mais recomendado é fazer todo procedimento adicionando em /etc/initramfs-tools/modules, e depois executar lsinitramfs /boot/initrd.img-4.15.0-60-generic | grep -i "o que procura"
para saber se tem o drive. Caso não tenha, adicione no /etc/initramfs-tools/modules e execute update-initramfs -u novamente para atualizar o initramfs.
OK . Quase pronto.
Agora vams atualizar initramfs. Nesta parte recomendo você fazer um backup do initramfs atual caso aparece alguns problema.
Exemplo:
$ sudo mv initrd.img-4.15.0-60-generic initrd.img-4.15.0-60-generic-backup
Vamos atualizar.
Para atualizar apenas o kernel que está rodando
sudo update-initramfs -u
Para atualizr todos os kernels ( como só tinha um kernel, não testei este comando)
sudo update-initramfs -u -k all
Caso tenha problema ao iniciar
Espere iniciar o menu do grub, escolha a imagem e tecle a tecla e, depois procure por initrd e mude para o nome do backup, por exemplo, initrd.img-4.15.0-60-generic-backup.
Pronto. Reinicie e veja se diminui o tempo com:
$ systemd-analyze
Vou adicionar amanhã o procedimento no Arch