domingo, 3 de julho de 2011

Faxina no Linux: Limpando as Imagens Antigas do Kernel

Você pode não ter notado, mas algumas distribuições, como o Ubuntu, no momento de fazer uma grande atualização, podem baixar novas versões do Kernel, compilá-las automaticamente (ou ao menos instalar imagens pré-compiladas), gerando as chamadas "Imagens do Kernel" e aplicá-las nas opções do boot. Este procedimento não tem problema nenhum, salvo o fato de que as imagens são sempre acompanhadas pelo código-fonte, o que ocupa bastante espaço no seu disco. Além disso, polui a tela de boot do LILO ou GRUB com opções diferentes para cada imagem de kernel, desde a mais antiga, que veio com a instalação do sistema, até as mais recentes baixadas e instaladas.
Como limpar estas imagens de Kernel seguramente, remover as centenas de megas em fontes ocupando seu disco rígido e limpar as entradas das opções de boot do GRUB? Este artigo trata exatamente desta dica, e creio que possa ser de grande valia para muitos usuários Linux, especialmente aqueles que costumam fazer atualizações constantes.

Em sistemas baseados em Debian, como o Ubuntu, para rodar uma atualização completa, basta que se digite, como root:

apt-get dist-upgrade

A atualização do sistema pode reportar, muitas vezes, uma atualização das imagens do Kernel no meio do monte de pacotes sendo atualizados. Isto pode ser verificado nas linhas em negrito do exemplo abaixo:

apt-get dist-upgrade
Lendo listas de pacotes... Pronto
Construindo árvore de dependências      
Lendo informação de estado... Pronto
Calculando atualização... Pronto
Os NOVOS pacotes a seguir serão instalados:
  linux-headers-2.6.32-32 linux-headers-2.6.32-32-server linux-image-2.6.32-32-server
Os pacotes a seguir serão atualizados:
  apparmor apparmor-utils apt apt-transport-https apt-utils at base-files bind9-host binutils bsdutils dhcp3-client dhcp3-common dnsutils fuse-utils grub-common grub-pc initscripts landscape-common libapache2-mod-php5 libapache2-svn libapparmor-perl libapparmor1 libapr1 libbind9-60 libblkid1 libc-bin libc-dev-bin libc6 libc6-dev libcurl3-gnutls libdbus-1-3 libdbus-glib-1-2 libdns64 libfuse2 libgssapi-krb5-2 libisc60 libisccc60 libisccfg60 libk5crypto3 libkrb5-3 libkrb5support0 libldap-2.4-2 liblwres60 libpam-modules libpam-runtime libpam0g libpcsclite1 libplymouth2 libssl0.9.8 libsvn1 libuuid1 libxml2 linux-firmware linux-headers-server linux-image-server linux-libc-dev linux-server login logrotate mount ntpdate openssh-client openssh-server openssl passwd perl perl-base perl-modules php5 php5-common plymouth plymouth-theme-ubuntu-text python-smartpm rsync subversion sysv-rc sysvinit-utils tzdata upstart util-linux uuid-runtime w3m xkb-data
83 pacotes atualizados, 3 pacotes novos instalados, 0 a serem removidos e 0 não atualizados.
É preciso baixar 96,8MB de arquivos.
Depois desta operação, 216MB adicionais de espaço em disco serão usados.
Você quer continuar [S/n]?

O novo Kernel é empacotado em pacotes com outros nomes, então, para o gerenciador de pacotes, não é considerado uma atualização, e sim uma gama de pacotes novos a serem instalados. Observe que existem muitos pacotes sendo de fato atualizados, o que não vai consumir espaço excedente quase nenhum, mas tem uma nova versão do Kernel a ser baixada, o que vai consumir 216MB de espaço, já que é preciso que se baixem todos os fontes. Naturalmente, a versão antiga, que está em pacotes de outros nomes, será mantida por padrão.
Depois de selecionar "S" para a pergunta e a atualização acabar, você já terá ocupado mais de 300MB deste sistema aí em cima sendo atualizado. Então, vamos limpar os arquivos de backup dos pacotes que foram baixados e atualizados. Se a atualização funcionou, não precisamos mais deles. Para tanto, digite:

apt-get clean

TESTE: Agora, dê um boot e certifique-se de que o sistema esteja funcionando perfeitamente, ou seja, a nova imagem do Kernel funciona e está estável (para fazer isto em modo texto, digite: "shutdown -r now"). Em avassaladora massa de vezes tudo estará perfeitamente estável, mas não custa fazer o teste, especialmente em servidores. Como o Pajezinho sempre diz, "um homem prevenido vale por cinco"!!

Estando tudo perfeito, vamos apagar os Kernels antigos do sistema:

apt-get autoremove

Respondendo "S" à pergunta gerada com o comando acima, será possível eliminar os pacotes referentes a Kernels antigos, aliviando centenas de megas de seu disco rígido. Contudo, isto ainda não limpa as imagens que estão associadas ao boot e à tela inicial do GRUB. Para limpá-las, é preciso que se vá ao diretório "/boot" e se apague os arquivos certos.

cd /boot
ls -1
abi-2.6.32-26-generic
abi-2.6.32-27-generic
abi-2.6.32-28-generic
abi-2.6.32-29-generic
abi-2.6.32-30-generic
abi-2.6.32-31-generic
abi-2.6.32-32-generic
config-2.6.32-26-generic
config-2.6.32-27-generic
config-2.6.32-28-generic
config-2.6.32-29-generic
config-2.6.32-30-generic
config-2.6.32-31-generic
config-2.6.32-32-generic
grub
initrd.img-2.6.32-26-generic
initrd.img-2.6.32-27-generic
initrd.img-2.6.32-28-generic
initrd.img-2.6.32-29-generic
initrd.img-2.6.32-30-generic
initrd.img-2.6.32-31-generic
initrd.img-2.6.32-32-generic
memtest86+.bin
System.map-2.6.32-26-generic
System.map-2.6.32-27-generic
System.map-2.6.32-28-generic
System.map-2.6.32-29-generic
System.map-2.6.32-30-generic
System.map-2.6.32-31-generic
System.map-2.6.32-32-generic
vmcoreinfo-2.6.32-26-generic
vmcoreinfo-2.6.32-27-generic
vmcoreinfo-2.6.32-28-generic
vmcoreinfo-2.6.32-29-generic
vmcoreinfo-2.6.32-30-generic
vmcoreinfo-2.6.32-31-generic
vmcoreinfo-2.6.32-32-generic
vmlinuz-2.6.32-26-generic
vmlinuz-2.6.32-27-generic
vmlinuz-2.6.32-28-generic
vmlinuz-2.6.32-29-generic
vmlinuz-2.6.32-30-generic
vmlinuz-2.6.32-31-generic
vmlinuz-2.6.32-32-generic

O comando "ls -1" lista os arquivos e diretórios todos em uma única coluna. Usei este comando para ficar mais fácil a leitura da saída dele aqui no blog. Obverse que temos aí uma verdadeira confusão: uma sopa de kernels e imagens que foram instalados, desde o 2.6.32-26 até o 2.6.32-32. O mais recente é aquele que instalamos lá em cima, o 2.6.32-32. Se ele está rodando e funcionando perfeitamente (conforme nosso teste acima), então podemos seguramente apagar todos os outros:

rm *-26* *-27* *-28* *-29* *-30* *-31*

Cuidado com o comando acima!!! Um dígito errado e você poderá estar prejudicando permanentemente seu sistema!! Apague apenas os arquivos cujos nomes apontam para as versões ANTIGAS do Kernel, nunca os que apontam para a mais recente!!
Depois disso, basta atualizar o GRUB ou o LILO (dependendo de qual você use) para que ele não aponte mais para as imagens antigas (até porque, elas foram apagadas). Para atualizar o LILO, é preciso que se edite manualmente o seu arquivo de configurações, removendo as linhas correspondentes às imagens apagadas. Para atualizar o GRUB (que é bem mais fácil!!), basta que se rode o seguinte comando:

update-grub2
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.32-32-generic
Found initrd image: /boot/initrd.img-2.6.32-32-generic
Found memtest86+ image: /boot/memtest86+.bin
done

Prontinho!!!! O GRUB encontrou apenas uma versão do Kernel, que é a mais recente!! Você já pode reiniciar o sistema e ver a tela limpinha do GRUB funcionando. Pode verificar seu disco para notar o quanto de espaço foi recuperado graças ao comando "apt-get autoremove" (para verificar o disco, use o comando "df -h").


Observações Importantes:

1- Evite colocar esta operação em scripts. São operações delicadas e muito pouco rotineiras. Faça-as com carinho e cuidado, manualmente;
2- Em servidores, assegure-se do momento mais propício para reiniciar a máquina;
3- Caso você tenha compilado manualmente uma versão do Kernel, assegure-se de deixá-la intacta. Tudo que não for removido será automaticamente detectado pelo GRUB e permanecerá válido;
4- Se você tiver medo na hora de apagar os arquivos do /boot, faça um backup deles. Caso necessário, apague os arquivos um a um, sem usar o "*", de forma a que você não se engane nem apague um arquivo errado;
5- Se você fez tudo isso e usa o indexador padrão do Linux, este é um bom momento para rodar o comando "updatedb". Não vai lhe render muito mais espaço em disco, mas vai remover uma série de entradas dos índices e vai deixar a busca mais leve;
6- Evidentemente, faça absolutamente todas estas operações como superusuário (root). De outro modo, nenhuma delas funcionará.

Bom, espero ter ajudado!! Boa sorte e, lembrem-se: COMENTEM!!!

2 comentários:

Unknown disse...

apt-get autoremove
apt-get clean
bleachbit

Para remover pacotes desnecessários:
deborphan = sudo deborphan | xargs sudo apt-get -y remove --purge

Para remover kernel antigo:
dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge

O Pajé disse...

Obrigado pela contribuição, rapaz!! Agora virou script mesmo... bom, essas coisas sérias eu gosto de rodar na mão... velhos hábitos... mas pode ser q muita gente goste de fazer como vc. Boa dica!!