748 votes

Comment supprimer les anciennes versions du noyau pour nettoyer le menu de démarrage ?

Chaque fois que j'installe un nouveau noyau Linux, il est laissé dans le grub_config, rendant le menu de démarrage plus long à chaque fois.

Je sais que je peux rechercher manuellement dans les paquets installés et les supprimer.

Ubuntu propose-t-il un moyen plus simple de les nettoyer ou de les empêcher d'apparaître dans la liste de démarrage ?

0 votes

En plus de supprimer les anciens noyaux, décommentez cette ligne dans le fichier /etc/default/grub si vous voulez vous débarrasser des éléments de "récupération" dans le menu : #GRUB_DISABLE_LINUX_RECOVERY="true"

0 votes

Dans les versions récentes Ubuntu cache les noyaux dans le sous menu de Grub, donc ce n'est pas si gênant. Cependant, il peut être une bonne idée de supprimer les noyaux supplémentaires pour économiser de l'espace, surtout, si vous avez une petite partition /boot séparée.

10 votes

Il existe une commande ubuntu appelée purge-old-kernels pour faire ce travail. Voir mon réponse pour plus d'informations.

1voto

NeilNjae Points 1

Pour avoir un peu plus de contrôle sur les versions à conserver, sélectionnez explicitement celles que vous voulez supprimer. Par exemple, si vous voulez supprimer les versions 3.2.0.[49-53] du noyau, utilisez une simple commande for boucle :

for k in 49 51 52 53 ; do aptitude remove --purge linux-image-3.2.0-${k}-generic ; done

Ajustez la liste des versions du noyau pour l'adapter.

1voto

Sankalp Points 101

Essayez ceci. Exécutez-le en tant que root.

Enregistrez ce script sous, disons ./keep-n-kernels.sh

Passez, comme argument de ligne de commande, le nombre de noyaux les plus récents que vous voulez préserver.

#!/bin/bash

# pass n as a command line argument, and it will find all the installed
# kernels and keep only the n most recent ones => uninstall all older ones

# dpkg -l 'linux-\*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\\(.\*\\)-\\(\[^0-9\]\\+\\)/\\1/")"'/d;s/^\[^ \]\* \[^ \]\* \\(\[^ \]\*\\).\*/\\1/;/\[0-9\]/!d'
# this command gives the list of all packages EXCEPT for the latest kernel.
# source : https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels

n=$1

# find the installed kernel versions :
# dpkg-query -W -f='${Version}\\n' 'linux-image-\*' | grep . | sort -n
# gives version numbers, one in each line
# dpkg-query -W -f='${Version}\\n' 'linux-image-\*' | grep . | sed 's/\\...$//g' | grep -v '\\...$'| sort -u
# gives only the ones that appear in linux-image

# suffix, e.g. -generic-pae
# the kind of kernel you boot into
suffix=$(uname -r | sed 's:^\[0-9\]\\.\[0-9\]\\.\[0-9\]\\-\[0-9\]\\{2\\}::g')

command="apt-get purge "

for version in $(dpkg-query -W -f='${Version}\\n' 'linux-image-\*' | grep . | sed 's/\\...$//g' | grep -v '\\...$'| sort -u | head -n -${n})
do
    command=${command}"^linux-image-${version}${suffix} "
done

$command

Exemple d'utilisation :

\# ./keep-n-kernels.sh 4 # launch the apt-get command to remove all but the 4 most recent kernels

Si vous voulez [ET À VOTRE PROPRE RISQUE], vous pouvez ajouter un -y (ou un drapeau force) à la commande apt-get et la rendre non-interactive.

0 votes

Il supprime tous les noyaux, si vous exécutez ./keep-n-kernels.sh 0. La détection de la chaîne de suffixe ne fonctionne pas ; je pense que suffix=$(uname -r | sed -r 's/^[0-9.]*(-[0-9.]+)*//') ou suffix=$(uname -r | egrep --only-matching -- '-[[:alpha :]-]+$') ferait l'affaire.

0 votes

Mais je pense que l'idée est bonne. J'ai travaillé sur l'amélioration du script et peut-être que je le posterai ici un jour, quand je pense qu'il est assez prêt.

0 votes

S'il vous plaît partager, @jarno . Heureux de savoir que l'idée semble utile.

1voto

Ben Points 762

J'utilise un bureau KDE, et l'option la plus simple que j'ai trouvée était d'utiliser l'application kde-config-grub2 comme suggéré ici : https://www.kubuntuforums.net/showthread.php?58075-remove-old-linux-versions (que j'avais déjà installé pour définir l'image de fond, l'option de démarrage par défaut, et autres). À côté de la liste déroulante où vous pouvez choisir l'entrée par défaut, il y a un bouton "Supprimer les anciennes entrées". En cliquant sur ce bouton, vous obtenez une liste de tous les noyaux installés et vous pouvez sélectionner ceux à supprimer. Lorsque vous appliquez les changements, il utilisera dpkg pour les supprimer réellement du système ainsi que le menu Grub.

1voto

Tanerax Points 2708

Juste pour ajouter, vous pouvez également publier

apt-get remove linux-{image,headers}-x.y.z-{1,2,...,n}

en tant que root, et le travail sera fait.

0voto

La chaîne de commandes suivante purgera tous les noyaux linux installés à l'exception de celui en cours d'exécution (grep -v uname -r ) et le dernier noyau disponible (dpkg -l | .... | tail -1) :

dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | grep -v `dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | tail -1` | grep -v `uname -r` | xargs apt-get -y purge

Je l'utilise pour garder les volumes de démarrage des ordinateurs relativement propres, mais dans une situation de serveur, vous voudrez probablement étendre la logique et écrire des scripts supplémentaires pour maintenir une liste des X derniers noyaux que le serveur a démarré.

Quelque chose comme une startup script qui le fait :

uname -r >> /root/bootedkernels
cat /root/bootedkernels | sort -u | tail -3 > /root/bootedkernels # Keep the last 3 booted kernels

et ensuite utiliser :

dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | grep -vf /root/bootedkernels | grep -v `dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | tail -1` | grep -v `uname -r` | xargs apt-get -y purge

0 votes

Une forme plus simple serait sudo apt-get purge $(dpkg-query -W -f'${Package}\n' 'linux-image-[0-9]*' | head -n -1 | grep -v $(uname -r)) mais même cela soulève des questions : Pouvez-vous compter sur le fait que dpkg liste le noyau le plus récent en dernier ? Pouvez-vous vous fier à la correspondance de la version actuelle en tant qu'expression régulière ? Un point dans une chaîne de version correspond à n'importe quel caractère. Que se passe-t-il si le nom du paquet a un caractère de plus dans le numéro de version que la version actuelle ? Pour être strict, vous devez utiliser uname -r | sed -r -e 's/\./\\./g' -e 's/.*/-&($|-)/' comme expression régulière à faire correspondre dans la dernière commande grep.

0 votes

En outre, le script ne purge aucun paquet linux-header ou autres paquets connexes.

0 votes

NE L'UTILISEZ PAS ! Il va supprimer les vieux noyaux sans aucun doute. J'ai essayé sans -y mais la commande s'interrompt avant d'exécuter

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X