Ubuntu: Alte Kernel-Pakete löschen

Die Zeiten ändern sich.

Dieser Beitrag scheint älter als 9 Jahre zu sein – eine lange Zeit im Internet. Der Inhalt ist vielleicht veraltet.

Bei Ubuntu (und vermutlich auch bei anderen Linux-Distributionen) verbleiben nach einem apt-get update && apt-get upgrade die alten Kernel-Pakete in /usr/src/. Da diese Pakete aus unzähligen Ordnern und kleinen Dateien bestehen, kann es bei einer kleineres Festplatte (ich hab dem System hier in der VM nur 8GB zugewiesen) schnell dazu kommen, dass keine weiteren Dateien mehr auf der Festplatte gespeichert werden können, da die zur Verfügung stehenden Inodes erschöpft sind. Wenn man also mit df -h noch erkennt, dass eigentlich noch genug Festplattenplatz zur Verfügung stehen sollte, aber man trotzdem bspw. bei der Installation von Aktualisierungen die Fehlermeldung erhält, dass kein Festplattenplatz mehr da wäre, dann kann df -i Aufschluss darüber geben, ob auch noch genügend Inodes zur Verfügung stehen. Steht hier bei IUse 100%, hat man zu viele Dateien und Ordner auf der Festplatte.

Mit dem Befehl for i in /*; do echo $i; find $i | wc -l; done kann man dann herausfinden, in welchem Verzeichnis sich die Inode-Fresser befinden. Bei mir war es das /usr/ Verzeichnis. Schnell noch ein for i in /usr/*; do echo $i; find $i |wc -l; done hinterher geschickt und es war klar, dass das Verzeichnis /usr/src/ betroffen war. Ein Blick in das Verzeichnis zeigte mir, was ich auch schon vorher wusste: ungefähr 20 alte Kernel-Pakete lagen dort herum. Nun kann man die Dinger ja nicht einfach mit rm -f löschen. Auch apt-get autoremove oder apt-get remove --purge linux-image-3.13.0-## funktionierten nicht, da bei mir gleichzeitig auch noch ein Abhängigkeitsfehler aufgetreten ist. Selbstverständlich war aufgrund der Inode-Auslastung auch kein apt-get install -f möglich. So ein Fehler wurde mir angezeigt:

dpkg: error processing archive /var/cache/apt/archives/linux-headers-3.13.0-45-generic_3.13.0-45.74_all.deb
(--unpack): unable to create /usr/src/linux-headers-3.13.0-45-generic/include/config/bug.h.dpkg-new' (while processing./usr/src/linux-headers-3.13.0-45-generic/include/config/bug.h'): No space left on device
No apport report written because the error message indicates a disk full error dpkg-deb: error: subprocess paste was killed by signal (Broken pipe)

Mit folgendem Trick habe ich das Problem dann aber doch noch in den Griff bekommen:

Hinweis: Die meisten Befehle müssen mit Superuser-Rechten ausgeführt werden. Also einfach in den „Superuser-Modus“ wechseln (das geht mit sudo su -) oder dem Befehl ein sudo voranstellen.

Mit dpkg --purge war es möglich, die Pakete zu deinstallieren. Da ich aber nicht für jedes einzelne Paket den Befehl ausführen wollte, haben ein Kollege und ich dann folgenden Befehl gebastelt, den ich jetzt zukünftig nach jedem Update ausführen werde:
dpkg --list | grep -P "linux-(image|headers)" | grep -v $(uname -r | sed "s/-generic//") | grep -Pv "linux-(image|headers)-generic" | awk '{print $2}' | xargs dpkg --purge

Zur Erklärung: dpkg --list listet die aktuell installierten Pakete auf.
Mit grep -P "linux-(image|headers)" suchen wir uns nur die Kernel-Pakete raus.
Von diesen Kernel-Paketen wollen wir alle bis auf den aktuell laufenden Kernel haben. Also nehmen wir noch den Befehl grep -v $(uname -r | sed "s/-generic//") dazu.
Außerdem – ganz wichtig – sollten wir noch linux-image-generic und linux-headers-generic mit grep -Pv "linux-(image|headers)-generic" ausschließen.
Letztendlich packen wir das Ergebnis in eine „Liste“ mit awk '{print $2}' und übergeben diese dann via xargs an dpkg --purge.

5 comments on “Ubuntu: Alte Kernel-Pakete löschen”

  1. Mealy

    Hey, ich habe deinen „selbstgebastelten“ Befehl so im Terminal eingegeben und erhalte als Antwort: dpkg: Fehler: Angeforderte Operation benötigt Superuser-Rechte

Leave A Reply

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Arne Schadagies