Ich habe viele Threads zum Freigeben von Speicherplatz auf der / boot-Partition gesehen, und das ist auch mein Ziel. Ich bin jedoch nur daran interessiert, alte Kernel zu löschen und nicht jeden von ihnen, sondern den aktuellen.
Ich brauche die Lösung, um ein Einzeiler zu sein, da ich das Skript von Puppet ausführen und keine zusätzlichen Dateien haben möchte. Bisher habe ich folgendes bekommen:
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
Genauer gesagt ist das, was es im Moment tut, das Folgende:
- Listet alle Linux- * Pakete auf und druckt deren Namen aus.
- Listen Sie nur diejenigen auf, die Zahlen haben, und sortieren Sie sie, und geben Sie das umgekehrte Ergebnis zurück. Auf diese Weise werden ältere Kernel zuletzt aufgelistet.
- Nur die Ergebnisse ausgeben, die nach dem aktuellen Kernel liegen
- Da es einige linux- {image, headers} -Ergebnisse gibt, stelle sicher, dass ich nichts lösche, was mit meinem aktuellen Kernel zusammenhängt
- Rufen Sie apt zum Löschen an
Das funktioniert, aber ich bin mir sicher, dass die Lösung eleganter und sicherer für eine Produktionsumgebung ist, da mindestens 20 unserer Server Ubuntu ausführen.
Danke für deine Zeit, Alejandro.
kernel
bash
boot-partition
Alejandro
quelle
quelle
Antworten:
Sieht gut aus, nur ein paar Kommentare. Die beiden ersten Kommentare machen den Befehl sicherer, während der dritte und vierte ihn etwas kürzer machen. Fühlen Sie sich frei, einem von ihnen zu folgen oder ihn zu ignorieren. Ich rate jedoch dringend, den ersten beiden zu folgen. Sie möchten sicherstellen, dass es so sicher wie möglich ist. Ich meine, ernsthaft. Sie werfen eine
sudo apt-get -y purge
automatisch generierte Paketliste auf. Das ist so böse ! :)Wenn Sie alle
linux-*
auflisten, erhalten Sie viele Fehlalarme, z. B. (Beispiel aus meiner Ausgabe)linux-sound-base
. Auch wenn diese möglicherweise später vom Rest Ihres Kommandos herausgefiltert werden, würde ich mich persönlich sicherer fühlen, wenn Sie sie nicht an erster Stelle aufführen. Kontrollieren Sie besser, welche Pakete Sie entfernen möchten. Tun Sie keine Dinge, die zu unerwarteten Ergebnissen führen können. Also würde ich anfangen mitIhre Regex, "nur diejenigen aufzulisten, die Zahlen haben", ist meiner Meinung nach etwas zu einfach. Zum Beispiel gibt es das Paket,
linux-libc-dev:amd64
wenn Sie sich auf einem 64-Bit-System befinden. Ihr regulärer Ausdruck wird passen. Du willst nicht, dass es zusammenpasst. Zugegeben, wenn Sie meinen ersten Rat befolgt haben, werden Sielinux-libc-dev:amd64
trotzdem nicht aufgelistet, aber trotzdem. Wir wissen mehr über die Struktur einer Versionsnummer als über die einfache Tatsache, dass es eine Nummer gibt. Darüber hinaus ist es im Allgemeinen eine gute Idee, reguläre Ausdrücke zu zitieren, um mögliche Fehlinterpretationen durch die Shell zu vermeiden. Also würde ich diesen egrep-Befehl ausführenDann ist da noch dieses Sortierding. Warum sortierst du? Ist es für Sie wichtig, ältere Kernel vor neueren zu entfernen, da Sie ohnehin alle Kernel (außer den aktuellen) entfernen werden? Ich denke nicht, dass es einen Unterschied macht. Oder machen Sie das nur, damit Sie
sed
"nur die Ergebnisse ausgeben können, die nach dem aktuellen Kernel liegen"? Aber IMO fühlt sich das viel zu kompliziert an. Warum nicht einfach die Ergebnisse herausfiltern, die Ihrem aktuellen Kernel entsprechen, wie Sie esgrep -v
ohnehin schon tun , und fertig? Ehrlich gesagt, wenn ich den ersten Teil Ihres Befehls (mit meinen beiden vorherigen Vorschlägen integriert) auf meinem Computer nehme, erhalte ichWenn ich das Sortier- / Sed-Zeug entferne, verstehe ich
Ihr komplizierterer Befehl würde also tatsächlich zwei Pakete auf meinem Computer vermissen, die ich entfernen möchte (jetzt ist es möglich, dass diese
linux-image-extra-*
Dings von den Dings abhängenlinux-image-*
und daher trotzdem entfernt werden, aber es kann nicht schaden, es explizit zu machen). Ich sehe jedenfalls nicht den Sinn Ihrer Sortierung; Eine einfache,grep -v
ausgefallene Vorverarbeitung sollte in Ordnung sein, vermutlich sogar noch besser. Ich bin ein Befürworter des KISS-Prinzips. Dies erleichtert Ihnen das spätere Verstehen oder Debuggen. Auch ohne die Sortierung ist es etwas effizienter;)Dies ist rein ästhetisch, aber mit dieser etwas kürzeren Variante erhalten Sie die gleiche Ausgabe. :-)
Folglich komme ich zu dem einfacheren und sichereren Befehl
Da Sie tatsächlich Ihre bereinigen möchten
/boot
Partition, würde einen völlig anderen Ansatz sein , den Inhalt aufzulisten/boot
, verwenden Siedpkg -S
die Pakete , um festzustellen , dass die einzelnen Dateien gehören, ausfiltern diejenigen, die mit dem aktuellen Kernel gehören, und die daraus resultierenden Pakete entfernen. Aber ich mag Ihren Ansatz besser, weil er auch veraltete Pakete findetlinux-headers-*
, die nicht auf/boot
, sondern auf installiert werden/usr/src
.quelle
uname -r
. Bei mir funktioniert es gut. Es wäre interessant zu sehen, warum es in Ihrem Fall nicht funktioniert.uname -r
produziert4.8.0-36-generic
, was nichtlinux-headers-4.8.0-36
aus der Liste ausschließt.Ich habe dieses Skript geschrieben, das "linux- *" - Pakete entfernt, deren Version niedriger ist als die derzeit gebootete. Ich denke, es ist nicht notwendig, den Paketstatus zu testen. Der Befehl fordert eine Bestätigung an, bevor Pakete gelöscht werden. Wenn Sie das nicht möchten, fügen Sie dem Befehl apt-get die Option -y hinzu.
Um jedoch eine konfigurierbare Anzahl von Ersatzkernen zu belassen, empfehle ich, mein
linux-purge
Skript mit--keep
Option zu verwenden. Sehen Sie hier für weitere Informationen über das Drehbuch.quelle
TL; DR: nach unten springen.
Es ist allerdings ein bisschen länger. Ich werde es für Sie aufschlüsseln:
dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}'
Genau wie Malte vorgeschlagen hat. Listet die relevanten Kerneldateien auf.egrep '[0-9]+\.[0-9]+\.[0-9]+'
Auch von Malte als sicherer Weg vorgeschlagen, nur die Kerneldateien herauszusuchen, indem man nach einer Versionsnummer sucht.Da wir jetzt möglicherweise sowohl das Image- als auch das Header-Paket auflisten, kann die Paketbezeichnung variieren, sodass wir diese Problemumgehung haben, die für die Sortierung erforderlich ist.
awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}'
Das Ergebnis ist eine neue Spalte mit der Versionsnummer vor dem ursprünglichen Paketnamen wie folgt:Jetzt müssen wir die Liste sortieren, um zu verhindern, dass neuere als die derzeit ausgeführten Images deinstalliert werden.
sort -k1,1 --version-sort -r
gib uns das:Entfernen Sie nun die aktuellen und neueren Kerneldateien und
sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"`
geben Sie uns Folgendes:Entfernen Sie nun die erste Spalte, mit der wir hinzugefügt haben
awk '{print $2}'
, um genau das zu erhalten, was wir wollen:Jetzt können wir das an den Paketmanager weiterleiten, um automatisch alles zu entfernen und grub neu zu konfigurieren:
Ich empfehle, zuerst einen Probelauf durchzuführen (obwohl dies für Ihre Skripterstellung unter Umständen nicht sinnvoll ist, wenn Sie eine große Umgebung haben).
Nun, wenn alles gut aussieht, entferne es mit:
Wieder einmal besteht der Sinn dieses "One-Liner" darin, nur den Kernel zu entfernen, der ÄLTER ist als der derzeit ausgeführte Kernel (wodurch alle neu installierten Kernel noch verfügbar sind).
Danke, lass mich wissen, wie das bei dir funktioniert und ob du es verbessern könntest!
quelle
Sie können einfach das Verzeichnis / boot auflisten, um die Kernel-Versionen anzuzeigen, die Sie mit dem Befehl 'ls' haben. Verwenden Sie dann 'sudo apt-get -y purge "xxx"', wobei "xxx" durch die Versionsnummer ersetzt wird, die Sie entfernen möchten. Achten Sie darauf, dass es sich nicht um die Version handelt, die Sie gerade ausführen.
quelle
Installiere
bikeshed
(apt install bikeshed
) und rufepurge-old-kernels
als root auf.quelle
Eine schnelle Antwort, Erklärung auf Anfrage:
quelle
sed '$d'
Befehl. Das Skript entfernt keine Linux-Header-Pakete oder andere Pakete, die sich auf die zu entfernenden Kernel-Pakete beziehen, und löscht auch keine Konfigurationsdateien der Pakete. Ich würde stattdessen empfehlen, meine Antwort zu verwenden.echo
) denapt-get
Befehl, den Sie ausführen könnten.Ich habe die ganze unnötige Komplexität satt und ein Python-Paket erstellt, das den Einzeiler trivial macht:
Installieren Sie es mit
Weitere Informationen finden Sie unter https://github.com/mrts/ubuntu-old-kernel-cleanup .
Hoffe das hilft auch anderen.
quelle
sudo pip install ...
wie oben beschrieben installiert ?sudo
ist eigentlich wichtig, sonstpip
wird es in einem Benutzerverzeichnis installiert und die Shell durchsucht dieses Verzeichnis möglicherweise nicht nach ausführbaren Dateien.Funktioniert die ganze Zeit und sogar Ubuntu 17.10
quelle
linux-libc-dev:amd64
, das ist unerwünscht.