In alcuni casi è indispensabile rimuovere i kernel inutilizzati di Linux. In questo articolo ti descrivo nel dettaglio i comandi per eseguire questa delicata operazione in modo automatico su Ubuntu, mostrandoti anche come intervenire manualmente quando la rimozione automatica non risulta possibile.
AAA
Ricordo un thread su usenet dove un nubbio si stupiva del fatto che Linux permettesse di eseguire, senza particolari controlli di sicurezza, operazioni potenzialmente dannose per l’intero sistema. La prima delle risposte era una citazione:
Questo è Unix: ti da abbastanza corda per impiccarti da solo.
Non serve che aggiunga altro, giusto!? ;)
Perché rimuovere i kernel inutilizzati su Ubuntu
Molti sistemisti seguono la regola “Se non è rotto non aggiustarlo“, sopratutto quando hanno a che fare con cose delicate, come il kernel di Linux. Io non sono un accanito sostenitore di questo principio, ma capisco che recuperare spazio su disco può non essere un motivo sufficiente per eseguire un’operazione delicata come rimuovere i kernel inutilizzati.
Ma se stai gestendo un’installazione di Linux dove la directory /boot è montata in una partizione dedicata, prima o poi potrebbe risultarti impossibile aggiornare il sistema perché APT non trova spazio sufficiente per copiare i file di un nuovo kernel. In questi casi rimuovere i kernel inutilizzati diventa la soluzione più semplice da attuare.
Rimuovere i kernel inutilizzati in modo automatico
Prima di eseguire un aggiornamento che prevede l’installazione di un nuovo kernel, verifica che nella directory /boot ci sia spazio sufficiente per contenere i file:
sudo df -h /boot/
Se lo spazio scarseggia la cosa più semplice da fare è rimuovere dei kernel inutilizzati.
Innanzitutto riavvia il sistema (per evitare problemi nel caso in cui anche uno dei precedenti aggiornamenti abbia installato un nuovo kernel):
sudo reboot
Se stai eseguendo questa operazione via ssh, avvia una sessione di screen:
screen
Per rimuovere i kernel inutilizzati su Ubuntu esegui questo comando (con un utente abilitato ad eseguire sudo):
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
Terminata l’esecuzione del comando, riavvia il sistema:
sudo reboot
Finito.
Rimozione manuale dei vecchi kernel
Se stai gestendo un sistema Linux dove:
- la directory /boot è montata in una partizione dedicata
- gli aggiornamenti automatici sono attivi
potresti ritrovarti nella situazione in cui un aggiornamento automatico che installa un nuovo kernel non è andato a buon fine per mancanza di spazio nella directory /boot (l’esecuzione del comando apt-get dist-upgrade restituisce un errore e consiglia di eseguire il comando apt-get install -f, ma anche questo non risolve il problema).
In questa particolare situazione non è possibile rimuovere i kernel inutilizzati in modo automatico, in quanto il gestore dei pacchetti rileva un’inconsistenza del sistema. È quindi necessario procedere con la rimozione manuale di qualcuno dei singoli kernel inutilizzati, in modo da liberare lo spazio necessario a terminare con successo il processo di aggiornamento.
La sequenza di operazioni è questa:
- rimuovere i pacchetti generici del kernel, per liberare eventuali dipendenze
- rimuovere i kernel inutilizzati
- reinstallare i pacchetti generici del kernel
- completare l’aggiornamento rimasto in sospeso
Se stai eseguendo questa operazione via ssh, avvia una sessione di screen:
screen
Verifica i kernel presenti nel sistema:
dpkg -l | grep linux-image
Esempio:
rc linux-image-4.4.0-53-generic 4.4.0-53.74 amd64 Linux kernel image for version 4.4.0 on 64 bit x86 SMP rc linux-image-4.4.0-57-generic 4.4.0-57.78 amd64 Linux kernel image for version 4.4.0 on 64 bit x86 SMP ii linux-image-4.4.0-62-generic 4.4.0-62.83 amd64 Linux kernel image for version 4.4.0 on 64 bit x86 SMP rc linux-image-extra-4.4.0-53-generic 4.4.0-53.74 amd64 Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP rc linux-image-extra-4.4.0-57-generic 4.4.0-57.78 amd64 Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP ii linux-image-extra-4.4.0-62-generic 4.4.0-62.83 amd64 Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP ii linux-image-generic 4.4.0.62.65 amd64 Generic Linux kernel image
Verifica il kernel in uso:
uname -r
Esempio:
4.4.0-62-generic
Ti suggerisco di annotare in un file di testo i nomi dei vecchi kernel, es.:
linux-image-4.4.0-53-generic linux-image-4.4.0-57-generic ... linux-image-extra-4.4.0-53-generic linux-image-extra-4.4.0-57-generic ...
Rimuovi i pacchetti generici del kernel:
sudo apt-get remove linux-generic linux-image-generic
Rimuovi eventuali altri pacchetti non necessari:
sudo apt-get autoremove
Ora… facendo molta attenzione…
Rimuovi i kernel inutilizzati (io manterrei anche la versione del kernel precedente a quella in uso…):
sudo apt-get purge linux-image-4.4.0-53-generic linux-image-4.4.0-57-generic linux-image-extra-4.4.0-53-generic linux-image-extra-4.4.0-57-generic
Re-installa i pacchetti generici del kernel:
sudo apt-get install linux-generic linux-image-generic
Completa gli aggiornamenti rimasti in sospeso:
apt-get install -f
Riavvia il sistema:
sudo reboot
Finito.
Note
- Il processo di rimozione manuale che ti ho descritto potrebbe necessitare di alcune variazioni. Per esempio potrebbe essere necessario includere nella stessa istruzione con cui rimuovi i pacchetti generici del kernel anche i pacchetti che apt-get dist-upgrade segnala come aventi delle dipendenze non soddisfatte.
- Ubuntu quando fai login via ssh ti avverte se rileva poco spazio su /boot.
- Leggi con particolare attenzione l’output dei comandi, in particolare quello dei vari apt-get.