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.