Wie entferne ich alte Kernelversionen, um das Boot-Menü zu bereinigen?


701

Jedes Mal, wenn ich einen neuen Linux-Kernel installiere, verbleibt dieser in der grub_config, wodurch das Boot-Menü jedes Mal länger wird.

Ich weiß, dass ich die installierten Pakete manuell durchsuchen und entfernen kann.

Bietet Ubuntu eine einfachere Möglichkeit, sie zu bereinigen oder zu verhindern, dass sie in der Startliste angezeigt werden?


10
Es gibt einen Ubuntu-Befehl mit dem Namen purge-old-kernels, der die Aufgabe erledigt. Siehe meine Antwort für weitere Informationen.
jarno

29
sudo apt-get autoremovesollte den Trick auf Ubuntu 14.04+ tun
Kochfelder

1
Die Ansammlung alter Kernel ist ein Fehler, der derzeit behoben wird : bugs.launchpad.net/bugs/1357093 . Wenn das Update veröffentlicht wird, werden ältere Kernel standardmäßig automatisch entfernt.
user535733

1
@hobs Der Befehl macht in Ubuntu Studio 14.04 nicht den Trick, wenn die Kernel nicht automatisch installiert wurden, sondern vom Software Updater.
jarno

1
Ich kehre immer wieder auf diese Seite zurück ... der Kommentar von @hobs funktioniert nur, wenn Ihre Kernel automatisch installiert wurden - Sie sudo apt-get autoremove --purge antworten jedoch, indem Sie den apt-markRatschlägen auf https://help.ubuntu.com/community/RemoveOldKernels
earcam

Antworten:


602

16.04 und neuere Versionen von Ubuntu

sudo apt autoremove

Dieser Befehl entfernt Pakete, die automatisch installiert wurden, um eine Abhängigkeit aufzulösen, von denen jetzt jedoch keine Abhängigkeit mehr besteht. Dies schließt alte Versionen von linux-headers-*und ein linux-image-*. (Es ist auch klug in Bezug auf diesen Prozess, wenn eine Ersatzversion des Kernels als Fallback übrig bleibt!)

11.10 und neuere Versionen von Ubuntu

GRUB2 und dessen Anzeige aller Kernel

Die neuesten Versionen von Grub2, die in Ubuntu installiert sind, zeigen automatisch den neuesten Kernel an und verbergen die älteren Kernel, die Sie möglicherweise installiert haben.

GNU GRUB

Wenn Sie Ihre Maden nicht sehen, müssen Sie Shiftbeim Booten auf drücken .

Wie Sie sehen, wird nur der neueste Kernel angezeigt.

Wenn Sie die angezeigte Option auswählen (drücken Enter), werden alle alten Kernel sichtbar und stehen zum Booten zur Verfügung.

GNU GRUB Frühere Versionen

So löschen Sie ältere Kernel dauerhaft

Starten Sie zuerst mit dem neuesten verfügbaren Kernel.

Es gibt verschiedene Möglichkeiten, alte Kernel zu löschen. Persönlich würde ich Computer Janitor nicht berühren, da dies anerkanntermaßen Ihren Computer mit seinen Vorschlägen kaputt macht.

synaptisch

Eine Alternative ist Synaptic ( sudo apt install synaptic)

suche nach linux-image , klicke mit der rechten Maustaste auf einen Kernel und wähle "Vollständige Entfernung" und klicke schließlich auf " Übernehmen" , um den Kernel zu löschen.

Synaptic Package Manager

Wiederholen Sie die Suche, aber diesmal für Linux-Header - Sie können die zugehörigen Header für das zuvor ausgewählte Kernel-Image löschen.

Synaptic wird jedoch nicht versuchen zu überprüfen, was Sie entfernen möchten ... Sie könnten versehentlich Ihren neuesten Kernel löschen - oder sogar alle Ihre Kernel über dieses Tool löschen, so dass Sie ein nicht mehr bootfähiges Ubuntu haben !

Denken Sie daran, zu überprüfen, welchen Kernel Sie verwenden:

uname -r

Das Ergebnis wäre ähnlich wie:

Terminal <uname -r>

Merken Sie sich das Ergebnis und die Zahl - stellen Sie sicher, dass Sie das entsprechende Bild oder die Kopfzeile nicht löschen.

Empfehlung

Meine Empfehlung ist, mindestens zwei oder vorzugsweise drei Kernel, einschließlich des neuesten, beizubehalten. Der Grund für die Empfehlung ist, dass Sie mindestens einen oder zwei andere Kernel zum Booten haben, wenn der neueste Kernel, mit dem Sie booten können, aus irgendeinem Grund nicht booten kann oder eine regressive Funktion einführt, z.


3
Das Entfernen alter "linux-image *" -Pakete mit synaptic funktionierte auch mit 10.04. (Ich erwähne es, weil der Titel andeutet, dass es nur für 11.10 und
höher sein

4
Der -ySchalter am Ende der apt-getZeile ist notwendig, ansonsten fragt apt-get nur nach Bestätigung und da die Eingabe eine Pipe ist, bricht es einfach ab. Also sollte es enden in:| xargs sudo apt-get purge -y
Josh

37
Entfernen von ca. 20 Versionen von alten linux-imageund linux-headersfreigegebenen 4,5 GB Speicherplatz auf meinem Computer.
Andrew Mao

16
Diese Methode funktioniert gut, aber das Löschen jedes Kernels regeneriert grub.cfg übermäßig, was einige Zeit in Anspruch nimmt. Gibt es eine Möglichkeit, dies für das Löschen von Stapeln zu deaktivieren und dann einmal neu zu generieren?
Spaceriver

15
Ich schließe mich der Frage von @spacediver an - dies ist ein verrückter, langsamer Prozess, wenn Sie 38 nicht benötigte Kernel haben, da bei jeder Deinstallation alle verbleibenden durchlaufen werden, während eine neue grub.cfg generiert wird. Das nennen wir eine N ^ 2-Operation - sie verarbeitet einen Kernel ungefähr (38 ^ 2/2) = 722-mal und ist sehr langsam. Sicherlich kann sich Ubuntu etwas Besseres
einfallen lassen

385

Starten Sie zuerst Ihr System neu, um sicherzustellen, dass es den neuesten Kernel verwendet. Dann öffne das Terminal und überprüfe deinen aktuellen Kernel:

uname -r 

ENTFERNEN SIE DIESEN KERN NICHT!

Geben Sie anschließend den folgenden Befehl ein, um alle auf Ihrem System installierten Kernel anzuzeigen / aufzulisten.

dpkg --list 'linux-image-*'

Finden Sie alle Kernel, die niedriger sind als Ihr aktueller Kernel. Wenn Sie wissen, welchen Kernel Sie entfernen müssen, fahren Sie unten fort, um ihn zu entfernen. Führen Sie die folgenden Befehle aus, um den ausgewählten Kernel zu entfernen.

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

Führen Sie abschließend die folgenden Befehle aus, um grub2 zu aktualisieren

sudo update-grub2 

Starten Sie Ihr System neu.


34
Als ich dies in 10.04 und 12.04 tat, stellte ich fest, dass update-grub während des Löschvorgangs automatisch ausgeführt wurde.
Aidan

93
bash Klammer Erweiterung kann verwendet werden, zB sudo apt-get purge linux-image-3.2.0-3{0..5}-generic(entfernt 30,31, .., 35)
ajo

12
Das System muss danach nicht neu gestartet werden. In der Tat, sollten Sie das System neu starten , bevor Sie diese Schritte ausführen, um sicherzustellen , dass Sie die neueste Kernel - Version verwenden , die Sie wahrscheinlich gerade heruntergeladen und installiert haben (Sie haben ein apt-get update && apt-get upgrade vor diesem, oder ??)
Ricket

4
Möglicherweise möchten Sie auch die linux-signed-imagePakete deinstallieren, die möglicherweise auf UEFI-Systemen installiert sind. Dabei werden sudo apt-get purge linux-signed-image-3.11.0-{12,14,24}-generic12, 14 und 24
devius

1
@jarno Ich weiß nicht, ob ich einen signierten Kernel verwende oder nicht, habe aber uname -rkeinen signedString auf meinem System. Ich scheine ein signiertes Bild installiert zu sein und der Ausgang dieses lsBefehls lautet: /boot/vmlinuz-3.19.0-16-generic.efi.signed.
Devius

283

Mein Einzeiler, um alte Kernel zu entfernen (das macht auch Speicherplatz frei)

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

Erläuterung (Denken Sie daran, dass |die Ausgabe des vorherigen Befehls als Eingabe für die nächste verwendet wird.)

  • dpkg --list listet alle installierten Pakete auf
  • grep linux-image sucht nach den installierten Linux-Images
  • awk '{ print $2 }' gibt nur die 2. Spalte aus (das ist der Paketname)
  • sort -V Ordnet die Elemente nach Versionsnummer
  • sed -n '/'`uname -r`'/q;p' druckt die Zeilen vor dem aktuellen Kernel
  • xargs sudo apt-get -y purge Bereinigt die gefundenen Kernel

sedAufruf abwickeln :

  • -nsagt sedleise zu sein
  • `uname -r` gibt das aktuell installierte Kernel-Release aus - wir nehmen es in die Backticks auf, damit die Ausgabe als Teil des Befehls enthalten ist (dies könnte auch so aussehen) $(uname -r)
  • /something/qsagt stop, wenn Sie 'irgendetwas' finden (in diesem Fall wird etwas ausgegeben uname -r) - der /Surround ein regulärer Ausdruck
  • p ist drucken
  • Das ;ist der Befehl "separtor", also " /something/q;pquit", wenn Sie etwas finden, sonst "print"

Insgesamt werden sed -n '/'`uname -r`'/q;p'die Zeilen gedruckt, bis sie mit dem aktuellen Kernelnamen übereinstimmen.

Wenn Sie paranoid sind (wie ich), können Sie den letzten Teil xargs echo sudo apt-get -y purgeso gestalten, dass der Befehl zum Löschen der alten Kernel gedruckt wird. Sie können dann überprüfen, ob nichts Unerwartetes enthalten ist, bevor Sie ihn ausführen.


Geänderte Version zum Entfernen von Headern:

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

Hinweis: Der sedAufruf wird geändert. "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"extrahiert nur die version (zB "3.2.0-44"), ohne "-generic" oder ähnliches ausuname -r


All-in-One-Version zum Entfernen von Bildern und Kopfzeilen (kombiniert die beiden obigen Versionen):

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
Beachten Sie, dass es ein bisschen gefährlich ist, die aktuelle Kernelversion als regulären Ausdruck wie folgt abzugleichen: Punkte stimmen mit jedem Zeichen überein und 3.1.2-23 stimmt mit 3.1.2-2 überein (oder ist es andersherum). Siehe auch meine Antwort .
jarno

19
Hier ist eine optimierte All-in-One-Version: 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)Siehe auch meine Antwort .
jarno

1
@jarno das hat mir sehr geholfen ... Ein
dickes Lob

5
Aufgrund nicht erfüllter Abhängigkeiten musste ich es dkpg -Pstattdessen mit verwenden. Hier ist die Vollversion: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
TUN SIE DAS NICHT! "Dieser Oneliner sieht ein bisschen gefährlich aus, aber sicher können sich 220 Upvoter nicht irren!" Dachte ich mir und kopierte blind. Neu gestartet, direkt zu GRUB. Dieser Befehl löschte alle meine Kernel, einschließlich des von mir verwendeten. Vielleicht habe ich einen Echtzeit-Kernel ausgeführt, kann mich aber nicht erinnern. Momentan suche ich in meinem Haus nach einem USB-Stick, auf dem ich Ubuntu Live CD installieren kann :(
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 und niedriger:

Ich finde das der einfachste und schnellste Weg. Es enthält den neuesten Kernel sowie zwei weitere:

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

So ändern Sie die Anzahl der zusätzlichen Kernel, die beibehalten werden:

sudo purge-old-kernels --keep 3

1
Dieser Befehl ist ein Shell-Skript, dessen Position Sie finden können which purge-old-kernels.
jarno

Ich bin froh, dass sie das im 16.04 viel einfacher gemacht haben! Hoffe, diese Antwort hält seinen Weg nach oben ...
Toby J

Unter Ubuntu 16.04 habe ich purge-old-kernelskein Fahrrad-Paket ( zufällige nützliche Tools, die noch kein permanentes Zuhause haben ) oder ein bestimmtes Paket. Die Verwendung von apt-get -yOptionen ist wie das Schließen der Augen und das Hoffen, dass alles in Ordnung kommt. Auch hier ist es wie autoremove entscheidet , wie viele alte Kernel zu halten.
Pablo A

2
In 16.04 wird purge-old-kernels vom byobu-Paket bereitgestellt (hint:) apt-file search purge-old-kernels. Einverstanden apt-get -y, ich werde es entfernen.
Bmaupin

1
@Dan Da ich keine Nicht-LTS-Versionen verwende, war ich mir nicht sicher, wann es gestartet wurde. Aber ich kann mit Sicherheit sagen, dass sudo apt-get autoremoveKernel in 14.04 nicht entfernt werden. Fühlen Sie sich frei, die Antwort mit der spezifischen Version zu aktualisieren, wenn Sie wissen, was es ist!
Bmaupin

43

Entfernen von Einträgen aus Grub 2 Einträge sollten durch Bearbeiten oder Entfernen von Dateien im Ordner /etc/grub.d entfernt werden. Die Datei /boot/grub/grub.cfg ist schreibgeschützt und sollte normalerweise nicht bearbeitet werden müssen.

Zu viele Kerne?

  • Wenn Sie sich nicht sicher sind, welchen Kernel Sie gerade verwenden, geben Sie in einem Terminal uname -r ein .

  • Über APT entfernte Kernel (Synaptic, "apt-get remove" usw.) aktualisieren die Datei grub.cfg automatisch, und es ist keine Benutzeraktion erforderlich.

  • Ein großartiges Tool zum Entfernen von Kerneln (und Menüeinträgen) ist Ubuntu-Tweak, eine sichere und benutzerfreundliche GUI-App.

  • Installieren Sie Ubuntu Tweak

  • Ubuntu-Tweak ist unter Programme> Systemprogramme verfügbar.

Entfernen Sie ältere Kernel-Einträge

  • Wählen Sie links "Package Cleaner" und rechts "Clean Kernel".

  • Klicken Sie auf die Schaltfläche "Entsperren" unten rechts und geben Sie Ihr Passwort ein.

  • Wählen Sie aus der angezeigten Liste die Kernel-Images und Header aus, die Sie entfernen möchten. Der verwendete Kernel ist nicht aufgeführt.

  • Klicken Sie auf die Schaltfläche "Aufräumen" unten rechts, um die ausgewählten Kernel-Images und -Header zu entfernen.

Entfernen Sie die Betriebssysteme aus dem Grub-Menü

  • Andere Betriebssysteme, die vom Computer entfernt wurden, werden ebenfalls aus dem Menü entfernt, sobald "update-grub" als root ausgeführt wird.

  • Menüelemente werden durch Skripte im Grub2-Menü platziert. Wenn Sie nicht möchten, dass andere Betriebssysteme in das Menü eingegeben werden, deaktivieren Sie /etc/grub.d/30_osprober

  • Führen Sie diesen Befehl aus, um die Ausführung des Skripts zu stoppen
    sudo chmod -x /etc/grub.d/30_os-prober

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

Entfernen Sie Memtest86 + aus dem Grub-Menü
sudo chmod -x /etc/grub.d/20_memtest86+

  • Führen Sie den Befehl update-grub aus, damit die Änderungen in grub.cfg übernommen werden können

Quelle

Hinweis: Nach der Aktualisierung des Kernels wird dem GRUB-Menü ein neuer Eintrag hinzugefügt. Sie können den älteren entfernen, wenn Sie möchten. Die erfahrensten Benutzer raten Ihnen jedoch, mindestens einen freien Eintrag aufzubewahren, falls bei einem Upgrade und Ihnen etwas schief geht müssen eine ältere Kernel-Version zur Fehlerbehebung booten.

Alternative Methode zum Entfernen von Kernel-Einträgen (vor 10.04)

für GRUB nicht GRUB2

Start-Manager Installieren Sie den Startup Manager

Sie finden es unter System >> Administration >> Alt-Text
Alt-Text
Sie sehen im zweiten Screenshot, wie viele Kernel Sie anzeigen können? Ich behalte es im Allgemeinen nur auf 1, aber wenn ich ein Kernel-Upgrade erhalte, ändere ich es immer auf 2, bevor ich neu starte, damit ich den älteren Kernel auswählen kann, wenn der neue Kernel Probleme mit meiner Hardware hat. Sobald ich weiß, dass der neue Kernel gut funktioniert, ändere ich ihn auf 1 zurück.


2
Tatsächlich gibt mir der Startupmanager unter Ubuntu 10.04 ein Fenster wie dieses, stattdessen gibt es nur ein Fenster mit zwei Registerkarten -> Boot-Optionen und Erweitert. In Erweitert gibt es die Möglichkeit, die Anzahl der Kernel zu begrenzen. Bitte aktualisiere die Antwort für Ubuntu 10.04. (Und deshalb habe ich das hier runtergestimmt.)
Sen

Können Sie sich vorstellen, wie die Anzahl der beizubehaltenden Kernel auf einem Computer definiert werden kann, auf dem keine grafische Benutzeroberfläche (Server) installiert ist?
Sylvainulg

Startup Manager ist veraltet. Siehe grup-customizer
muhasturk

39

Rein auf der Kommandozeile entfernt dies alle bis auf den aktuellen und zweithäufigsten Strom (über das "-2" im Kopfbefehl unten):

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
Einzeiler von dort :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, Sie sollten dies als neue Antwort hinzufügen.
Saji89

10
@DmitryPaskal Kopieren Sie diese wie immer nicht, ohne sie zu verstehen. Auf meiner Maschine passt auch dieser Einzeiler, linux-libc-dev:amd64der nicht entfernt werden sollte.
Jamesadney

1
@Kees Cook, sollte das awk-Argument nicht nur in einfache Anführungszeichen gesetzt werden? Wenn Sie beabsichtigen, "linux-image-" den Pipe-Zeilen voranzustellen, scheint dies nur zu funktionieren, wenn Sie verwenden awk '{print "linux-image-" $0}'.
Mark

Dies funktioniert nicht für mich, es enthält meinen benutzerdefinierten Kernel (Ubuntu 14.04 mit 3.17)
Alex R

35

Update: purge-old-kernelsist heutzutage veraltet .

Ich habe ein Skript erstellt, um Kernel auch unter schwierigen Bedingungen zu bereinigen. Es heißt linux-purgeund Sie finden es hier .

Wenn Sie nur die Kernel (und die zugehörigen Pakete) löschen möchten, die älter als der aktuell verwendete Kernel sind, können Sie dieses Skript verwenden, wenn das System nicht kaputt ist .

Es gibt auch eine Ubuntu-Dokumentationsseite, an der ich mitgewirkt habe, um alte Kernel hier zu entfernen .


Sieht so aus, als wäre purge-old-kernelses nicht in der genauen Version (1.22) von Bikeshed. Gibt es einen vernünftigen / sicheren Weg, um ein aktuelles Fahrrad zu bekommen? Oder wäre es einfacher / sicherer, nur das Skript zu installieren? Ich würde es jedoch vorziehen, ein Repo zu verwenden, trotz der langen Liste von Abhängigkeiten.
Drevicko

1
@drevicko Siehe hier .
jarno

1
@ drevicko, na klar,dlocate -lsbin bikeshed
jarno

1
@ Drevicko, siehe auch eine andere Frage
jarno

1
@ ChrisW ja gibt es. Ich habe das Skript nur geringfügig verbessert, daher ist es am besten, die neueste Version zu verwenden.
Jarno

29

Sie können die folgen Mit dem „unbeaufsichtigt-Upgrades“ -Paket Abschnitt der automatischen Sicherheits - Updates Artikel auf Ubuntu Wiki dies auszuführen.

Sie müssen die folgende Zeile in der Datei /etc/apt/apt.conf.d/50unattended-upgrades ändern .

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

mit

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

um alte Pakete, einschließlich Kernel, automatisch zu entfernen.

Entfernen oder kommentieren Sie auch die Zeile

"^linux-image.*"; 

im Abschnitt "NeverAutoRemove" der Datei /etc/apt/apt.conf.d/01autoremove.


2
Ich tat dies, aber es sammelte immer noch 3+ alte Kernel, die 100 MB verbrauchten. Also habe ich apt-get autoremovemeinen täglichen Cron-Job erweitert, der die Upgrades ausführt, da er nicht immer den eingebauten Update-Manager durchläuft.
Marcos

Ich denke, dass dies in Trusty nur für die automatisch installierten Kernel funktioniert.
Jarno

Dies ist ideal, um zu verhindern, dass beim automatischen Upgrade von Paketen, z. B. bei unbeaufsichtigten Upgrades, alte Kernel entstehen. Wenn Sie jedoch nicht neu starten, wurde möglicherweise das Paket für den aktuell ausgeführten Kernel deinstalliert! Ein Problem, das dies verursachen kann: Neue Geräte, die Sie anschließen, funktionieren möglicherweise nicht, da das entsprechende Modul nicht im laufenden Betrieb geladen werden kann, da es sich nicht mehr auf Ihrer Festplatte befindet. (Eine schnelle Lösung besteht darin, das Kernel-Paket erneut zu installieren und dann das Gerät vom Computer zu trennen und erneut zu verbinden.)
joeytwiddle

Ich habe eine automatisierte Lösung für das oben genannte Problem erstellt. Wenn Sie der Meinung sind, dass dies ein guter Ansatz ist, können Sie ihn zu Qwertys Antwort hinzufügen.
Joeytwiddle

27

Der schnellste / einfachste Weg (Anwendbar mindestens seit 12.04), der mit Ubuntu schon möglich ist apt-get. Führen Sie die folgenden Schritte aus, um alle nicht verwendeten älteren Kernel-Versionen zu entfernen (mit Ausnahme der vorherigen, die Sie nicht verwenden). Damit stellen Sie sicher, dass Sie einen Ausweg haben, wenn die aktuelle Kernel-Version ausfällt zurück zu einem früheren Zustand). Mach Folgendes:

sudo apt-get autoclean

Dadurch werden alle alten Dateien (einschließlich der Kernel-Versionen) entfernt, die Sie möglicherweise haben. Beachten Sie, dass es eine Weile dauern wird, bis Sie viele alte Versionen haben, da sichergestellt werden muss, dass das Entfernen der Kernel-Version keine Probleme verursacht. Für mich hat das Entfernen der letzten 12 Kernelversionen ungefähr 2 Minuten gedauert. Sie können auch Folgendes tun:

sudo apt-get clean

Damit werden alle heruntergeladenen und im Cache-Ordner von apt gespeicherten Daten gelöscht. Zuletzt haben Sie:

sudo apt-get autoremove

Diese prüft, ob nicht verwendete Pakete vorhanden sind und entfernt sie gegebenenfalls. Dies ist ideal für Bibliotheken und Abhängigkeitspakete, die von keiner installierten App mehr benötigt werden.


1
Ich nehme an, dass sich dies in neueren Releases geändert hat, da dies in 14.04 lediglich den Paket-Cache bereinigt und sich nicht auf installierte Pakete oder Grub auswirkt.
jarno

2
Ich kann bestätigen, dass sudo apt-get autoremovealte (vor mehr als einer Version) Kernel in 14.04 entfernt werden. Möglicherweise müssen Sie es vor und nach dem Upgrade Ihres Kernels ausführen. Als ich vor dem Upgrade lief, wurde nur die generische Version des alten Kernels entfernt. Nach dem Upgrade meines Kernels wurde auch die Version mit geringer Latenz des alten Kernels entfernt.
tekNorah

Ich meinte den sudo apt-get autocleanBefehl. @tekNorah Ich habe ein paar ältere Kernel installiert und lief danach sudo apt-get autoremovein Ubuntu Studio 14.04. Es wurden keine Kernel entfernt. Ich habe nur Kernel mit geringer Latenz installiert. Warum haben Sie sowohl generische als auch langsame Kernel installiert?
jarno

5
Ja, das hat bei mir wunderbar funktioniert, alle alten Kernel richtig aufgeräumt und ist nicht auf verrückte einzeilige Skripte angewiesen! Empfohlen, ich wünschte, ich könnte dies mehr als einmal stimmen!
Jeff Atwood

1
@ JeffAtwood Nun, es könnte mehr Kernel entfernen, die sicher sind. Siehe Fehlerbericht
jarno

25

10.04 GUI-Methode

Computer Janitor kann alte Kernel bereinigen und ist meines Erachtens standardmäßig in Ubuntu (aber nicht Kubuntu) installiert.

In GRUB 1 können Sie /boot/grub/menu.lstfestlegen, wie viele Kernel maximal angezeigt werden sollen. GRUB 2, soweit ich das beurteilen kann, nicht.


4
Der Computer Janitor sollte nicht verwendet werden - er ist fehlerhaft und wurde jetzt als Standardanwendung in natty / oneiric / precision abgelegt.
fossfreedom

2
Installieren Sie stattdessen "Ubuntu Tweak" wie in einer anderen Antwort beschrieben (eigene ppa), die einen eigenen "Computer-Janitor" hat (nicht zu verwechseln mit dem "Computer-Janitor", der vorübergehend in älteren Ubuntu-Versionen verfügbar war)
michael

25

Um herauszufinden, welche Kernel und Header installiert sind, verwenden Sie

dpkg -l | grep linux-image

dpkg -l | grep linux-headers

Sie können sie dann einzeln oder zusammen entfernen. Achten Sie lediglich darauf, die neueste Version beizubehalten.

Es gibt auch einige nützliche Befehle und Skripte, um das Entfernen zu automatisieren.

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

Die folgenden Ansprüche, um alle nicht verwendeten Kernel und Header zu entfernen:

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

(verwenden apt-get -y, um ohne Frage zu entfernen)

Folgendes passiert, wenn am 18.04.1 ausgeführt wird:

~$ 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

Das Skript, das Sie im Forum gefunden haben, ist fehlerhaft. Möglicherweise werden einige der gewünschten Header-Pakete nicht entfernt (falls Sie einen alten -pae-Kernel verwenden). Andererseits werden möglicherweise auch einige Pakete entfernt, die Sie behalten möchten.
Jarno

Danke für den Kommentar. Das Skript ist möglicherweise nicht perfekt, ich verwende es jedoch seit Jahren, hauptsächlich auf 12.04 und 14.04, 32 und 64 Bit, und habe keine Probleme gehabt. ... und ja, linux-libc-devist installiert.
Mikewhatever

Ich nehme an, die Versionsnummer linux-libc-devstimmt mit der Versionsnummer des aktuellen Kernels überein. Hier dpkg -l linux-libc-dev | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'druckt linux-libc-dev: amd64
jarno

Ich kann Ihre Ergebnisse immer noch nicht reproduzieren. Um jedoch auf der sicheren Seite zu sein, habe ich den Befehl durch Hinzufügen eines zusätzlichen Filters geändert grep -E "(image|headers)".
mikewhatever

1
Versuchen Sie zuerst ohne die -yFlagge mit Spülung bitte ..!
danger89

16

Um ältere Linux-Image-Kernel zu entfernen, starten Sie zuerst den Kernel, den Sie behalten möchten.

Sie können die Kernel-Version auch mit dem Befehl überprüfen, uname -rdamit Sie nicht versehentlich die falsche Version entfernen.

Gehen Sie nun zum Synaptic Package Manager und suchen Sie nach linux-imageälteren Versionen und entfernen Sie diese, mit Ausnahme der vom oberen Befehl angezeigten. Im Allgemeinen bevorzuge ich die neueste.

Wenn Sie jetzt neu starten, sehen Sie ein saubereres Menü.


Dies ist wahrscheinlich die grundlegendste Methode für Benutzer, die ohne Computer Janitor installiert haben.
Broam

1
Ab Ubuntu 11.04 zeigt das Grub-Menü standardmäßig nur den aktuellen Kernel an, ältere Kernel werden im Menü 'Vorherige Kernel' ausgeblendet. Diese Methode kann weiterhin zum Entfernen älterer Dateien verwendet werden.
Andy

14

Sie könnten Ubuntu-Tweak installieren und dann zu Anwendungen -> System-Tool -> Ubuntu-Tweak und wechseln

Bildbeschreibung hier eingebenKlicken Sie auf Paketbereinigung und bereinigen Sie die Kernel. Der aktuell verwendete Kernel wird nicht angezeigt, sodass Sie immer auf der sicheren Seite sind.


8

Persönlich benutze ich gerne Synaptic. Dadurch fühle ich mich sicherer, was los ist. Die einzige App, mit der ich alte Kernel entfernen kann, ist Ubuntu Tweak .

So entfernen Sie die nicht verwendeten Kernel:

  • Öffnen Sie UbuntuTweak
  • Klicken Sie im linken Bereich unter "Anwendungen" auf "Paketbereinigung"
  • Klicken Sie auf der rechten Seite der Reinigungsansicht auf "Clean Kernels".
  • Alle Kernel auswählen - Ich denke, der verwendete Kernel ist nicht aufgeführt, aber nur für den Fall, dass die Ausführung uname -ain einem Terminal überprüft wird

In Synaptic können Sie nach 'Komponenten' -> 'Kernel und Module' filtern, die alle Kernel enthalten. Sortieren Sie nach der ersten Spalte: 'S' (Status), damit alle installierten Kernel oben angezeigt werden. In der Tat update-grubwird geraten.
danger89

6

Sie können die alten Kernel ( linux-image-...Pakete) mit Synaptic deinstallieren. Dadurch werden sie aus dem Boot-Menü entfernt. Achten Sie darauf, den laufenden Kernel nicht zu entfernen (Sie können seine Version mit überprüfen uname -r).

Denken Sie daran, dass ein oder zwei ältere Versionen Ihnen bei der Fehlersuche helfen können, falls etwas schief geht.

Alternativ können Sie die Einträge manuell bearbeiten / entfernen ( gksu gedit /boot/grub/grub.cfg), sie werden jedoch neu generiert, wenn Sie auf einen neueren Kernel aktualisieren. Wenn Sie recovery modeOptionen entfernen möchten, tun Sie dies nicht. Sie können nützlich sein, wenn Sie etwas kaputt machen, das Sie am Booten hindert.


Siehe diese Seite.


Grub2 erstellt seinen Grub-Eintrag jetzt jedes Mal, wenn ein neuer Kernel installiert wird. mit update-grubdem alle diese kerne neu geschrieben werden.
Marco Ceppi

4

Dies ist eine reine Befehlszeilenlösung.

Generieren Sie zunächst eine Liste aller installierten Kernelversionen mit Ausnahme des aktuell ausgeführten Kernels:

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

Alternativ können Sie eine Liste aller installierten Kernelversionen mit Ausnahme der letzten beiden generieren:

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

Überprüfen Sie die Liste. Stellen Sie sicher, dass die Kernel-Versionen, die Sie behalten möchten, nicht in der Liste enthalten sind. Verwenden Sie den Befehl uname -r, um die Version des aktuell ausgeführten Kernels anzuzeigen.

Wenn Sie mit den Ergebnissen zufrieden sind, können Sie apt-getdie Pakete entfernen.

Zuerst ein Probelauf (am Beispiel des ersten Generators):

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)))

Dann ein echter Lauf:

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)))

Wenn Sie den Prozess automatisieren möchten, fügen Sie den --yesParameter hinzu:

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

@jarno Ich freue mich über Ihre Bemühungen, meine Befehlszeile zu kombinieren und zu optimieren. Ich habe Ihre Befehlszeile entfernt, weil ich Lesbarkeit und Einfachheit bevorzuge. Ich habe meinen Befehl bewusst auf Lesbarkeit und Einfachheit zugeschnitten. Zumindest lesbar und einfach für mein Gehirn. Bitte posten Sie Ihre Kommandozeile als Kommentar oder in Ihrer eigenen Antwort.
Lesmana

1
Dies kombiniert zwei Ziele: Behalten Sie die letzten beiden Kernel bei und halten Sie die Kernel neuer als die aktuellen 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/.*/-&($|-)/'). Es ist nicht erforderlich, dpkg-queryda apt-getreguläre Ausdrücke verarbeitet werden können. Bitte beachten Sie, wie ich Punkte maskiere und Präfix und Suffix in den regulären Ausdruck einfüge. Wenn Sie das Skript in meiner eigenen Antwort verwenden , können Sie auch einige Kernel behalten, die älter als der aktuelle sind.
jarno

4

Der Vorteil dieser Antwort ist, dass natives Ubuntu Bash verwendet wird, ohne Anwendungen von Drittanbietern zu installieren. Benutzer von benutzerdefinierten Kerneln, die dieses Bash-Skript nicht verwendet haben aptoder nicht dpkgentsprechend ihren Anforderungen ändern können. Diese Antwort basiert auf ( Wie man selektiv alte Kernel auf einmal löscht ).

Zenity-basierte Lösung

Zenity bietet eine schöne GUI-Oberfläche für das Terminal, um eine Liste zu verarbeiten und Elemente mit Optionsfeldern auszuwählen :

rm-kerne 1

Wie der Titel zeigt, kann der aktuelle Kernel, mit dem Sie gebootet haben, nicht entfernt werden und ist nicht in der Liste enthalten. Die angegebene Größe gibt an, wie viel im /bootVerzeichnis gespeichert wird . Auf Ihrer Festplatte wird mehr gespeichert, da sich die Kernel-Binärdateien auch in anderen Bereichen befinden. 27. Juli 2017 Hinweis: Die Verzeichnisse /usr/src/*kernel_version*und /lib/modules/*kernel_version*sind nun ebenfalls enthalten.

Das Änderungsdatum wird mit dem statBefehl ermittelt. Auf meinem System wird dieses Datum jedes Mal "berührt", wenn der Kernel mit diesem cron- Neustart-Skript gebootet wird ( Wie erfahren Sie, wann eine bestimmte Kernel-Version zuletzt gebootet wurde? ) . Auf Ihrem System ist das Datum jedoch das Veröffentlichungsdatum des Kernels und nicht das Datum, an dem Sie ihn zuletzt gestartet haben.

apt-get purge gibt Ihnen die Möglichkeit abzubrechen

Sie haben die letzte Möglichkeit, alles anzuzeigen, was gelöscht werden soll, und den gesamten (etwas irreführenden) Speicherplatz anzuzeigen, der wiederhergestellt werden soll:

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] 

Der Code

Kopieren Sie diesen Code in eine ausführbare Datei mit dem Namen rm-kernelsin /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

HINWEIS: Sie benötigen die Berechtigung sudo, um die Datei zu erstellen. Verwenden Sie dazu:

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

So machen Sie die Datei ausführbar:

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

Serverversion

rm-kernels-serverist die Serverversion, mit der Kernel auf einmal selektiv gelöscht werden können. Anstelle eines GUI-Dialogfelds (grafisches Dialogfeld) wird ein textbasiertes Dialogfeld zum Auswählen der zu löschenden Kernel verwendet.

  • Vor dem Ausführen des Skripts müssen Sie die Dialogfunktion folgendermaßen installieren :

    sudo apt install dialog

Das Dialogfeld befindet sich in der Standardinstallation von Ubuntu Desktop, jedoch nicht in Ubuntu Server.

Beispielbildschirm

rm-kernels-server 1

rm-kernels-server Bash-Code

#!/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

HINWEIS: Im Aufruf an dialogdie Direktive --ascii-lineswird der erweiterte Zeichensatz (der sshnicht gefällt) durch "+ ----- +" zum Zeichnen von Feldern ersetzt. Wenn Ihnen dieses Erscheinungsbild nicht gefällt, können Sie die --no-linesDirektive für kein Kästchen verwenden.


Updates vom 28. Juli 2017

Die berechnete Größe jedes Kernels wurde aus /boot/*kernel_version*5 Dateien mit insgesamt ~ 50 MB entnommen . Die Formel wurde geändert, um die Dateien in /usr/src/*kernel_version*und aufzunehmen /lib/modules/*kernel_version*. Die berechnete Größe für jeden Kernel beträgt jetzt ~ 400 MB. Der obige Code für rm-kernelsund rm-kernels-serverwurde aktualisiert. In den obigen Beispielbildschirmen sind diese Änderungen jedoch noch nicht enthalten.

Standardmäßig wird die Dateigröße für Linux-Header auf 125 MB und für Linux-Image auf 220 MB geschätzt, da dudies schmerzhaft langsam sein kann, sofern sich keine Dateien im Cache befinden. Um die tatsächliche Größe zu ermitteln, duübergeben Sie einen beliebigen Parameter an das Skript.

Die Gesamtsumme aller Kernelgrößen (mit Ausnahme der aktuell ausgeführten Version, die nicht entfernt werden kann) wird jetzt in der Titelleiste angezeigt.

Das Dialogfeld, in dem das letzte Zugriffsdatum jedes Kernels angezeigt wird . Dieses Datum kann bei Backups oder ähnlichen Vorgängen für alle Kernel überschrieben werden. Das Dialogfeld zeigt jetzt stattdessen das Änderungsdatum an .


2

Eine einfache Möglichkeit, fast alle veralteten Pakete, Pakete, die nicht mehr in einer Paketliste enthalten sind, sowie veraltete Kernel zu entfernen, besteht darin, einen der folgenden Schritte auszuführen:

dpkg --purge $(aptitude search ?obsolete)

Hierdurch werden jedoch Pakete übersehen, die noch von anderen Paketen empfohlen werden, und das Argument -R / - without-recommends löst dieses Problem nicht.

dWählen Sie nach dem Umschalten des Sortiermodus mit 'o', um alle veralteten Pakete anzuzeigen, einschließlich derjenigen, bei denen die Eignung fehlt. Einige Benutzer verwenden sie jedoch nicht gern.


Der angegebene Befehl löscht nach meiner Erfahrung weder alte Kernel noch beeinflusst er das Grub-Menü.
jarno

2

Die akzeptierte Antwort, die verwendet wird sed, um ältere Kernel dauerhaft zu entfernen, weist einige Fehler auf. Wenn jemand den Computer nach dem Upgrade des Kernels nicht neu gestartet hat, entfernt der Befehl auch den neueren Kernel.

Hier ist eine alternative Lösung, die alle Situationen berücksichtigt, um nur ältere Kernel zu entfernen:

#!/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

Wenn Sie eine neuere Version als die aktuelle haben, erhalten Sie eine Warnung, dass Sie den Computer zuerst neu starten müssen. Beachten Sie auch, dass die älteren Kernel aus einem guten Grund erhalten bleiben. Wenn Sie Ihren aktuellen Kernel irgendwie durcheinander bringen und Ihr System instabil machen, sollten Sie in der Lage sein, einen älteren Kernel zu booten.


Dadurch werden keine Kernel mit niedriger Latenz oder Kernel mit einem anderen Geschmack als dem von Generika entfernt.
jarno

Ich nehme an, Sie beziehen sich auf diese sed Lösungen.
jarno

@jarno: Wie wäre es mit Ersetzen grep -Po "^linux-image-[^-]+-[^-]+-generic\b"mit grep -Eo "^linux-(image|headers|tools)-[^-]+-[^-]+(|-generic)\s" | sed -e "s/\s//g"und grep -Po ".*(?=-[a-z]*$)"mit grep -Eo "^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"und grep -Po "[0-9].*(?=-[a-z]*)"mit grep -Eo "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"?
Sadi

@Sadi, wel, ich würde auch keine Kernel mit niedriger Latenz finden.
Jarno

1
Vielen Dank. Andere Methoden haben bei mir nicht funktioniert. Ihre hat den Job gemacht.
Philippe Delteil

1

ailurus hat die Funktion, alte Kernel sowie nicht verwendete Konfigurationen zu entfernen. Ich persönlich entferne es manuell von synaptic. Sie können ailurus sowohl von getdeb als auch von ppa aus installieren


"Ailurus ist ein Tool zum Sichern einer Namensliste installierter Software. ... In der Vergangenheit hat Ailurus viele Funktionen. Jetzt hat es nur noch eine Funktion. Ich denke, eine wirklich nützliche Funktion ist besser als Dutzende weniger nützliche Funktionen."
jarno

1

Ich habe ein Skript dafür, das nicht sehr ausgefallene String-Analyse benötigt.

Entfernen Sie Überschriften und Bilder mit Ausnahme der aktuellen, um Speicherplatz freizugeben

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

Sie können ukuu - es ist alles GUI - verwenden, um alte Kernel zu aktualisieren und zu löschen. Funktioniert bei mir!

Denken Sie daran, lassen Sie die letzten 2 installiert und natürlich den "laufenden" Kernel.

Sie können ukuu auch so einstellen, dass nur Hauptversionen, sogar RC-Kernel, angezeigt werden und Punktversionen ausgeblendet werden.

ukuu

Sie finden ukuu in Synaptic, oder Anweisungen finden Sie hier:

OMG! Ubuntu ukuu Installationsanweisungen


1

Basierend auf einer früheren Antwort von David Kemp werden im folgenden Skript alle Überschriften und Bilder mit Ausnahme der letzten beiden Versionen gelöscht.

#!/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

(verwenden apt-get -y, um ohne Frage zu entfernen)


Gibt es einen Grund, warum dies abgelehnt wurde? Hat es bei jemandem nicht geklappt? Stellen Sie beim Kopieren / Einfügen sicher, dass Sie beim Einfügen keine langen Zeilen umbrechen. Ich hatte keine Probleme damit zu arbeiten.
Mark

Die neueste Kernelversion auf meinem Computer ist 3.13.0-43-lowlatency. Dieses Skript löscht die linux-headers-3.13.0-43-lowlatency.
jarno

@jarno wie hast du das festgestellt? Um es auszuprobieren, ohne etwas zu tun, fügen Sie dem Befehl apt-get ein "-s" -Flag hinzu (oder entfernen Sie es einfach | xargs sudo apt-get -y purgeganz). Wenn es 3.13.0-43-lowlatency ausgibt, dann haben Sie vielleicht einige spätere Versionen als die, die auf Ihrem System installiert sind.
Mark

Ich habe es mit Simulation versucht. Nein, aber ich hatte einige frühere Kernel-Versionen entfernt, aber nicht gelöscht und die entsprechenden Header-Pakete gelöscht.
Jarno

Wie auch immer, ich habe ein Skript entwickelt, das auf der Idee von Sankalps Antwort basiert.
Jarno

0

Hier ist ein grober Abriss dessen, was ich getan habe. Da ich kein Linux-Experte bin, stellen Sie sicher, dass Sie wissen, was Sie tun, und alle Dateien, die Sie ändern, gesichert haben.

gedit /boot/grub/grub.cfg

Suchen Sie dann die Einträge, die Sie behalten möchten. Wir werden sie markieren und kopieren

cd /etc/grub.d
ls

Sie sehen eine Liste von Dateien wie 10_linux und 30_os-prober

sudo chmod -x 10_linux

Dadurch wird das automatische Hinzufügen aller Linux-Einträge zum Grub-Boot-Menü beendet.

gksudo gedit 40_custom

öffne die benutzerdefinierte Boot-Menü-Datei, gehe dann zurück zu grub.cfg (die noch in gedit geöffnet sein sollte) und kopiere die Einträge, die du behalten möchtest ... wie zum Beispiel

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
}

Fügen Sie sie ein 40_customund speichern Sie sie.

sudo chmod 755 40_custom

macht es ausführbar, dann aktualisieren wir endlich grub, was die Datei grub.cfg ändert:

sudo update-grub

ACHTUNG, wenn Sie Ihren Kernel oder Ihr Betriebssystem aktualisieren, wird Ihr Boot-Menü wahrscheinlich nicht aktualisiert ... Sie müssen dies manuell tun. Mit dieser Prozedur können Sie das Boot-Menü jedoch ein wenig weiter anpassen, z. B. indem Sie die Kernel-Version entfernen und einfach den Ubuntu-Namen eingeben ... z. B. Ubuntu Lucid 10.04 usw.

Hoffe, jemand findet das hilfreich, da ich eine Weile gebraucht habe, um es herauszufinden ... habe diese Lösung nirgendwo gesehen ...


3
Diese Antwort scheint übertrieben. Es ist besser, nur alte Kernel zu entfernen.
Scott Severance

Ich hatte gelesen, dass zusätzliche Kernel in Wiederherstellungssituationen nützlich sein können. Dies ist auch eine einfache Möglichkeit, den Text des Starteintrags zu bearbeiten. Anstatt "Ubuntu, Linux-Kernel xxxx-yy --text1 -text2 -t3 -t4 --t5 etc etc etc" zu sagen (wobei die --text-Einträge nur einige Optionen / Parameter bezeichnen, die ich nicht verstehe), können Sie diese ändern es zu "Ubuntu xx.yy", obwohl ich eine "{" Klammer hatte, die ich nicht loswerden konnte.
Joe

1
Ich behalte den vorherigen Kernel so lange bei, bis ich überprüft habe, dass der aktuellste Kernel ordnungsgemäß funktioniert. Wenn es funktioniert, wird es nicht aufhören zu arbeiten. Nachdem ich den letzten Kernel überprüft habe (nach ungefähr einer Woche), habe ich keinen Grund, den alten Kernel zu behalten. Wenn es nicht funktioniert, kann ich auf den neuesten bekannten Kernel zurückgreifen. Eigentlich lasse ich gerade einen alten Kernel laufen, der auf einen Showstopper-Fehler im aktuellen Kernel zurückzuführen ist. Aber das ändert nichts an meiner allgemeinen Politik. Sie benötigen nur einen bekannten guten Kernel.
Scott Severance

0

Installieren Sie den Synaptic Package Manager und wechseln Sie zur Registerkarte Filter (ich denke Filter, wenn nicht alle 5) und wählen Sie "local". Dadurch werden verwaiste Pakete auf Ihrem System angezeigt, z. B. die Kernel. Nachdem Sie sie deinstalliert haben, führen Sie sie aus update-grub. Dieser Befehl aktualisiert die Liste der Startoptionen für grub.

Wenn dies fehlschlägt, können Sie es jederzeit versuchen apt-get remove linux-image-version-generic.


In Synaptic können Sie nach 'Komponenten' -> 'Kernel und Module' filtern, die alle Kernel enthalten. Sortieren Sie nach der ersten Spalte: 'S' (Status), damit alle installierten Kernel oben angezeigt werden. In der Tat update-grubwird geraten.
danger89

0

Um etwas mehr Kontrolle darüber zu haben, welche Versionen beibehalten werden sollen, wählen Sie explizit die Versionen aus, die Sie entfernen möchten. Wenn Sie beispielsweise die Kernel-Versionen 3.2.0 entfernen möchten [49-53], verwenden Sie eine einfache forSchleife:

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

Passen Sie die Liste der Kernelversionen an.


0

Versuche dies. Führen Sie es als root aus.

Speichern Sie dieses Skript unter ./keep-n-kernels.sh

Übergeben Sie als Befehlszeilenargument die Anzahl der aktuellsten Kernel, die Sie beibehalten möchten.

    
#! / bin / bash

# pass n als Kommandozeilenargument und findet alle installierten
# Kernel und behalte nur die n neuesten => deinstalliere alle älteren

# dpkg -l 'linux- *' | sed '/ ^ ii /! d; /' "$ (uname -r | sed" s /\(.*\)-\([^ 0-9] \ + \) / \ 1 / ")" '/ d; s / ^ [^] * [^] * \ ([^] * \). * / \ 1 /; / [0-9] /! d '
# Dieser Befehl gibt die Liste aller Pakete EXCEPT für den neuesten Kernel aus.
# source: https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels

n = 1 $

# Finde die installierten Kernel-Versionen:
# dpkg-query -W -f = '$ {Version} \ n' 'Linux-Image- *' | grep. | sort -n
# gibt eine Versionsnummer in jeder Zeile an
# dpkg-query -W -f = '$ {Version} \ n' 'Linux-Image- *' | grep. | sed 's /\...$// g' | grep -v '\ ... $' | sort -u
# gibt nur diejenigen an, die in linux-image erscheinen

# Suffix, zB -generic-pae
# die Art von Kernel, in den Sie booten
Suffix = $ (uname -r | sed 's: ^ [0-9] \. [0-9] \. [0-9] \ - [0-9] \ {2 \} :: g')

command = "apt-get purge"

für Version in $ (dpkg-query -W -f = '$ {Version} \ n' 'Linux-Image- *' | grep. | sed 's /\...$// g' | grep -v ' \ ... $ '| sort -u | head -n - $ {n})
machen
    Befehl = $ {Befehl} "^ Linux-Image - $ {Version} $ {Suffix}"
getan

$ befehl

Beispielnutzung:

# ./keep-n-kernels.sh 4 # Starten Sie den Befehl apt-get, um alle bis auf die letzten 4 Kernel zu entfernen

Wenn Sie [UND AUF EIGENES RISIKO] möchten, können Sie dem Befehl apt-get ein -y (oder ein Force-Flag) hinzufügen und ihn nicht interaktiv machen.


Wenn Sie ./keep-n-kernels.sh 0 ausführen, werden alle Kernel entfernt. Das Erkennen der Suffix-Zeichenfolge funktioniert nicht. Ich denke, Suffix = $ (uname -r | sed -r 's / ^ [0-9.] * (- [0-9.] +) * //') oder Suffix = $ (uname -r | egrep - -only-matching - '- [[: alpha:] -] + $') würde ausreichen.
Jarno

Aber ich finde die Idee schön. Ich habe an der Verbesserung des Skripts gearbeitet und werde es vielleicht irgendwann hier veröffentlichen, wenn ich denke, dass es fertig genug ist.
Jarno

Bitte teilen Sie, @jarno. Ich bin froh zu wissen, dass die Idee nützlich scheint.
Sankalp

Ok, da ist es: link
jarno

0

Ich verwende einen KDE-Desktop und die einfachste Option, die ich gefunden habe, war die Verwendung der Anwendung kde-config-grub2, wie hier vorgeschlagen: https://www.kubuntuforums.net/showthread.php?58075-remove-old-linux-versions (die ich bereits zum Einstellen des Hintergrundbildes, der Standardstartoption und dergleichen installiert hatte). Neben dem Dropdown-Feld, in dem Sie den Standardeintrag auswählen können, befindet sich die Schaltfläche "Alte Einträge entfernen". Wenn Sie auf diese Schaltfläche klicken, wird eine Liste aller installierten Kernel angezeigt, und Sie können auswählen, welche entfernt werden sollen. Wenn Sie die Änderungen anwenden, werden sie mit dpkg aus dem System sowie aus dem GRUB-Menü entfernt.


0

Nur um einzuschalten, können Sie auch ausstellen

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

als root, und die Arbeit wird erledigt.


0

Wenn Sie ansible verwenden, um die Maschinen zu steuern, kann dieses Playbook hilfreich sein.

---
 - 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.