segunda-feira, 25 de novembro de 2013

Limpando o menu de boot do Fedora

Me aborrece no Fedora desde quando comecei a usá-lo na versão 15 as entradas do menu de boot do GRUB ficarem diferentes do configurado pelo grub2-mkconfig depois de atualizações do kernel.

Isso acontece pois quem as adiciona através dos scriptlets do RPM é o Grubby, um programa que abstrai a configuração para suportar bootloaders diversos.

É um detalhe estético, para o qual reservei algum tempo para escrever uns scriptzinhos solucionando-o.

A primeira coisa é rodar yum -y update e reiniciar caso um novo kernel tenha sido instalado. É importante estar rodando o último kernel instalado.

Removemos todos os pacotes do kernel com exceção do último:

# unset LISTA ; unset REMOVER ; NUM=1 ; for i in $(rpm -q kernel-core | sort -Vr); do [[ $NUM == 1 ]] && ULTIMO="$i" ; LISTA+="$i " ; ((NUM++)) ; done ; [[ $NUM > 2 ]] && { REMOVER=${LISTA//$ULTIMO/} ; yum -y remove $REMOVER ; }

Dizemos para o Dracut não criar a entrada "Rescue", mantendo o modo HostOnly, que resulta em initramfs menores, carregados mais rapidamente pelo bootloader. Considerarei que essa instalação não irá para outra máquina com configuração diferente. O nome dos pacotes mudou entre o F19 e F20+:

F19:
# yum -y install dracut-norescue

F20 ou superior:
# yum -y remove dracut-config-rescue --setopt=clean_requirements_on_remove=0

Configuramos a compressão do initramfs para usar XZ:

# echo 'compress="xz"' >/etc/dracut.conf.d/compressao.conf

Removemos as entradas "Rescue" e mandamos o Dracut regerar os initramfs. Nessa altura, será apenas um, do kernel em uso:

# rm -f /boot/*rescue*
# dracut -f --regenerate-all

Por fim, fazemos o grub2-mkconfig regerar o arquivo de configuração e logo em seguida o Grubby recriar a entrada para o atual kernel usando sua padronização:

# [[ -d /sys/firmware/efi ]] && GRUBCONF="/etc/grub2-efi.cfg" || GRUBCONF="/etc/grub2.cfg" ; grub2-mkconfig -o $(readlink -f $GRUBCONF) ; . /etc/os-release ; grubby --grub2 -c $(readlink -f $GRUBCONF) --add-kernel=/boot/vmlinuz-$(uname -r) --copy-default --make-default --title "$NAME ($(uname -r)) $VERSION" --args="root=UUID=$(findmnt -nro UUID /)" --initrd /boot/initramfs-$(uname -r).img --remove-kernel=/boot/vmlinuz-$(uname -r)

O Grubby mexerá apenas na entrada relacionada ao Fedora, mantendo o resto do arquivo intacto. Entradas para o Windows em de dual boot não serão afetadas se existentes. Funcionará tanto com BIOS quanto UEFI. A partir daqui, futuras atualizações do kernel manterão a padronização e o menu ficará uniforme. A beleza está nos detalhes... ☺

Shell scripts de uma linha só como os acima não são dos mais legíveis. Porém são práticos para rodar com Ctrl+C/V.

Relacionado:
Opções de boot permanentes no GRUB
initramfs "HostOnly" no Fedora 19
initramfs comprimido com XZ

[Atualização - 25/01/2014] Removido LANG=. Estou convicto que é bug do Grubby.
[Atualização - 25/03/2015] Pacote mudou de kernel para kernel-core de uns tempos para cá. Agrupar comandos com chaves.
[Atualização - 26/03/2015] --setopt=clean_requirements_on_remove=0.
[Atualização - 25/05/2015] sort -V

Nenhum comentário:

Postar um comentário