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


701

Chaque fois que j'installe un nouveau noyau Linux, il reste dans grub_config, ce qui allonge le menu de démarrage plus longtemps.

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

Ubuntu fournit-il un moyen plus simple de les nettoyer ou de les empêcher de s'afficher dans la liste de démarrage?


10
Il existe une commande ubuntu appelée purge-old-kernels pour effectuer le travail. Voir ma réponse pour plus d'informations.
Jarno

29
sudo apt-get autoremovedevrait faire l'affaire sur Ubuntu 14.04+
plaques

1
L’accumulation de vieux noyaux est un bug dont le correctif est en cours: bugs.launchpad.net/bugs/1357093 . Lorsque le correctif est publié, les anciens noyaux seront automatiquement supprimés par défaut.
user535733

1
@hobs La commande ne me convient pas dans Ubuntu Studio 14.04, si les noyaux n'ont pas été installés automatiquement, mais par Software Updater.
Jarno

1
Je reviens sans cesse sur cette page ... le commentaire de @hobs ne fonctionne que si vos noyaux ont été installés automatiquement. Cependant, vous apportez sudo apt-get autoremove --purge la réponse en suivant les apt-markconseils
donnés

Réponses:


602

16.04 et versions plus récentes d'Ubuntu

sudo apt autoremove

Cette commande supprime les packages qui ont été installés automatiquement pour résoudre une dépendance, mais dont ils ne dépendent plus. Cela inclut les anciennes versions de linux-headers-*et linux-image-*. (Ce processus est également intelligent, laissant une version de secours du noyau comme solution de secours!)

11.10 et versions plus récentes d'Ubuntu

GRUB2 et son affichage de tous les noyaux

Les dernières versions de Grub2 installées dans Ubuntu affichent automatiquement le dernier noyau et masquent les anciens noyaux que vous avez éventuellement installés.

GNU GRUB

Si vous ne voyez pas votre mot d'ordre , n'oubliez pas d'appuyer sur Shiftlors du démarrage.

Comme vous pouvez le constater, seul le dernier noyau est affiché.

Si vous sélectionnez l'option affichée (appuyez sur Enter), tous les anciens noyaux deviennent visibles et disponibles pour démarrer.

GNU GRUB Versions précédentes

Comment supprimer définitivement les anciens noyaux

Commencez par démarrer avec le dernier noyau disponible.

Il existe plusieurs façons de supprimer les anciens noyaux. Personnellement, je ne toucherais pas à Computer Janitor car il est reconnu que cela casserait votre ordinateur avec ses suggestions.

synaptique

Une alternative est Synaptic ( sudo apt install synaptic)

recherchez linux-image , cliquez avec le bouton droit de la souris sur un noyau et choisissez la suppression complète, puis cliquez sur le bouton Appliquer pour supprimer le noyau.

Gestionnaire de paquets Synaptic

Répétez la recherche mais cette fois pour linux-header - vous pouvez supprimer les en-têtes associés pour l'image du noyau choisie précédemment.

Synaptic ne tentera cependant pas de vérifier ce que vous essayez de supprimer ... vous pourriez supprimer par inadvertance votre dernier noyau - ou même supprimer tous vos noyaux via cet outil, vous laissant avec un Ubuntu ! Impossible à démarrer .

N'oubliez pas de vérifier quel noyau vous utilisez, tapez:

uname -r

Le résultat serait similaire à:

Terminal <uname -r>

Rappelez-vous le résultat et le nombre - assurez-vous de ne pas supprimer l'image ou l'en-tête correspondant.

Recommandation

Ma recommandation est de conserver au moins deux ou de préférence trois noyaux, y compris le dernier. La raison de la recommandation est que vous aurez au moins un / deux autres noyaux avec lesquels démarrer, si pour quelque raison que ce soit, le dernier noyau que vous ne parvenez pas à démarrer ou à introduire une fonctionnalité régressée telle que le sans fil cassé.


3
Supprimer d'anciens paquets "linux-image *" à l'aide de synaptic a également bien fonctionné avec 10.04. (Je le mentionne parce que le titre suggère que ce n'est peut-être que pour 11.10 et plus)
mercredi

4
le -ycommutateur en fin de apt-getligne est nécessaire, sinon apt-get demande simplement une confirmation et puisque l'entrée est un tuyau, elle échoue. Cela devrait donc se terminer par:| xargs sudo apt-get purge -y
Josh

37
Suppression d'environ 20 versions d'anciennes linux-imageet linux-headerslibérées de 4,5 Go d'espace libre sur ma machine.
Andrew Mao

16
Cette méthode fonctionne bien, mais la suppression de chaque noyau régénère excessivement grub.cfg, ce qui prend du temps. Est-il possible de désactiver cette option pour la suppression par lot, puis de la régénérer une fois?
Spacediver

15
J'adhère à la question de @spacediver: il s'agit d'un processus extrêmement lent lorsque vous avez 38 noyaux inutiles, car chaque désinstallation étant désinstallée, elle passe par toutes les autres en générant un nouveau fichier grub.cfg. C’est ce que nous appelons une opération N ^ 2 - elle traite un noyau environ (38 ^ 2/2) = 722 fois, et est très lente. Ubuntu peut sûrement proposer quelque chose de mieux ....
nealmcb

384

Tout d’abord, redémarrez votre système pour vous assurer qu’il utilise le dernier noyau. Ensuite, ouvrez le terminal et vérifiez votre noyau actuel:

uname -r 

NE RETIREZ PAS CE KERNEL!

Ensuite, tapez la commande ci-dessous pour afficher / répertorier tous les noyaux installés sur votre système.

dpkg --list 'linux-image-*'

Trouvez tous les noyaux inférieurs à votre noyau actuel. Lorsque vous savez quel noyau supprimer, continuez ci-dessous pour le supprimer. Exécutez les commandes ci-dessous pour supprimer le noyau sélectionné.

sudo apt-get purge linux-image-x.x.x-x-generic 

Enfin, lancez les commandes ci-dessous pour mettre à jour grub2

sudo update-grub2 

Redémarrez votre système.


34
Lors de cette opération dans 10.04 et 12.04, j'ai découvert que update-grub était automatiquement exécuté pendant le processus de purge.
aidan

93
L’ expansion de bash peut être utilisée, par exemple sudo apt-get purge linux-image-3.2.0-3{0..5}-generic(supprime les 30,31, .., 35)
ajo

12
Pas besoin de redémarrer le système par la suite. En fait, vous devez redémarrer le système avant de suivre ces étapes pour vous assurer que vous utilisez bien la dernière version du noyau que vous venez probablement de télécharger et d'installer (vous avez déjà effectué une mise à niveau d'apt-get update && apt-get, non?)
Ricket

4
Vous pouvez également désinstaller les linux-signed-imagepaquetages pouvant être installés sur les systèmes UEFI: sudo apt-get purge linux-signed-image-3.11.0-{12,14,24}-genericce qui supprimerait les
versions

1
@jarno Je ne sais pas si j'utilise un noyau signé ou non, mais uname -rn'a pas de signedchaîne sur mon système. Je ne semblent avoir une image signée installée et la sortie de cette lscommande est: /boot/vmlinuz-3.19.0-16-generic.efi.signed.
devius

283

Mon one-liner pour supprimer les anciens noyaux (cela libère également de l'espace disque)

dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p' | xargs sudo apt-get -y purge

Explication (rappelez-vous, |utilise le résultat de la commande précédente comme entrée de la suivante)

  • dpkg --list liste tous les paquets installés
  • grep linux-image cherche les images linux installées
  • awk '{ print $2 }' sort juste la 2ème colonne (qui est le nom du paquet)
  • sort -V met les éléments en ordre par numéro de version
  • sed -n '/'`uname -r`'/q;p' affiche les lignes avant le noyau actuel
  • xargs sudo apt-get -y purge purge les noyaux trouvés

Dénouement de l' sedinvocation:

  • -ndit sedde se taire
  • `uname -r` affiche la version actuelle du noyau installé - nous l'incluons dans des correctifs afin que la sortie soit incluse avec la commande (vous pouvez également voir ceci comme $(uname -r)
  • /something/qdit arrêter lorsque vous correspondez à quelque chose (dans ce cas, quelque chose sort de uname -r) - /entourez une expression régulière
  • p est imprimer
  • le ;est le séparateur de commande, /something/q;pdit donc quitter lorsque vous correspondez quelque chose, sinon imprimer

Dans l’ensemble, sed -n '/'`uname -r`'/q;p'affiche les lignes jusqu’à ce qu’elles correspondent au nom du noyau actuel.

Si vous êtes paranoïaque (comme moi), vous pouvez créer la dernière partie de xargs echo sudo apt-get -y purgesorte que la commande de purge des anciens noyaux soit imprimée, puis vous pouvez vérifier que rien d'inattendu n'est inclus avant de l'exécuter.


Version modifiée pour supprimer les en-têtes:

dpkg --list | grep 'linux-image' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge
dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge

Remarque: l' sedinvocation est modifiée. "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"extrait uniquement la version (par exemple "3.2.0-44"), sans "-générique" ou similaire deuname -r


Version tout-en-un pour supprimer les images et les en-têtes (combine les deux versions ci-dessus):

echo $(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p') $(dpkg --list | grep linux-headers | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p') | xargs sudo apt-get -y purge

1
Notez qu'il est peu dangereux de faire correspondre la version actuelle du noyau en tant qu'expression régulière: les points correspondent à n'importe quel caractère et 3.1.2-23 à 3.1.2-2 (ou est-ce l'inverse). Voir aussi ma réponse .
jarno

19
Voici une version tout-en-un ajustée: sudo apt-get purge $(for tag in "linux-image" "linux-headers"; do dpkg-query -W -f'${Package}\n' "$tag-[0-9]*.[0-9]*.[0-9]*" | sort -V | awk 'index($0,c){exit} //' c=$(uname -r | cut -d- -f1,2); done)Voir aussi ma réponse .
Jarno

1
@jarno qui m'a beaucoup aidé ... Bravo à votre unique paquebot
Clain Dsilva

5
En raison de dépendances non satisfaites, je devais l'utiliser avec dkpg -P. Voici la version complète:dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo dpkg -P
Sebastian Sastre

3
NON NE FAITES PAS CELA! "Cet élève a l'air un peu dangereux, mais il ne fait aucun doute que 220 participants au vote ne peuvent se tromper!" Je pensais à moi-même et copié aveuglément. Redémarré, directement à GRUB. Cette commande a effacé tous mes noyaux, y compris celui que j'utilisais. J'avais peut-être un noyau temps réel, je ne m'en souviens même pas. Je cherche actuellement une clé USB pour installer Ubuntu Live CD sur :(
Andreas Jansson

60

Ubuntu 16.04+:

$ sudo apt autoremove
...
The following packages will be REMOVED:
  linux-headers-4.4.0-57 linux-headers-4.4.0-57-generic linux-image-4.4.0-57-generic linux-image-extra-4.4.0-57-generic linux-tools-4.4.0-57 linux-tools-4.4.0-57-generic

Ubuntu 15.10 et inférieur:

Je trouve que c'est le moyen le plus simple et le plus rapide. Il conserve le dernier noyau ainsi que deux autres:

sudo apt-get install bikeshed
sudo purge-old-kernels

Pour changer le nombre de noyaux supplémentaires conservés:

sudo purge-old-kernels --keep 3

1
Cette commande est un script shell dont vous pouvez trouver l’emplacement which purge-old-kernels.
Juin

Heureux d'avoir rendu cela beaucoup plus facile en 16.04! J'espère que cette réponse continue à monter ...
Toby J

Sur Ubuntu 16.04, je n'ai purge-old-kernelspas de paquet bikeshed ( outils utiles aléatoires qui n’ont pas encore de maison permanente ) ou un paquet particulier. Éviter d’utiliser cette apt-get -yoption, c’est comme fermer les yeux et espérer que tout se passera bien. Aussi ici est comment autoremove décide combien de noyaux anciens à conserver.
Pablo Un

2
Dans 16.04, purge-old-kernels est fourni par le paquet byobu (indice:) apt-file search purge-old-kernels. D'accord apt-get -y, je vais l'enlever.
bmaupin

1
@Dan puisque je n'utilise pas de versions non-LTS, je ne savais pas exactement quand cela a commencé. Mais je peux dire avec certitude que sudo apt-get autoremovecela ne supprime pas les noyaux dans 14.04. N'hésitez pas à mettre à jour la réponse avec la version spécifique si vous savez ce que c'est!
bmaupin

43

Supprimer des entrées de Grub 2 Les entrées doivent être supprimées en modifiant ou en supprimant des fichiers du dossier /etc/grub.d. Le fichier /boot/grub/grub.cfg est en lecture seule et ne doit normalement pas être modifié.

Trop de noyaux?

  • Si vous n'êtes pas sûr du noyau que vous utilisez actuellement, dans un terminal, tapez uname -r .

  • Les noyaux supprimés via APT (Synaptic, "apt-get remove", etc.) mettront automatiquement à jour grub.cfg et aucune action de l'utilisateur n'est requise.

  • Ubuntu-Tweak, une application graphique sécurisée et facile à utiliser, est un excellent outil pour supprimer les noyaux (et les entrées de menu).

  • Installez Ubuntu Tweak

  • Ubuntu-Tweak sera disponible sous Applications> Outils système.

Supprimer les anciennes entrées du noyau

  • Sélectionnez "Package Cleaner" sur la gauche et "Nettoyer le noyau" dans le panneau de droite.

  • Appuyez sur le bouton "Déverrouiller" en bas à droite, entrez votre mot de passe.

  • Sélectionnez dans la liste affichée les images du noyau et les en-têtes que vous souhaitez supprimer. Le noyau utilisé n'est pas répertorié.

  • Appuyez sur le bouton "Nettoyage" en bas à droite pour supprimer les images du noyau et les en-têtes sélectionnés.

Supprimer les systèmes d'exploitation du menu Grub

  • Les autres systèmes d'exploitation supprimés de l'ordinateur le seront également une fois que "update-grub" sera exécuté en tant que root.

  • Les éléments de menu sont placés dans le menu Grub2 par des scripts. Si vous ne souhaitez pas que d'autres systèmes d'exploitation soient entrés dans le menu, désactivez /etc/grub.d/30_osprober.

  • Exécutez cette commande pour arrêter l'exécution du script.
    sudo chmod -x /etc/grub.d/30_os-prober

  • DISABLE_30_OS-PROBER = 'true' dans / etc / default / grub

Supprimer Memtest86 + du menu Grub
sudo chmod -x /etc/grub.d/20_memtest86+

  • Exécutez la commande update-grub pour autoriser l’incorporation des modifications dans grub.cfg.

La source

Remarque: après la mise à jour du noyau, une nouvelle entrée est ajoutée au menu GRUB. Vous pouvez supprimer l’ancienne si vous le souhaitez. besoin de démarrer une ancienne version du noyau à des fins de dépannage.

Autre moyen de supprimer les entrées du noyau (avant 10.04)

pour GRUB pas GRUB2

Gestionnaire de démarrage Installer startupmanager

Vous pouvez le trouver sous Système >> Administration >> texte alternatif
texte alternatif
Vous voyez dans la deuxième capture d'écran que vous pouvez choisir le nombre de noyaux à afficher? En général, je ne le garde que sur 1, mais lorsque je reçois une mise à niveau du noyau, je le change toujours en 2 avant de redémarrer afin de pouvoir sélectionner le noyau plus ancien si le nouveau noyau a des problèmes avec mon matériel. Une fois que je sais que le nouveau noyau fonctionne bien, je le repasse à 1.


2
En fait, startupmanager me donnait une fenêtre comme celle-ci sur Ubuntu 10.04, mais une fenêtre avec deux onglets -> Options de démarrage et Options avancées ... et, en mode avancé, permet de limiter le nombre de noyaux. Veuillez donc mettre à jour la réponse pour Ubuntu 10.04. (Et c’est pourquoi j’ai voté contre cela ..)
Sen

aucune idée de la manière dont le "nombre de noyaux à conserver" peut être défini sur une machine sur laquelle aucune interface graphique n'est installée (serveur)?
Sylvainulg

startupmanager est obsolète. Voir grup-customizer
muhasturk

39

Purement en ligne de commande, cela supprimera tout sauf le courant et le deuxième courant (via le "-2" dans la commande head ci-dessous):

OLD=$(ls -tr /boot/vmlinuz-* | head -n -2 | cut -d- -f2- |
    awk '{print "linux-image-" $0 " linux-headers-" $0}' )
if [ -n "$OLD" ]; then
    apt-get -qy remove --purge $OLD
fi
apt-get -qy autoremove --purge

9
une ligne à partir de :dpkg -l linux-* | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e [0-9] | xargs sudo apt-get -y purge
Dmitry Verkhoturov

@DmitryPaskal, vous devriez ajouter ceci comme nouvelle réponse.
Saji89

10
@DmitryPaskal Comme toujours, ne vous contentez pas de les copier-coller sans les comprendre. Sur ma machine, ce one-liner correspond également à linux-libc-dev:amd64ce qui ne devrait pas être retiré.
jamesadney

1
@ Keys Cook, l'argument awk ne devrait-il pas être entouré de guillemets simples? Si vous souhaitez ajouter «linux-image-» aux lignes raccordées, cela ne semble fonctionner que si vous l'utilisez awk '{print "linux-image-" $0}'.
Mark

cela ne fonctionne pas pour moi, il inclut mon noyau personnalisé installé (Ubuntu 14.04 avec 3.17)
Alex R

35

Update: purge-old-kernelsest obsolète de nos jours.

J'ai créé un script pour purger les noyaux, même dans des conditions difficiles. Il s'appelle linux-purgeet vous pouvez le trouver ici .

Si vous souhaitez simplement purger les noyaux (et les packages associés) plus anciens que le noyau actuellement utilisé, vous pouvez utiliser ce script lorsque le système n'est pas en panne .

Il existe également une page de documentation Ubuntu à laquelle j'ai contribué à la suppression des anciens noyaux ici .


On dirait que ce purge-old-kernelsn'est pas dans la version précise (1.22) de bikeshed. Existe-t-il un moyen raisonnable / sûr d’obtenir un bikeshed plus récent pour plus de précision? Ou serait-il plus simple / sûr de simplement installer le script? Je préférerais utiliser un repo cependant, malgré la longue liste de dépendances ..
drevicko

1
@drevicko Voir ici .
jarno

1
@drevicko, bien sûrdlocate -lsbin bikeshed
jarno le

1
@drevicko, voir aussi une autre question
jarno

1
@ChrisW oui il y en a. Je viens d'apporter une petite amélioration au script, il est donc préférable d'utiliser la dernière version.
Jarno

29

Vous pouvez suivre l' utilisation de la « mise à niveau sans surveillance-section » paquet de mises à jour automatiques de sécurité article sur Wiki Ubuntu pour effectuer cette.

Vous devez modifier la ligne suivante dans le fichier /etc/apt/apt.conf.d/50unattended-upgrades ;

//Unattended-Upgrade::Remove-Unused-Dependencies "false";

avec

Unattended-Upgrade::Remove-Unused-Dependencies "true";

pour supprimer automatiquement les anciens paquets, y compris les noyaux.

Supprimez ou commentez également la ligne

"^linux-image.*"; 

dans la section "NeverAutoRemove" du fichier /etc/apt/apt.conf.d/01autoremove.


2
Je l'ai fait mais il était toujours en train de collecter plus de 3 vieux noyaux consommant des centaines de MB. J'ai donc ajouté apt-get autoremoveà mon travail quotidien cron la mise à niveau effective, car il ne passe pas toujours par le gestionnaire de mises à jour intégré.
Marcos

Je pense que cela ne fonctionne dans Trusty que pour les noyaux qui ont été installés automatiquement.
mardi

Ceci est idéal pour empêcher la constitution d'anciens noyaux lors de la mise à niveau automatique des packages, par exemple avec des mises à niveau sans surveillance. Cependant, si vous ne redémarrez pas, vous constaterez peut-être que le paquet du noyau en cours d'exécution a été désinstallé! Un problème que cela peut causer: les nouveaux périphériques que vous connectez risquent de ne pas fonctionner, car leur module ne peut pas être chargé à chaud, car il ne se trouve plus sur votre disque. (Une solution rapide consiste simplement à réinstaller le paquetage du noyau, puis à débrancher et à reconnecter le périphérique.)
joeytwiddle

J'ai créé une solution automatisée au problème susmentionné. Si vous pensez que c'est une bonne approche, n'hésitez pas à l'ajouter à la réponse de Qwerty.
joeytwiddle

27

Le moyen le plus rapide / simple (applicable au moins depuis le 12.04) qui existe déjà avec Ubuntu est apt-get. Procédez comme suit si vous souhaitez supprimer toutes les anciennes versions du noyau qui ne sont pas utilisées (à l’exception de la précédente que vous n’utilisez plus. C’est pour vous assurer que si la version actuelle du noyau échoue d’une manière ou d’une autre, vous avez encore du chemin à faire. retour à un état antérieur). Faites ce qui suit:

sudo apt-get autoclean

Cela éliminera tous les anciens fichiers (y compris les versions du noyau) que vous pourriez avoir. Notez que si vous avez beaucoup d'anciennes versions, cela prendra un certain temps puisqu'il faut s'assurer que la suppression de la version du noyau ne pose aucun problème. Pour moi, la suppression des 12 dernières versions du noyau a pris environ 2 minutes. Vous pouvez également faire ce qui suit:

sudo apt-get clean

Ce qui éliminera tout ce qui est téléchargé et stocké dans le dossier cache d'apt. Enfin vous avez:

sudo apt-get autoremove

qui vérifierait tous les paquets inutilisés et les supprimerait si nécessaire. C'est idéal pour les bibliothèques et les paquets de dépendance qui ne sont plus nécessaires depuis l'application installée.


1
Je suppose que cela a changé dans les versions les plus récentes, comme dans 14.04, cela nettoie simplement le cache des paquets et n’affecte pas les paquets installés ou grub.
Jarno

2
Je peux confirmer que sudo apt-get autoremovecela supprime les anciens noyaux (il y a plus d'une version) dans 14.04. Vous devrez peut-être l'exécuter avant et après la mise à niveau de votre noyau. Lorsque j’exécutais avant la mise à niveau, il ne supprimait que la version générique de l’ancien noyau. Ensuite, après la mise à niveau de mon noyau, il a également supprimé la version à faible latence de l'ancien noyau.
tekNorah

Je voulais dire la sudo apt-get autocleancommande. @tekNorah J'ai installé deux noyaux plus anciens et ensuite, j'ai été lancé sudo apt-get autoremovedans Ubuntu Studio 14.04. Il n'a pas enlevé de noyaux. Je n'ai que des noyaux à basse altitude installés. Pourquoi avez-vous installé des noyaux à la fois génériques et à faible luminosité?
Jarno

5
Oui, cela a fonctionné à merveille pour moi, nettoyé correctement tous les anciens noyaux et ne repose pas sur des scripts d'une ligne loufoques! Recommandé, je souhaite que je puisse upvote plus d'une fois!
Jeff Atwood

1
@ Jeff Effwood, cela pourrait supprimer plus de noyaux sans danger. Voir le rapport de bug
jarno le

25

10.04 Méthode de l'interface graphique

Computer Janitor peut nettoyer les anciens noyaux et je crois qu’il est installé par défaut dans Ubuntu (mais pas Kubuntu).

Si vous utilisez cela, GRUB 1 a une option /boot/grub/menu.lstpermettant de spécifier le nombre maximum de noyaux à afficher. GRUB 2, autant que je sache, ne le fait pas.


4
Computer Janitor ne doit pas être utilisé - il est bogué et a maintenant été supprimé en tant qu'application par défaut dans natty / oneiric / precise.
fossfreedom

2
Installez plutôt "Ubuntu Tweak" comme décrit dans une autre réponse (son propre ppa), qui a son propre "concierge informatique" (à ne pas confondre avec le "concierge informatique" disponible temporairement dans les anciennes versions d'ubuntu)
michael

25

Pour savoir quels noyaux et en-têtes sont installés, utilisez

dpkg -l | grep linux-image

dpkg -l | grep linux-headers

Vous pouvez ensuite les supprimer un par un ou ensemble, assurez-vous de conserver le plus récent.

Il existe également des commandes et des scripts utiles pour automatiser la suppression.

http://ubuntuforums.org/showthread.php?t=1658648

Ce qui suit prétend supprimer tous les noyaux et en-têtes non utilisés:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'|grep -E "(image|headers|modules)" | grep -v hwe | xargs sudo apt-get purge

(utiliser apt-get -ypour enlever sans question)

Voici ce qui se passe lors de l'exécution du 18.04.1:

~$ dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]

\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'|grep -E "(image|headers|modules)" | xargs sudo apt-get -y purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  linux-headers-4.15.0-33* linux-headers-4.15.0-33-generic* linux-headers-4.15.0-34* linux-headers-4.15.0-34-generic* linux-image-4.15.0-33-generic* linux-image-4.15.0-34-generic*
  linux-modules-4.15.0-33-generic* linux-modules-4.15.0-34-generic* linux-modules-extra-4.15.0-33-generic* linux-modules-extra-4.15.0-34-generic*
0 upgraded, 0 newly installed, 10 to remove and 1 not upgraded.
After this operation, 671 MB disk space will be freed.
(Reading database ... 227403 files and directories currently installed.)
Removing linux-headers-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-headers-4.15.0-33 (4.15.0-33.36) ...
Removing linux-headers-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-headers-4.15.0-34 (4.15.0-34.37) ...
Removing linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-image-4.15.0-33-generic (4.15.0-33.36) ...
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-33-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Found linux image: /boot/vmlinuz-4.15.0-34-generic
Found initrd image: /boot/initrd.img-4.15.0-34-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-image-4.15.0-34-generic (4.15.0-34.37) ...
I: /vmlinuz.old is now a symlink to boot/vmlinuz-4.15.0-36-generic
I: /initrd.img.old is now a symlink to boot/initrd.img-4.15.0-36-generic
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-34-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
(Reading database ... 156180 files and directories currently installed.)
Purging configuration files for linux-image-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
dpkg: warning: while removing linux-modules-4.15.0-33-generic, directory '/lib/modules/4.15.0-33-generic' not empty so not removed
Purging configuration files for linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-image-4.15.0-33-generic (4.15.0-33.36) ...
Purging configuration files for linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
~$ uname -r
4.15.0-36-generic

Le script que vous avez trouvé sur le forum est défectueux. Cela pourrait ne pas supprimer certains paquets d'en-tête désirés (si vous utilisiez un ancien noyau -pae), et d'autre part, cela pourrait supprimer certains paquets que vous souhaitez conserver.
jarno

Merci pour le commentaire. Le script n'est peut-être pas parfait, cependant, je l'utilise depuis des années, principalement sur les versions 12.04 et 14.04, 32 et 64 bits, et je n'ai rencontré aucun problème. ... et oui, linux-libc-devest installé.
Mikewever

Je suppose que le numéro de version de linux-libc-devcorrespond au numéro de version du noyau actuel. Voici les dpkg -l linux-libc-dev | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'impressions linux-libc-dev: amd64
jarno

Je ne peux toujours pas reproduire vos résultats, cependant, pour être sûr, j'ai modifié la commande en ajoutant un filtre supplémentaire - grep -E "(image|headers)".
Mikew que ce soit

1
Essayez d'abord sans le -ydrapeau avec purge s'il vous plaît ..!
danger89

16

Afin de supprimer les anciens noyaux d'images Linux, commencez par le noyau que vous souhaitez conserver.

Vous pouvez également vérifier la version du noyau à l'aide de la commande uname -rafin de ne pas supprimer la mauvaise par erreur.

Allez maintenant dans le gestionnaire de paquets synaptic et recherchez linux-imageet supprimez les anciennes versions, à l'exception de celle indiquée par la commande supérieure. Généralement, je préfère aller avec le dernier.

Maintenant, lorsque vous redémarrez, vous verrez un menu plus propre.


C’est probablement la méthode la plus élémentaire pour les utilisateurs qui ont installé sans Computer Janitor.
Broam

1
À partir d’Ubuntu 11.04, le menu de menu n’affiche que le noyau actuel par défaut, les noyaux les plus anciens étant masqués dans le menu 'Noyaux précédents'. Cette méthode fonctionnera toujours pour nettoyer les plus anciennes.
Andy

14

Vous pouvez installer ubuntu-tweak puis aller dans Applications -> Outil système -> Ubuntu tweak et

entrez la description de l'image icicliquez sur le nettoyeur de paquet et nettoyez les noyaux. il ne montre pas le noyau actuellement utilisé, vous serez donc toujours en sécurité.


8

Personnellement, j'aime utiliser Synaptic. Cela me rend plus sûr de ce qui se passe. Ubuntu Tweak est la seule application que j'ai utilisée et qui dispose d'une option pour supprimer les anciens noyaux .

Comment supprimer les noyaux que vous n'utilisez pas:

  • Ouvrez UbuntuTweak
  • Cliquez sur 'Package Cleaner' sous 'Applications' dans le volet de gauche.
  • Sur le côté droit de la vue "nettoyage", appuyez sur "Nettoyer les grains".
  • Sélectionner tous les noyaux - Je pense que celui utilisé n'est pas listé mais juste au cas où le contrôle tourne uname -adans un terminal

Dans Synaptic, vous pouvez filtrer sur "Composants" -> "Noyau et modules", qui incluent tous les noyaux. Et triez par la première colonne: 'S' (Status), ainsi vous obtenez tous les noyaux installés en haut. En effet update-grubest conseillé.
danger89

6

Vous pouvez désinstaller les anciens noyaux ( linux-image-...packages) à l’aide de Synaptic, ce qui les supprimera du menu de démarrage. Veillez à ne pas supprimer le noyau en cours d’exécution (vous pouvez vérifier sa version avec uname -r).

N'oubliez pas qu'avoir une ou deux versions plus anciennes peut vous aider à résoudre les problèmes éventuels.

Vous pouvez également modifier / supprimer les entrées manuellement ( gksu gedit /boot/grub/grub.cfg), mais elles seront régénérées lorsque vous effectuerez la mise à jour vers un noyau plus récent. Si vous envisagez de supprimer des recovery modeoptions, ne le faites pas. Ils peuvent être utiles si vous cassez quelque chose qui vous empêche de démarrer.


Reportez-vous à cette page.


Grub2 construit maintenant son entrée grub à chaque fois qu'un nouveau noyau est installé. avec update-grubqui va réécrire tous ces noyaux.
Marco Ceppi

4

Ceci est une solution pure en ligne de commande.

Commencez par générer une liste de toutes les versions de noyau installées, à l'exception du noyau en cours d'exécution:

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    grep -v $(uname -r | cut -d- -f1,2))

Vous pouvez également générer une liste de toutes les versions de noyau installées, à l'exception des deux dernières:

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    sort -V | head -n -2)

Examiner la liste. Assurez-vous que les versions du noyau que vous souhaitez conserver ne font pas partie de la liste. Utilisez la commande uname -rpour voir la version du noyau en cours d’exécution.

Si vous êtes satisfait des résultats, vous pouvez utiliser apt-getpour supprimer les packages.

D'abord un essai à sec (en utilisant le premier générateur comme exemple):

sudo apt-get --dry-run purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))

Puis une vraie course:

sudo apt-get purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))

Si vous souhaitez automatiser le processus, ajoutez le --yesparamètre suivant:

sudo apt-get --yes purge $(
  ...)

@ jarno J'apprécie vos efforts pour combiner et optimiser ma ligne de commande. J'ai supprimé votre ligne de commande car je préfère la lisibilité et la simplicité. J'ai délibérément adapté ma commande à la lisibilité et à la simplicité. Au moins lisible et simple pour mon cerveau. Veuillez poster votre ligne de commande en commentaire ou dans votre propre réponse.
Lesmana

1
Cela combine deux objectifs: conserver les deux derniers noyaux et conserver les noyaux plus récents que l'actuel sudo apt-get purge -- $(ls -1U /boot/vmlinuz* | cut -d- -f2,3 | sort -uV | head -n -2 | awk -v c=$(uname -r | cut -d- -f1,2) '($0==c){exit} //' | sed -r -e 's/\./\\./g' -e 's/.*/-&($|-)/'). Il n'y a pas besoin de dpkg-querypuisque apt-getpeut gérer les expressions régulières Veuillez noter comment j'échappe aux points et ajoutez le préfixe et le suffixe dans l'expression régulière. En utilisant le script dans ma propre réponse, vous pouvez également conserver certains noyaux plus anciens que celui-ci.
jarno

4

L'avantage de cette réponse est que Ubuntu Bash natif est utilisé sans installer d'applications tierces. Utilisateurs de noyaux personnalisés qui n'ont pas utilisé aptou dpkgne peuvent pas modifier ce script bash pour répondre à leurs besoins. Cette réponse est basée sur ( Comment purger sélectivement tous les anciens noyaux en même temps ).

Solution basée sur Zenity

Zenity fournit une interface graphique agréable au terminal pour traiter une liste et sélectionner des éléments avec des boutons radio :

rm-noyaux 1

Comme le titre l'indique, le noyau actuel avec lequel vous avez démarré ne peut pas être supprimé et n'est pas inclus dans la liste. La taille indiquée est la quantité qui sera enregistrée dans le /bootrépertoire. Plus est enregistré sur votre disque, car les fichiers binaires du noyau résident également dans d’autres domaines. 27 juillet 2017 note: Les annuaires /usr/src/*kernel_version*et /lib/modules/*kernel_version*sont maintenant aussi inclus.

La date de modification est découverte à l'aide de la statcommande. Sur mon système, cette date est "modifiée" chaque fois que le noyau est démarré à l'aide de ce script ( comment savoir quand une version spécifique du noyau a été démarrée? ) Script de redémarrage cron . Cependant, sur votre système, la date sera la date de publication du noyau, et non la dernière fois que vous l’avez démarré.

apt-get purge vous donne la chance d'avorter

Vous avez enfin la possibilité de voir tout ce qui sera purgé et de voir l’espace disque total (quelque peu trompeur) qui sera récupéré:

The following packages will be REMOVED:
  linux-headers-4.7.1-040701* linux-headers-4.7.1-040701-generic*
  linux-headers-4.7.2-040702* linux-headers-4.7.2-040702-generic*
  linux-headers-4.7.3-040703* linux-headers-4.7.3-040703-generic*
  linux-headers-4.8.1-040801* linux-headers-4.8.1-040801-generic*
  linux-headers-4.8.10-040810* linux-headers-4.8.10-040810-generic*
  linux-headers-4.8.11-040811* linux-headers-4.8.11-040811-generic*
  linux-headers-4.8.4-040804* linux-headers-4.8.4-040804-generic*
  linux-headers-4.8.5-040805* linux-headers-4.8.5-040805-generic*
  linux-image-4.7.1-040701-generic* linux-image-4.7.2-040702-generic*
  linux-image-4.7.3-040703-generic* linux-image-4.8.1-040801-generic*
  linux-image-4.8.10-040810-generic* linux-image-4.8.11-040811-generic*
  linux-image-4.8.4-040804-generic* linux-image-4.8.5-040805-generic*
0 upgraded, 0 newly installed, 24 to remove and 2 not upgraded.
After this operation, 2,330 MB disk space will be freed.
Do you want to continue? [Y/n] 

Le code

Copiez ce code dans un fichier exécutable nommé rm-kernelsdans /usr/local/bin:

#!/bin/bash

# NAME: rm-kernels
# PATH: /usr/local/bin
# DESC: Provide zenity item list of kernels to remove

# DATE: Mar 10, 2017. Modified Jul 28, 2017.

# NOTE: Will not delete current kernel.

#       With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
#       # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
#       First time for `du` 34 seconds.
#       Second time for `du` 1 second.

# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
#       By default `du` is not used and estimated size is displayed.

# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
    zenity --error --text "root access required. Use: sudo rm-kernels"
    exit 99
fi

OLDIFS="$IFS"
IFS="|"
choices=()

current_version=$(uname -r)

for f in /boot/vmlinuz*
do
    if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
    [[ $f =~ vmlinuz-(.*) ]]
    v=${BASH_REMATCH[1]}        # example: 4.9.21-040921-generic
    v_main="${v%-*}"            # example: 4.9.21-040921

    # Kernel size in /boot/*4.9.21-040921-generic*
    s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')

    if [[ $# -ne 0 ]] ; then    # Was a parameter passed?
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             # Kernel headers size in /usr/src/*4.9.21-040921*
             s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
        else
             s2="0M"            # Linux Headers are not installed
        fi
        # Kernel image size in /lib/modules/4.9.21-040921-generic*
        s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
    else
        # Estimate sizof of optional headers at 125MB and size of image at 220MB
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             s2="125M"
        else
             s2="0M"            # Linux Headers are not installed
        fi
        s3="220M"
    fi

    # Strip out "M" provided by human readable option of du and add 3 sizes together
    s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
    t=$(( t + s ))
    s=$s" MB"
    d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
    choices=("${choices[@]}" false "$v" "$d" "$s")
done

# adjust width & height below for your screen 640x480 default for 1920x1080 HD screen
# also adjust font="14" below if blue text is too small or too large

choices=(`zenity \
        --title "rm-kernels - Total: $t MB excluding: $current_version" \
        --list \
        --separator="$IFS" \
        --checklist --multiple \
        --text '<span foreground="blue" font="14">Check box next to kernel(s) to remove</span>' \
        --width=640 \
        --height=480 \
        --column "Select" \
        --column "Kernel Version Number" \
        --column "Modified Date" \
        --column " Size " \
        "${choices[@]}"`)
IFS="$OLDIFS"

i=0
list=""
for choice in "${choices[@]}" ; do
    if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
    ((i++))

    short_choice=$(echo $choice | cut -f1-2 -d"-")
    header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)

    # If -lowlatency and -generic are purged at same time the _all header directory
    # remains on disk for specific version with no -generic or -lowlatency below.
    if [[ $header_count -lt 3 ]]; then
        # Remove all w.x.y-zzz headers
        list="$list""linux-image-$choice- linux-headers-$short_choice"
    else
        # Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
        list="$list""linux-image-$choice- linux-headers-$choice" 
    fi

done

if [ "$i" -gt 0 ] ; then
     apt-get purge $list
fi

NOTE: Vous devez avoir l’autorisation sudo pour créer le fichier, utilisez donc:

gksu gedit /usr/local/bin/rm-kernels

Pour rendre le fichier exécutable, utilisez:

sudo chmod +x /usr/local/bin/rm-kernels

Version du serveur

rm-kernels-serverest la version du serveur pour supprimer sélectivement les noyaux en une fois. Au lieu d'une boîte de dialogue graphique (graphique), une boîte de dialogue textuelle est utilisée pour sélectionner les noyaux à purger.

  • Avant d'exécuter le script, vous devez installer la fonction de dialogue à l' aide de:

    sudo apt install dialog

La boîte de dialogue est dans l'installation par défaut du bureau Ubuntu, mais pas dans Ubuntu Server.

Exemple d'écran

rm-kernels-server 1

rm-kernels-server code bash

#!/bin/bash

# NAME: rm-kernels-server
# PATH: /usr/local/bin
# DESC: Provide dialog checklist of kernels to remove
#       Non-GUI, text based interface for server distro's.

# DATE: Mar 10, 2017. Modified Jul 28, 2017.

# NOTE: Will not delete current kernel.

#       With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
#       # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
#       First time for `du` 34 seconds.
#       Second time for `du` 1 second.

# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
#       By default `du` is not used and estimated size is displayed.

# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
    echo "root access required. Use: sudo rm-kernels-server"
    exit 99
fi

# Must have the dialog package. On Servers, not installed by default
command -v dialog >/dev/null 2>&1 || { echo >&2 "dialog package required but it is not installed.  Aborting."; exit 99; }

OLDIFS="$IFS"
IFS="|"
item_list=() # Deviate from rm-kernels here.

current_version=$(uname -r)
i=0
for f in /boot/vmlinuz*
do
    if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
    [[ $f =~ vmlinuz-(.*) ]]
    ((i++)) # Item List
    v=${BASH_REMATCH[1]}        # example: 4.9.21-040921-generic
    v_main="${v%-*}"            # example: 4.9.21-040921

    # Kernel size in /boot/*4.9.21-040921-generic*
    s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')

    if [[ $# -ne 0 ]] ; then    # Was a parameter passed?
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             # Kernel headers size in /usr/src/*4.9.21-040921*
             s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
        else
             s2="0M"            # Linux Headers are not installed
        fi
        # Kernel image size in /lib/modules/4.9.21-040921-generic*
        s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
    else
        # Estimate sizof of optional headers at 125MB and size of image at 220MB
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             s2="125M"
        else
             s2="0M"            # Linux Headers are not installed
        fi
        s3="220M"
    fi

    # Strip out "M" provided by human readable option of du and add 3 sizes together
    s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
    t=$(( t + s ))
    s=$s" MB"
    d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
    item_list=("${item_list[@]}" "$i" "$v ! $d ! $s" off)
done

cmd=(dialog --backtitle "rm-kernels-server - Total: $t MB excluding: $current_version" \
    --title "Use space bar to toggle kernel(s) to remove" \
    --column-separator "!" \
    --separate-output \
    --ascii-lines \
    --checklist "         Kernel Version --------- Modified Date  Size" 20 60 15)

selections=$("${cmd[@]}" "${item_list[@]}" 2>&1 >/dev/tty)

IFS=$OLDIFS

if [ $? -ne 0 ] ; then
    echo cancel selected
    exit 1
fi

i=0
choices=()

for select in $selections ; do
    ((i++))
    j=$(( 1 + ($select - 1) * 3 ))
    choices[i]=$(echo ${item_list[j]} | cut -f1 -d"!")
done

i=0
list=""
for choice in "${choices[@]}" ; do
    if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
    ((i++))

    short_choice=$(echo $choice | cut -f1-2 -d"-")
    header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)

    # If -lowlatency and -generic are purged at same time the _all header directory
    # remains on disk for specific version with no -generic or -lowlatency below.
    if [[ $header_count -lt 3 ]]; then
        # Remove all w.x.y-zzz headers
        list="$list""linux-image-$choice- linux-headers-$short_choice"
    else
        # Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
        list="$list""linux-image-$choice- linux-headers-$choice" 
    fi

done

if [ "$i" -gt 0 ] ; then
    apt-get purge $list
fi

Remarque: dans l'appel de dialogla directive --ascii-linesest passé pour remplacer le jeu de caractères étendu de dessin de ligne (qui sshn'aime pas) avec "+ ----- +" pour les zones de dessin. Si vous n'aimez pas cette apparence, vous pouvez utiliser la --no-linesdirective pour aucun champ.


28 juillet 2017 Mises à jour

La taille calculée de chaque noyau a été prise, à partir de /boot/*kernel_version*laquelle se trouvaient 5 fichiers totalisant environ 50 Mo. La formule a été modifiée pour inclure les fichiers dans /usr/src/*kernel_version*et /lib/modules/*kernel_version*. La taille calculée pour chaque noyau est maintenant d’environ 400 Mo. Le code ci-dessus pour rm-kernelset rm-kernels-servera été mis à jour. Toutefois, les exemples d'écrans ci-dessus ne reflètent pas encore ces modifications.

Par défaut, la taille des fichiers pour les en-têtes linux est estimée à 125 Mo et celle de linux-image à 220 Mo car elle dupeut être extrêmement lente, sauf si les fichiers sont en cache. Pour obtenir la taille réelle, utilisez dun'importe quel paramètre du script.

Le total de toutes les tailles de noyau (à l'exception de la version en cours d'exécution qui ne peut pas être supprimée) est maintenant affiché dans la barre de titre.

La boîte de dialogue utilisée pour afficher la date du dernier accès de chaque noyau . Cette date peut être écrasée en masse pour tous les noyaux lors d'une sauvegarde ou d'opérations similaires. La boîte de dialogue affiche maintenant la date de modification .


2

Un moyen simple de supprimer presque tous les paquets obsolètes, les paquets qui ne figurent plus dans une liste de paquets, ainsi que les noyaux obsolètes, consiste à effectuer l'une des opérations suivantes:

dpkg --purge $(aptitude search ?obsolete)

Cependant, cela manquera les packages qui sont toujours recommandés par d'autres packages et l'argument -R / - without-recommend ne résout pas ce problème.

dselect après le changement de mode de tri avec 'o' affichera tous les paquets obsolètes, y compris ceux manquant à aptitude, mais certaines personnes n'aiment pas l'utiliser.


La commande donnée ne nettoie pas les anciens noyaux et n’affecte pas le menu grub selon mon expérience.
Jarno

2

La réponse acceptée en utilisant sedpour supprimer définitivement les anciens noyaux a quelques défauts. Si quelqu'un n'a pas redémarré l'ordinateur après la mise à niveau du noyau, la commande supprimera également le nouveau noyau.

Voici une solution alternative qui prend en compte toutes les situations pour supprimer uniquement les noyaux plus anciens:

#!/bin/bash
kernels=( $(grep -Po "^linux-image-[^-]+-[^-]+-generic\b" < <(dpkg --get-selections)) )
cur_rel=$(grep -Po ".*(?=-[a-z]*$)" < <(uname -r))

for kernel in "${kernels[@]}"; do
    ker_rel=$(grep -Po "[0-9].*(?=-[a-z]*)" <<< "$kernel")
    dpkg --compare-versions "$ker_rel" gt "$cur_rel" && echo "Please Restart your computer first" && break
    dpkg --compare-versions "$ker_rel" lt "$cur_rel" && sudo apt-get remove "$kernel"
done

Si vous avez une version plus récente que la version actuelle, un avertissement vous avertira de redémarrer votre ordinateur en premier. Notez également que les anciens noyaux sont préservés pour une bonne raison: si vous gâchez votre noyau actuel en rendant votre système instable, vous devriez pouvoir démarrer dans n’importe quel noyau plus ancien.


Cela ne supprimera pas les noyaux de faible latence ou les noyaux d'une autre saveur que générique.
Jarno

Je suppose que vous faites référence à ces sed solutions.
Juin

@ Jarno: Que diriez-vous de remplacer grep -Po "^linux-image-[^-]+-[^-]+-generic\b"par grep -Eo "^linux-(image|headers|tools)-[^-]+-[^-]+(|-generic)\s" | sed -e "s/\s//g"et grep -Po ".*(?=-[a-z]*$)"avec grep -Eo "^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"et grep -Po "[0-9].*(?=-[a-z]*)"avec grep -Eo "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"?
Sadi

@Sadi, wel, je ne trouverais pas non plus de noyaux à faible acidité.
Jarno

1
Merci. D'autres méthodes n'ont pas fonctionné pour moi. Le vôtre a fait le travail.
Philippe Delteil

1

ailurus a pour fonction de supprimer les anciens noyaux ainsi que les configurations inutilisées. Personnellement, je l'enlève manuellement de synaptic. Vous pouvez installer ailurus de getdeb ainsi que ppa


"Ailurus est un outil permettant de sauvegarder une liste de noms de logiciels installés. ... Auparavant, Ailurus avait de nombreuses fonctions. Désormais, il n'a qu'une fonction. Parce que je pense qu'une fonction vraiment utile vaut mieux que des dizaines de fonctions moins utiles."
Jarno

1

J'ai un script pour cela qui n'a pas besoin d'analyse syntaxique de chaînes très sophistiquée.

Supprime les en-têtes et les images, à l'exception de l'image actuelle, pour libérer de l'espace

sudo apt-get autoremove --purge 'linux-headers-[0-9].*' linux-headers-$(uname -r)+ linux-headers-$(uname -r | cut -d- -f1,2)+ 'linux-image-[0-9].*' linux-image-$(uname -r)+

1

Vous pouvez utiliser ukuu - c'est tout l'interface graphique - pour mettre à jour et supprimer les anciens noyaux. Travaille pour moi!

Rappelez-vous simplement de laisser les 2 derniers installés et évidemment le noyau 'en cours d'exécution'.

Vous pouvez également configurer ukuu pour n’afficher que les versions principales, même les noyaux RC, les versions masquées.

ukuu

Vous pouvez trouver ukuu dans Synaptic, ou les instructions sont ici:

OMG! Ubuntu ukuu instructions d'installation


1

Basé sur une réponse précédente de David Kemp, le script suivant purgera tous les en-têtes et les images, à l'exception des 2 dernières versions.

#!/bin/sh
# This script assumes that the installed linux-image and linux-headers packages
# share the same versions (i.e. if a linux-image version number is installed,
# the corresponding linux-headers package will also be installed, and vice
# versa.)

SECONDTOLASTVER=$(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -r -n | sed '/^[^0-9]\+$/d' | sed 's/^.*-\([0-9\.]\+-[0-9]\+\).*/\1/' | uniq | sed -n 2p)

# get a list of package names matching the argument passed to the function, and
# return only those package names which should be removed
get_pkgs_to_remove_matching () {
    if [ -n "$SECONDTOLASTVER" ]; then
        echo $(dpkg --list | grep $1 | awk '{ print $2 }' | sort | sed -n '/'"$SECONDTOLASTVER"'/q;p')
    fi
}

echo $(get_pkgs_to_remove_matching linux-image) $(get_pkgs_to_remove_matching linux-headers) | xargs sudo apt-get purge

(utiliser apt-get -ypour enlever sans question)


Une raison pour laquelle cela a été voté? Cela n'a-t-il pas fonctionné pour quelqu'un? Lors du copier / coller, assurez-vous de ne pas envelopper de longues lignes lorsque vous les collez. Je n'ai eu aucun problème avec le travail.
Mark

La dernière version du noyau de ma machine est la 3.13.0-43-lowlatency. Ce script purgerait linux-headers-3.13.0-43-lowlatency.
jarno

@ Jarno comment avez-vous déterminé cela? pour l'essayer sans rien faire, ajoutez un indicateur "-s" à la commande apt-get (ou supprimez simplement le | xargs sudo apt-get -y purgetout). Si elle imprime 3.13.0-43-lowlatency, alors vous avez peut-être des versions plus récentes que celle installée sur votre système.
Mark

J'ai essayé la simulation. Non, mais certaines versions antérieures du noyau ont été supprimées, mais non purgées, et les packages d'en-tête respectifs purgés.
Jarno

Quoi qu'il en soit, j'ai développé un script basé sur l'idée de la réponse de Sankalp.
Jarno

0

Voici un aperçu de ce que j'ai fait. Attention, je ne suis pas un expert en Linux. Assurez-vous de savoir ce que vous faites et de sauvegarder tous les fichiers que vous modifiez.

gedit /boot/grub/grub.cfg

puis trouver les entrées que vous souhaitez conserver, nous les mettrons en surbrillance et les copierons

cd /etc/grub.d
ls

vous verrez une liste de fichiers comme 10_linux et 30_os-prober

sudo chmod -x 10_linux

cela arrêtera automatiquement l’ajout de toutes les entrées linux dans le menu de démarrage de grub.

gksudo gedit 40_custom

ouvrez le fichier de menu de démarrage personnalisé, puis retournez dans le fichier grub.cfg (qui devrait toujours être ouvert dans gedit), puis copiez les entrées à conserver, telles que

menuentry "My Default Karmic" {
  set root=(hd0,1)
  search --no-floppy --fs-uuid --set cb201140-52f8-4449-9a95-749b27b58ce8
  linux /boot/vmlinuz-2.6.31-11-generic root=UUID=cb201140-52f8-4449-9a95-749b27b58ce8 ro quiet splash
  initrd /boot/initrd.img-2.6.31-11-generic
}

collez-les dans 40_custom, puis enregistrez-le.

sudo chmod 755 40_custom

le rend exécutable, puis finalement nous mettons à jour grub qui changera le fichier grub.cfg:

sudo update-grub

Maintenant, ATTENTION, si vous mettez à jour votre noyau ou votre système d'exploitation, votre menu de démarrage ne sera probablement pas mis à jour ... vous devrez le faire manuellement. Mais cette procédure vous permettra de personnaliser un peu plus le menu de démarrage, comme supprimer la version du noyau et simplement mettre le nom ubuntu ... c'est-à-dire Ubuntu Lucid 10.04, etc ...

J'espère que quelqu'un trouve cela utile, car il m'a fallu un certain temps pour comprendre ... je n'ai vu cette solution nulle part ...


3
Cette réponse semble exagérée. Il vaut mieux simplement enlever les vieux noyaux.
Scott Severance

J'avais lu que des noyaux supplémentaires pourraient être utiles en cas de récupération. En outre, il s'agit d'un moyen simple d'éditer le texte de l'entrée de démarrage. Donc, plutôt que de dire "Ubuntu, noyau Linux xxxx-yy --text1 -text2 -t3 -t4 --t5 etc etc etc" (où les entrées --text désignent seulement des options / paramètres que je ne comprends pas), vous pouvez changer "Ubuntu xx.yy" bien que j’aie eu un "{" crochet dont je ne pouvais pas me débarrasser.
Joe

1
Je garde le noyau antérieur immédiat jusqu'à ce que j'ai vérifié que le noyau le plus récent fonctionne correctement. Si cela fonctionne, il ne va pas cesser de fonctionner. Ainsi, après avoir vérifié le noyau le plus récent (après environ une semaine), je n’ai aucune raison de conserver l’ancien noyau. Si cela ne fonctionne pas, alors j’aurai le dernier noyau connu en bon état. En fait, je suis en train d’exécuter un ancien noyau à cause d’un bogue dans les noyaux actuels. Mais cela ne change pas ma politique globale. Vous n'avez besoin que d'un seul bon noyau connu.
Scott Severance

0

Installez le gestionnaire de paquets synaptic et allez dans l’onglet filtres (je pense filtres, sinon essayez tous les 5) et sélectionnez "local". Cela vous montrera des paquets orphelins sur votre système, tels que les noyaux. Après les avoir désinstallés, lancez update-grub. Cette commande met à jour la liste des options de démarrage pour grub.

Si cela échoue, vous pouvez toujours essayer apt-get remove linux-image-version-generic.


Dans Synaptic, vous pouvez filtrer sur "Composants" -> "Noyau et modules", qui incluent tous les noyaux. Et triez par la première colonne: 'S' (Status), ainsi vous obtenez tous les noyaux installés en haut. En effet update-grubest conseillé.
danger89

0

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

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 en conséquence.


0

Essaye ça. Exécutez-le en tant que root.

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

Transmettez, en tant qu'argument de ligne de commande, le nombre de noyaux les plus récents que vous souhaitez conserver.

    
#! / bin / bash

# passe n comme argument de ligne de commande, et il trouvera tous les éléments installés
# noyaux et ne conserve que les n plus récents => désinstaller tous les anciens

# dpkg -l 'linux- *' | sed '/ ^ ii /! d; /' "(uname -r | sed" s /\(.*\)-\([ 0-9] \ + \) / \ 1 / ")" '/ d; s / ^ [^] * [^] * \ ([^] * \). * / \ 1 /; / [0-9] /! d '
# cette commande donne la liste de tous les paquets SAUF pour le dernier noyau.
# source: https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels

n = 1 $

# trouver les versions du noyau installées:
# dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep. | trier -n
# donne les numéros de version, un dans chaque ligne
# dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep. | sed 's /\...$// g' | grep -v '\ ... $' | trier -u
# ne donne que ceux qui apparaissent dans linux-image

# suffixe, par exemple -generic-pae
# le genre de noyau dans lequel vous démarrez
suffixe = $ (uname -r | sed: ^ [0-9] \. [0-9] \. [0-9] \ - [0-9] \ {2 \} :: g ')

command = "apt-get purge"

pour la version dans $ (dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep. | sed 's /\...$// g' | grep -v ' \ ... $ '| sort -u | head -n - $ {n})
faire
    commande = $ {commande} "^ linux-image - $ {version} $ {suffixe}"
terminé

$ commande

Exemple d'utilisation:

# ./keep-n-kernels.sh 4 # lancez la commande apt-get pour supprimer tous les noyaux, à l'exception des 4 plus récents.

Si vous voulez [ET À VOS PROPRES RISQUES], vous pouvez ajouter un -y (ou un indicateur de force) à la commande apt-get et la rendre non interactive.


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 suffixe = $ (uname -r | sed -r '/ ^ [0-9.] * (- [0-9.] +) * //') ou suffixe = $ (uname -r | egrep - -only-matching - '- [[: alpha:] -] + $') ferait l'affaire.
Jeudi

Mais je pense que l'idée est belle. Je travaille sur l'amélioration du script et peut-être que je le posterai ici un jour, quand je pense qu'il est suffisamment prêt.
jarno

Faites s'il vous plaît partager, @ Jarno. Heureux de savoir que cette idée semble utile.
Sankalp

Ok, ça y est: link
jarno

0

J'utilise un ordinateur de bureau KDE et l'option la plus simple que j'ai trouvée est 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 d'arrière-plan, l'option de démarrage par défaut, etc.). En regard de la liste déroulante dans laquelle vous pouvez choisir l'entrée par défaut, vous trouverez 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 modifications, dpkg est utilisé pour les supprimer du système ainsi que du menu GRUB.


0

Juste pour sonner, vous pouvez aussi émettre

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

en tant que racine, et le travail sera fait.


0

Si vous utilisez ansible pour contrôler les machines, ce manuel peut vous être utile.

---
 - hosts: all
   become: yes
   tasks:
    - name: "Run apt-get autoremove"
      apt: 
        name: linux-image-generic
        autoremove: yes
        state: present 
        update_cache: yes
        cache_valid_time: 3600
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.