Ubuntu Paketupdates: Auf dem Gerät ist kein Speicherplatz mehr verfügbar

Ubuntu Paketupdates: Auf dem Gerät ist kein Speicherplatz mehr verfügbar

Beim regelmäßigen Aktualisieren der Pakete eines Ubuntu-Servers fällt auf, dass für ein Kernelupdate unerfüllte Abhängigkeiten bestehen. Für gewöhnlich wird dies mit dem Befehl

apt-get install -f

behoben, was jedoch in diesem Fall nicht klappte: Die Paketverwaltung quittiert ihren Dienst mit der Fehlermeldung Extrahierte Daten für »./boot/config-3.19.0-49-generic« können nicht nach »/boot/config-3.19.0-49-generic.dpkg-new« kopiert werden: Es konnte nicht geschrieben werden (Auf dem Gerät ist kein Speicherplatz mehr verfügbar). Klarheit schafft ein Blick auf die Speicherauslastung der Partitionen:

Dateisystem                Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda1                   236M    225M     0  100% /boot

Die Boot-Partition ist voll, daher schlägt auch das Kernal-Update fehl. Warum wird schnell klar, wenn man die Anzahl installierter Kernel-Pakete sowie deren Versionsspektrum betrachtet:

~$ dpkg -l | grep linux-image
ii  linux-image-3.19.0-25-generic       3.19.0-25.26~14.04.1             amd64        Linux kernel image for version 3.19.0 on 64 bit x86 SMP
ii  linux-image-3.19.0-26-generic       3.19.0-26.28~14.04.1             amd64        Linux kernel image for version 3.19.0 on 64 bit x86 SMP
ii  linux-image-3.19.0-28-generic       3.19.0-28.30~14.04.1             amd64        Linux kernel image for version 3.19.0 on 64 bit x86 SMP
ii  linux-image-3.19.0-30-generic       3.19.0-30.34~14.04.1             amd64        Linux kernel image for version 3.19.0 on 64 bit x86 SMP
ii  linux-image-3.19.0-31-generic       3.19.0-31.36~14.04.1             amd64        Linux kernel image for version 3.19.0 on 64 bit x86 SMP
ii  linux-image-3.19.0-32-generic       3.19.0-32.37~14.04.1             amd64        Linux kernel image for version 3.19.0 on 64 bit x86 SMP
ii  linux-image-3.19.0-33-generic       3.19.0-33.38~14.04.1             amd64        Linux kernel image for version 3.19.0 on 64 bit x86 SMP
ii  linux-image-extra-3.19.0-25-generic 3.19.0-25.26~14.04.1             amd64        Linux kernel extra modules for version 3.19.0 on 64 bit x86 SMP
ii  linux-image-extra-3.19.0-26-generic 3.19.0-26.28~14.04.1             amd64        Linux kernel extra modules for version 3.19.0 on 64 bit x86 SMP
ii  linux-image-extra-3.19.0-28-generic 3.19.0-28.30~14.04.1             amd64        Linux kernel extra modules for version 3.19.0 on 64 bit x86 SMP
ii  linux-image-extra-3.19.0-30-generic 3.19.0-30.34~14.04.1             amd64        Linux kernel extra modules for version 3.19.0 on 64 bit x86 SMP
ii  linux-image-extra-3.19.0-31-generic 3.19.0-31.36~14.04.1             amd64        Linux kernel extra modules for version 3.19.0 on 64 bit x86 SMP
ii  linux-image-extra-3.19.0-32-generic 3.19.0-32.37~14.04.1             amd64        Linux kernel extra modules for version 3.19.0 on 64 bit x86 SMP
iF  linux-image-extra-3.19.0-33-generic 3.19.0-33.38~14.04.1             amd64        Linux kernel extra modules for version 3.19.0 on 64 bit x86 SMP
iU  linux-image-extra-3.19.0-37-generic 3.19.0-37.42~14.04.1             amd64        Linux kernel extra modules for version 3.19.0 on 64 bit x86 SMP
iU  linux-image-extra-3.19.0-49-generic 3.19.0-49.55~14.04.1             amd64        Linux kernel extra modules for version 3.19.0 on 64 bit x86 SMP
iU  linux-image-generic-lts-vivid       3.19.0.49.34                     amd64        Generic Linux kernel image

Es ist also Aufräumen angesagt. Dafür ermitteln wir als erstes die aktuell installierte Kernel-Version, damit wir diese nicht auch entfernen – Denn die braucht das System selbstverständlich.

~$ uname -r
3.19.0-33-generic

Auf diesem System ist also 3.19.0-33 installiert. Theoretisch können wir nun alle anderen Versionen entfernen. Es hat sich jedoch bewährt, für den Fall der Fälle die Vorversion auf dem System zu behalten. In diesem Beispiel also Releasenummer 32. Die neueren Versionen zu entfernen wäre möglich, macht aber wenig Sinn – schließlich soll auf diese aktualisiert werden. Sollten an dieser Stelle nur eine einzelne Version übrig bleiben die gelöscht werden muss, kann man dies manuell durch Eingabe von

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

erledigen. Wobei x hierbei als Platzhalter für die konkrete Version fungiert, wie 3.19.0-25 als Beispiel. Mehrere Versionen zu entfernen endet dagegen in lästiger monotoner Kopierarbeit, die sich vereinfachen lässt:

sudo apt-get purge linux-image-3.19.0-{25,26,28,30,31}-generic

Damit werden die in den Klammern angegebenen Revisionen entfernt. In diesem Beispiel also alle Kernels, die älter als die Vorversion des aktuell installierten sind.

Wenn sich die Pakete nicht entfernen lassen

Mit etwas Glück ist das Problem damit schon behoben. Möglicherweise lassen sich die Pakete aber aufgrund von gegenseitigen Abhängigkeiten gar nicht entfernen, wie in diesem Fall:

:~$ sudo apt-get purge linux-image-3.19.0-25-generic
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Probieren Sie »apt-get -f install«, um dies zu korrigieren:
Die folgenden Pakete haben unerfüllte Abhängigkeiten:
 linux-image-extra-3.19.0-25-generic : Hängt ab von: linux-image-3.19.0-25-generic soll aber nicht installiert werden
 linux-image-extra-3.19.0-37-generic : Hängt ab von: linux-image-3.19.0-37-generic soll aber nicht installiert werden
 linux-image-extra-3.19.0-49-generic : Hängt ab von: linux-image-3.19.0-49-generic soll aber nicht installiert werden

In diesem Fall scheint es nur einen eher unschönen Workaround zu geben: Die Dateien der alten Kernel manuell aus der /boot Partition entfernen. Dazu wechselt man mittels cd auf die Partition und entfernt die mit initrd beginnenden Dateien, die älter sind als der installierte Kernel plus Vorversion.

:/boot$ ls -lh | grep initrd
insgesamt 120M
-rw-r--r-- 1 root root  20M Aug 22  2015 initrd.img-3.19.0-25-generic
-rw-r--r-- 1 root root  20M Aug 23 06:39 initrd.img-3.19.0-26-generic
-rw-r--r-- 1 root root  20M Sep  9 06:45 initrd.img-3.19.0-28-generic
-rw-r--r-- 1 root root  20M Okt  6 06:49 initrd.img-3.19.0-30-generic
-rw-r--r-- 1 root root  20M Okt 21 06:44 initrd.img-3.19.0-31-generic
-rw-r--r-- 1 root root  20M Nov  5 06:47 initrd.img-3.19.0-32-generic
-rw-r--r-- 1 root root  20M Nov 11 06:38 initrd.img-3.19.0-33-generic

Hier also alle Dateien bis 32-generic, die manuell mittels rm entfernt werden. Das Resultat sieht gut aus:

:/boot$ df -h
Dateisystem                Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda1                   236M    125M   99M   56% /boot

Nun können wir mittels

apt-get install -f

die fehlenden Abhängigkeiten sauber installieren sowie anschließend die alten Kernel-Versionen über die Paketverwaltung entfernen. Im besten Falle müsst ihr dies nun nicht mehr manuell tun, sondern könnt über autoremove automatisch alle alten Kernel entfernen:

:/boot$ sudo apt-get autoremove
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Die folgenden Pakete werden ENTFERNT:
  linux-headers-3.19.0-26 linux-headers-3.19.0-26-generic
  linux-headers-3.19.0-28 linux-headers-3.19.0-28-generic
  linux-headers-3.19.0-30 linux-headers-3.19.0-30-generic
  linux-headers-3.19.0-31 linux-headers-3.19.0-31-generic
  linux-image-3.19.0-26-generic linux-image-3.19.0-28-generic
  linux-image-3.19.0-30-generic linux-image-3.19.0-31-generic
  linux-image-extra-3.19.0-28-generic linux-image-extra-3.19.0-30-generic
  linux-image-extra-3.19.0-31-generic linux-image-extra-3.19.0-32-generic
0 aktualisiert, 0 neu installiert, 20 zu entfernen und 113 nicht aktualisiert.
Nach dieser Operation werden 1.439 MB Plattenplatz freigegeben.
Möchten Sie fortfahren? [J/n]

Alternativ entfernt die jeweiligen Kernel-Versionen manuell über apt-get purge wie oben beschrieben.

Leave a Reply