J'ai vu beaucoup de discussions sur la façon de libérer de l'espace sur la partition / boot et c'est aussi mon objectif. Cependant, je ne souhaite supprimer que les anciens noyaux et non chacun d'entre eux, mais l'actuel.
J'ai besoin que la solution soit une ligne car je vais exécuter le script à partir de Puppet et je ne veux pas avoir de fichiers supplémentaires. Jusqu'à présent, j'ai obtenu ce qui suit:
dpkg -l linux-* | awk '/^ii/{print $2}' | egrep [0-9] | sort -t- -k3,4 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"` | xargs sudo apt-get -y purge
Pour être plus précis, ce qu'il fait en ce moment est le suivant:
- Répertoriez tous les packages linux- * et imprimez leurs noms.
- Répertoriez uniquement ceux qui ont des numéros et triez-les, en retournant le résultat inverse. De cette façon, les noyaux plus anciens sont répertoriés en dernier.
- Imprimer uniquement les résultats qui vont après le noyau actuel
- Puisqu'il y a des résultats linux- {image, headers}, assurez-vous que je ne purgerai rien lié à mon noyau actuel
- Appel apte à purger
Cela fonctionne, mais je suis sûr que la solution peut être plus élégante et qu'elle est sûre pour un environnement de production, car au moins 20 de nos serveurs exécutent Ubuntu.
Merci pour votre temps, Alejandro.
kernel
bash
boot-partition
Alejandro
la source
la source
Réponses:
Ça a l'air sympa, juste quelques commentaires. Les deux premiers commentaires rendent la commande plus sûre, tandis que les troisième et quatrième la raccourcissent un peu. N'hésitez pas à suivre ou à ignorer l'un d'eux. Bien que je vous conseille fortement de suivre les deux premiers. Vous voulez vous assurer que c'est aussi sûr que possible. Je veux dire sérieusement. Vous lancez une
sudo apt-get -y purge
liste de packages générée automatiquement. C'est tellement mal ! :)En listant tout
linux-*
, vous obtiendrez de nombreux faux positifs, tels que (exemple de ma sortie)linux-sound-base
. Même si ceux-ci peuvent être filtrés plus tard par le reste de votre commande, je me sentirais personnellement plus en sécurité de ne pas les répertorier en premier lieu. Mieux contrôler les packages que vous souhaitez supprimer. Ne faites pas de choses qui pourraient avoir des résultats inattendus. Je commencerais donc parVotre expression rationnelle pour «ne lister que ceux qui ont des chiffres» est un peu trop simple à mon avis. Par exemple, il y a le package
linux-libc-dev:amd64
lorsque vous êtes sur un système 64 bits. Votre expression régulière correspondra. Vous ne voulez pas qu'elle corresponde. Certes, si vous avez suivi mon premier conseil,linux-libc-dev:amd64
vous ne serez pas répertorié de toute façon, mais quand même. Nous en savons plus sur la structure d'un numéro de version que sur le simple fait "il y a un numéro". De plus, c'est généralement une bonne idée de citer des expressions rationnelles, juste pour éviter d'éventuelles interprétations erronées par le shell. Je ferais donc cette commande egrepEnsuite, il y a ce tri. Pourquoi triez-vous? Puisque vous allez de toute façon supprimer tous les noyaux (sauf celui actuel), est-il important pour vous de supprimer les plus anciens avant les plus récents? Je ne pense pas que cela fasse une différence. Ou faites-vous cela uniquement pour pouvoir ensuite
sed
"Imprimer uniquement les résultats qui vont après le noyau actuel"? Mais l'OMI, cela semble beaucoup trop compliqué. Pourquoi ne pas simplement filtrer les résultats correspondant à votre noyau actuel, comme vous le faites déjà degrep -v
toute façon, et finir? Honnêtement, si je prends la première partie de votre commande (avec mes deux suggestions précédentes intégrées), sur ma machine je reçoisEn supprimant ces trucs de tri / sed, je reçois
Donc, votre commande plus compliquée manquerait en fait deux packages sur ma machine, que je voudrais supprimer (maintenant il est possible que ces
linux-image-extra-*
thingys dépendent deslinux-image-*
thingys et soient donc supprimés de toute façon, mais cela ne peut pas nuire à le rendre explicite). En tout cas, je ne vois pas l'intérêt de votre tri; ungrep -v
prétraitement simple sans fantaisie devrait être bien, probablement encore mieux. Je suis un partisan du principe KISS. Cela vous facilitera la compréhension ou le débogage plus tard. De plus, sans le tri, c'est un peu plus efficace;)C'est purement esthétique mais vous obtiendrez la même sortie avec cette variante légèrement plus courte. :-)
Par conséquent, je me retrouve avec la commande plus simple et plus sûre
Puisque vous voulez réellement nettoyer votre
/boot
partition, une approche complètement différente serait de lister le contenu de/boot
, utiliserdpkg -S
pour déterminer les packages auxquels les fichiers individuels appartiennent, filtrer ceux qui appartiennent au noyau actuel et supprimer les packages résultants. Mais j'aime mieux votre approche, car elle trouvera également des packages obsolètes tels quelinux-headers-*
, qui ne sont pas installés dans/boot
, mais dans/usr/src
.la source
uname -r
. Pour moi, ça fonctionne bien. Il serait intéressant de voir pourquoi cela ne fonctionne pas dans votre cas.uname -r
produit4.8.0-36-generic
, qui ne parvient pas à exclurelinux-headers-4.8.0-36
de la liste.J'ai écrit ce script qui supprime les paquets "linux- *" qui ont une version inférieure à celle actuellement démarrée. Je pense qu'il n'est pas nécessaire de tester l'état du package. La commande demande une confirmation avant de purger les packages. Si vous ne le souhaitez pas, ajoutez l'option -y à la commande apt-get.
Cependant, pour pouvoir laisser une quantité configurable de noyaux de rechange, je recommande d'utiliser mon
linux-purge
script avec--keep
option. Voir ici pour plus d'informations sur le script.la source
TL; DR: sauter vers le bas.
C'est un peu plus long cependant. Je vais le décomposer pour vous:
dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}'
Tout comme Malte l'a suggéré. Répertorie les fichiers du noyau pertinents.egrep '[0-9]+\.[0-9]+\.[0-9]+'
Malte a également suggéré que le moyen le plus sûr de sélectionner uniquement les fichiers du noyau en recherchant un numéro de version.Étant donné que nous répertorions maintenant à la fois l'image et les packages d'en-tête, la dénomination du package peut varier.Nous avons donc cette solution de contournement awk qui est nécessaire pour le tri.Le
awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}'
résultat est une nouvelle colonne avec le numéro de version avant le nom du package d'origine, comme ci-dessous:Maintenant, nous devons trier la liste afin d'éviter de désinstaller des images plus récentes que celle en cours d'exécution.
sort -k1,1 --version-sort -r
nous donnant ceci:Maintenant, supprimez les fichiers du noyau actuels et plus récents
sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"`
en nous donnant ceci:Maintenant, supprimez la première colonne que nous avons ajoutée
awk '{print $2}'
pour obtenir exactement ce que nous voulons:Maintenant, nous pouvons envoyer cela au gestionnaire de paquets pour supprimer automatiquement tout et reconfigurer grub:
Je recommande de faire d'abord un essai à sec (bien que pour vos besoins de script, cela puisse ne pas être pratique si vous avez un grand environnement)
Maintenant, si tout va bien, allez-y et supprimez-le avec:
Encore une fois, le but de ce "one-liner" est de supprimer uniquement les noyaux PLUS ANCIENS que le noyau en cours d'exécution (ce qui laisse les noyaux nouvellement installés encore disponibles)
Merci de me faire savoir comment cela fonctionne pour vous et si vous pouvez l'améliorer!
la source
Vous pouvez simplement lister le répertoire / boot pour voir les versions du noyau que vous avez en utilisant la commande 'ls'. Utilisez ensuite 'sudo apt-get -y purge "xxx"' où "xxx" est remplacé par le numéro de version que vous souhaitez supprimer. Attention, ce n'est pas la version que vous utilisez actuellement !!.
la source
Install
bikeshed
(apt install bikeshed
) et appelez enpurge-old-kernels
tant que root.la source
Une réponse rapide, explication sur demande:
la source
sed '$d'
commande. Le script ne supprime aucun package d'en-tête linux ni aucun autre package lié aux packages du noyau à supprimer, en plus il ne supprime pas les fichiers de configuration des packages. Je recommanderais plutôt d'utiliser ma réponse.echo
) laapt-get
commande que vous pourriez exécuter.Je me suis vraiment fatigué de toute cette complexité inutile et j'ai créé un package Python qui rend le one-liner trivial:
Installez-le avec
Voir plus sur https://github.com/mrts/ubuntu-old-kernel-cleanup .
J'espère que cela aide aussi les autres.
la source
sudo pip install ...
comme décrit ci-dessus?sudo
est en fait important, sinonpip
l'installera dans un répertoire utilisateur et le shell ne pourra pas rechercher dans ce répertoire les fichiers exécutables.Fonctionne tout le temps, et même Ubuntu 17.10
la source
linux-libc-dev:amd64
, c'est indésirable.