Disque plein - Supprimer les noyaux inutiles
Il arrive encore trop fréquemment que les mises à jour du noyau se fasse sans supprimer les noyaux trop anciens déjà installés. Cela peut occuper finalement quelques précieux Go sur votre disque dur et un message vous avertit alors que l'espace disque devient faible sur la partition racine (/) ou de boot (/boot).
Diagnostic
Voyons d'abord combien de noyaux sont installés. Dans l'idéal, il ne devrait y en avoir que deux : l'actuel et le précédent (au cas où le dernier installé créerait des problèmes).
ls /boot
La réponse est du type :
abi-4.4.0-101-generic initrd.img-4.4.0-109-generic abi-4.4.0-103-generic memtest86+.bin abi-4.4.0-104-generic memtest86+.elf abi-4.4.0-109-generic memtest86+_multiboot.bin config-4.4.0-101-generic System.map-4.4.0-101-generic config-4.4.0-103-generic System.map-4.4.0-103-generic config-4.4.0-104-generic System.map-4.4.0-104-generic config-4.4.0-109-generic System.map-4.4.0-109-generic grub vmlinuz-4.4.0-101-generic initrd.img-4.4.0-101-generic vmlinuz-4.4.0-103-generic initrd.img-4.4.0-103-generic vmlinuz-4.4.0-104-generic initrd.img-4.4.0-104-generic vmlinuz-4.4.0-109-generic
Il y a donc ici 4 noyaux installés, tous de la version 4.4.0, numérotés 101, 103, 104 et 109. Il y en a donc 2 en trop.
Vérifions d'abord quelle est le noyau en cours d'utilisation :
uname -r
La réponse est normalement 4.4.0-109-generic
au vu de l'affichage précédent.
De combien d'espace disque dispose-t-on ? Utilisez la commande df -h
et regardez l'espace disponible sur / (ou sur /boot). Vous pouvez obtenir ces mêmes résultats en Mo avec df -m
.
Première tentative
Tentez un :
apt autoremove
qui supprime les paquets devenus inutiles. Si vous voyez que des paquets de noyaux vont être supprimés, vous avez gagné ! Enfin… sauf si tous les noyaux inutiles ne sont pas supprimés.
Recommencez le diagnostic précédent.
Seconde tentative
Si le diagnostic laisse apparaître qu'il reste des noyaux inutiles, c'est que leurs paquets ont été marqués comme ayant été installés manuellement (même si vous ne vous souvenez pas voir fait cela ; c'est un bug connu qui, paraît-il, est corrigé…)
Vérifions d'abord s'il existe des paquets de noyaux installés manuellement :
apt-mark showmanual | egrep 'linux-.*[0-9]' | egrep -v "hwe"
Si la réponse n'est pas vide, comme ci-dessous, c'est que vous avez été victime du bug !
linux-headers-4.4.0-101 linux-headers-4.4.0-101-generic linux-headers-4.4.0-103 linux-headers-4.4.0-103-generic linux-headers-4.4.0-104 linux-headers-4.4.0-104-generic linux-headers-4.4.0-109 linux-headers-4.4.0-109-generic linux-image-4.4.0-101-generic linux-image-4.4.0-103-generic linux-image-4.4.0-104-generic linux-image-4.4.0-109-generic linux-image-extra-4.4.0-101-generic linux-image-extra-4.4.0-103-generic linux-image-extra-4.4.0-104-generic linux-image-extra-4.4.0-109-generic
Faisons en sorte que ces paquets redeviennent déclarés comme installés automatiquement :
sudo apt-mark auto $(apt-mark showmanual | egrep 'linux-.*[0-9]' | grep -v "hwe")
Cela se fait rapidement :
linux-headers-4.4.0-101 passé en « installé automatiquement ». linux-headers-4.4.0-101-generic passé en « installé automatiquement ». linux-headers-4.4.0-103 passé en « installé automatiquement ». linux-headers-4.4.0-103-generic passé en « installé automatiquement ». linux-headers-4.4.0-104 passé en « installé automatiquement ». linux-headers-4.4.0-104-generic passé en « installé automatiquement ». linux-headers-4.4.0-109 passé en « installé automatiquement ». linux-headers-4.4.0-109-generic passé en « installé automatiquement ». linux-image-4.4.0-101-generic passé en « installé automatiquement ». linux-image-4.4.0-103-generic passé en « installé automatiquement ». linux-image-4.4.0-104-generic passé en « installé automatiquement ». linux-image-4.4.0-109-generic passé en « installé automatiquement ». linux-image-extra-4.4.0-101-generic passé en « installé automatiquement ». linux-image-extra-4.4.0-103-generic passé en « installé automatiquement ». linux-image-extra-4.4.0-104-generic passé en « installé automatiquement ». linux-image-extra-4.4.0-109-generic passé en « installé automatiquement ».
Puis relançons la commande :
apt autoremove
Voici ce qui vous est proposé :
Lecture des listes de paquets... Fait Construction de l'arbre des dépendances Lecture des informations d'état... Fait Les paquets suivants seront ENLEVÉS : linux-headers-4.4.0-101 linux-headers-4.4.0-101-generic linux-headers-4.4.0-103 linux-headers-4.4.0-103-generic linux-image-4.4.0-101-generic linux-image-4.4.0-103-generic linux-image-extra-4.4.0-101-generic linux-image-extra-4.4.0-103-generic 0 mis à jour, 0 nouvellement installés, 8 à enlever et 13 non mis à jour. Après cette opération, 596 Mo d'espace disque seront libérés. Souhaitez-vous continuer ? [O/n]
Remarquez qu'ici seuls les noyaux n°101 et n°103 seront enlevés, laissant bien installés le dernier et l'avant-dernier noyaux.
Après validation, le nettoyage s'effectue (cela peut être long s'il y a beaucoup de paquets à supprimer) et seuls deux paquets restent à la fin. Un ls /boot
le confirme.
abi-4.4.0-104-generic memtest86+.bin abi-4.4.0-109-generic memtest86+.elf config-4.4.0-104-generic memtest86+_multiboot.bin config-4.4.0-109-generic System.map-4.4.0-104-generic grub System.map-4.4.0-109-generic initrd.img-4.4.0-104-generic vmlinuz-4.4.0-104-generic initrd.img-4.4.0-109-generic vmlinuz-4.4.0-109-generic
Vous pouvez estimer la place que vous avez récupérée avec un nouveau df -h
ou df -m
. Dans le cas présent, 596Mo devaient être libérés ; en fait 778 Mo ont effectivement été libérés. Appréciable, non ?
Supprimer les old-dkms inutiles
Une fois les noyaux inutiles supprimés grâce à l'une des méthodes ci-dessus, il peut rester dans /boot
de nombreux fichiers dont le nom se termine par old-dkms
et qui ne correspondent à aucun des noyaux encore installés sur l'ordinateur.
Attention, il vaut mieux garder ces fichiers tant que les noyaux correspondants sont encore installés.
La commande suivante liste ces fichiers.
ls -1 /boot/*.old-dkms
Si elle ne retourne rien, vous n'êtes pas concerné.
Dans le cas contraire, il faut ensuite déterminer ceux qui doivent être supprimés puis effectuer cette suppression. Voici un script en python qui effectue ce travail pour vous :
#!/usr/bin/env python3 # -*- coding:Utf-8 -*- from glob import glob from os import getuid, remove from sys import path # Ce script doit être exécuté avec les droits root : if getuid()!=0: print("use: sudo "+path[0]+"/"+__file__) exit(1) # Liste des fichiers config des noyaux installés : installes = glob('/boot/config-*') # Liste des fichiers .old-dkms qu'il ne faut pas supprimer : ecartes = [ "/boot/initrd.img-"+f[13:]+".old-dkms" for f in installes ] # Liste de tous les fichiers .old-dkms : tous = [ f for f in glob('/boot/initrd.img-*.old-dkms') ] # Liste des fichiers .old-dkms à supprimer : asupprimer = list(filter(lambda f:f not in ecartes,tous)) asupprimer.sort() # On supprime ! for f in asupprimer: remove(f)
Nommez ce script clean_old_dkms.py
, puis rendez-le exécutable par :
chmod +x clean_old_dkms.py
Exécutez-le avec les droits root :
sudo ./clean_old_dkms.py
3 personnes ont visité cette page aujourd'hui et 1196 en tout.