Upgrade nicht möglich, da nicht genügend Speicherplatz vorhanden ist


123

Ich versuche es do-release-upgrade aber dann bekomme ich:

Nicht genügend freier Speicherplatz

Das Upgrade wurde abgebrochen. Das Upgrade benötigt insgesamt 25,7 MB freien Speicherplatz auf der Festplatte '/ boot'. Bitte geben Sie mindestens 25,7 MB zusätzlichen Speicherplatz für '/ boot' frei. Leeren Sie Ihren Papierkorb und entfernen Sie temporäre Pakete früherer Installationen mit 'sudo apt-get clean'.

Ausgabe von df:

                    237251272 214797108  10402504  96% /
udev                    488120         4    488116   1% /dev
tmpfs                   198676       668    198008   1% /run
none                      5120         0      5120   0% /run/lock
none                    496684         0    496684   0% /run/shm
/dev/sda1               233191    225867         0 100% /boot

Wie kommt es, dass beim Booten kein Platz mehr ist? Hier ist die Ausgabe von ls -as /boot:

total 221839
    4 .
    4 ..
  645 abi-2.6.32-34-generic-pae
  698 abi-2.6.35-30-generic-pae
  727 abi-2.6.38-12-generic-pae
  727 abi-3.0.0-12-generic-pae
  727 abi-3.0.0-13-generic-pae
  727 abi-3.0.0-14-generic-pae
  727 abi-3.0.0-15-generic-pae
  727 abi-3.0.0-16-generic-pae
  727 abi-3.0.0-17-generic-pae
  727 abi-3.0.0-19-generic-pae
  761 abi-3.0.0-20-generic-pae
  115 config-2.6.32-34-generic-pae
  128 config-2.6.35-30-generic-pae
  136 config-2.6.38-12-generic-pae
  140 config-3.0.0-12-generic-pae
  140 config-3.0.0-13-generic-pae
  140 config-3.0.0-14-generic-pae
  140 config-3.0.0-15-generic-pae
  140 config-3.0.0-16-generic-pae
  140 config-3.0.0-17-generic-pae
  140 config-3.0.0-19-generic-pae
  140 config-3.0.0-20-generic-pae
    5 grub
10773 initrd.img-2.6.32-34-generic-pae
13619 initrd.img-2.6.35-30-generic-pae
15365 initrd.img-2.6.38-12-generic-pae
16481 initrd.img-3.0.0-12-generic-pae
16487 initrd.img-3.0.0-13-generic-pae
16501 initrd.img-3.0.0-14-generic-pae
16476 initrd.img-3.0.0-15-generic-pae
16481 initrd.img-3.0.0-16-generic-pae
16478 initrd.img-3.0.0-17-generic-pae
   12 lost+found
  174 memtest86+.bin
  176 memtest86+_multiboot.bin
 1700 System.map-2.6.32-34-generic-pae
 1841 System.map-2.6.35-30-generic-pae
 2115 System.map-2.6.38-12-generic-pae
 2141 System.map-3.0.0-12-generic-pae
 2141 System.map-3.0.0-13-generic-pae
 2143 System.map-3.0.0-14-generic-pae
 2146 System.map-3.0.0-15-generic-pae
 2147 System.map-3.0.0-16-generic-pae
 2147 System.map-3.0.0-17-generic-pae
 2148 System.map-3.0.0-19-generic-pae
 2149 System.map-3.0.0-20-generic-pae
    2 vmcoreinfo-2.6.32-34-generic-pae
    2 vmcoreinfo-2.6.35-30-generic-pae
    2 vmcoreinfo-2.6.38-12-generic-pae
    2 vmcoreinfo-3.0.0-12-generic-pae
    2 vmcoreinfo-3.0.0-13-generic-pae
    2 vmcoreinfo-3.0.0-14-generic-pae
    2 vmcoreinfo-3.0.0-15-generic-pae
    2 vmcoreinfo-3.0.0-16-generic-pae
    2 vmcoreinfo-3.0.0-17-generic-pae
    2 vmcoreinfo-3.0.0-19-generic-pae
    2 vmcoreinfo-3.0.0-20-generic-pae
 4092 vmlinuz-2.6.32-34-generic-pae
 4347 vmlinuz-2.6.35-30-generic-pae
 4567 vmlinuz-2.6.38-12-generic-pae
 4675 vmlinuz-3.0.0-12-generic-pae
 4676 vmlinuz-3.0.0-13-generic-pae
 4681 vmlinuz-3.0.0-14-generic-pae
 4698 vmlinuz-3.0.0-15-generic-pae
 4700 vmlinuz-3.0.0-16-generic-pae
 4700 vmlinuz-3.0.0-17-generic-pae
 4703 vmlinuz-3.0.0-19-generic-pae
 4705 vmlinuz-3.0.0-20-generic-pae

Ausgabe von uname -a:

 Linux kitsch 3.0.0-17-generic-pae #30-Ubuntu SMP Thu Mar 8 17:53:35 UTC 2012 i686 i686 i386 GNU/Linux

Fügen Sie die Ausgabe zu ls -l /bootund uname -aIhrer Frage hinzu.
jippie

Fügen Sie auch die Ausgabe dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'zu Ihrer Frage hinzu.
jippie

ls -as /bootkönnte stattdessen nützlich sein. Es wird nur die Größe der Dateien enthalten.
Adempewolff

die Ausgabe von ls -l / boot ist ganz zu lange hier zu posten , damit hier eine Pastebin pastebin.com/yM1aEJUx
Klemme

5
Nein ist es nicht. Es ist die Ursache Ihres Problems. Wenn Ihre Frage tatsächlich zu lang wird, wird sie von jemandem bearbeitet. Die Verwendung von externen Diensten wie Pastebin wird den Wert der Frage für zukünftige Referenzzwecke sprengen.
jippie

Antworten:


160

Ihre / boot-Partition ist mit alten Kerneln gefüllt. Es tut das manchmal nicht sicher, warum es nie behoben wird. Sie können die alten Kernel problemlos entfernen, wenn Sie wissen, in welchen Paketen sie enthalten sind.

Überprüfen uname -aSie zunächst Ihre aktuelle Version.

Führen Sie dann den folgenden Befehl aus:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'

Dieser Befehl listet alle Pakete auf, die Sie nicht mehr benötigen. Ich mag es nicht, sie automatisch zu entfernen, ich mag es, die Kontrolle zu haben, wenn es darum geht, Kernel zu entfernen. Gehen Sie also für jedes aufgelistete Paket wie folgt vor:

sudo apt-get -y purge some-kernel-package

Intermezzo

In diesem Intermezzo wird die Funktionsweise der Befehle genauer beschrieben und versucht, ein Problem zu beheben linux-libc-dev:amd64. Die meisten Benutzer können diesen Absatz überspringen.

  • dpkg -l 'linux-*' liste alle Pakete auf, deren Name mit 'linux-' beginnt
  • sed '/^ii/!d; remove all lines that do *not* start withii`
  • uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/" Finde die aktuelle Kernelversion
  • /'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d Entfernen Sie alle Zeilen mit Ausnahme der Zeilen, die die Versionsnummer des aktuell ausgeführten Kernels enthalten
  • s/^[^ ]* [^ ]* \([^ ]*\).*/\1/ Für jede Zeilenliste nur den Paketnamen
  • /[0-9]/!d Entfernen Sie Zeilen, die keine Zahlen enthalten.

Um das Problem von Frederick Nord zu beheben , kann der Befehl meines Erachtens wie folgt geändert werden:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d;/^linux-\(headers\|image\)/!d'

Grundsätzlich wird ein zusätzlicher Filter hinzugefügt:

  • / ^ linux- (headers \ | image) /! d Löscht alle Zeilen, die nicht mit linux-headersoder beginnenlinux-image

/Intermezzo

Wo some-kernel-packagekann mit einem der aufgeführten Pakete ersetzt werden. Achten Sie nur darauf, dass Sie nicht die Kernelpakete entfernen, die derzeit verwendet werden (wie von aufgeführt uname -a), z. sudo apt-get purge -y linux-headers-3.0.0-12usw.

Es kann mit dem Befehl xargs weiter automatisiert werden, aber das gefällt mir nicht. Es ist eine persönliche Sache. Hier ist jedoch der Befehl dazu:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge

So /bootsieht es aus, ein Ersatzkernel (2.6.38-11) für alle Fälle und 3.2.0-24 aktuell:

$ ls -l /boot
total 59388
-rw-r--r-- 1 root root   730545 Sep 13  2011 abi-2.6.38-11-generic
-rw-r--r-- 1 root root   791023 Apr 25 13:51 abi-3.2.0-24-generic
-rw-r--r-- 1 root root   130326 Sep 13  2011 config-2.6.38-11-generic
-rw-r--r-- 1 root root   140341 Apr 25 13:51 config-3.2.0-24-generic
drwxr-xr-x 3 root root     5120 May 27 17:46 grub
-rw-r--r-- 1 root root 20883146 Oct  1  2011 initrd.img-2.6.38-11-generic
-rw-r--r-- 1 root root 22474219 May  5 09:04 initrd.img-3.2.0-24-generic
drwxr-xr-x 2 root root    12288 Apr 16  2009 lost+found
-rw-r--r-- 1 root root   176764 Nov 27 11:00 memtest86+.bin
-rw-r--r-- 1 root root   178944 Nov 27 11:00 memtest86+_multiboot.bin
-rw------- 1 root root  2656297 Sep 13  2011 System.map-2.6.38-11-generic
-rw------- 1 root root  2884358 Apr 25 13:51 System.map-3.2.0-24-generic
-rw------- 1 root root     1369 Sep 13  2011 vmcoreinfo-2.6.38-11-generic
-rw------- 1 root root  4526784 Sep 13  2011 vmlinuz-2.6.38-11-generic
-rw------- 1 root root  4965776 Apr 25 13:51 vmlinuz-3.2.0-24-generic

Und Dateisystemnutzung:

$ df -h /boot
Filesystem Size Used Avail Use% Mounted
/dev/sda5  228M  63M  154M  29% /boot

2
Diese Lösung wurde stark von einem Artikel von OzzyFrank unter ubuntugenius.wordpress.com/2011/01/08/…
jippie

6
Ja, warum ist das ein Problem, ist die Frage? Dies sollte nicht auf den Benutzer zu handhaben sein.
Elijah Lynn

2
FWIW: Das passte auch zu linux-libc-dev: amd64 für mich. Es kann also durchaus etwas zu großzügig sein.
Frederick Nord

4
It does that sometimes, not sure why it is never fixedUbuntu hat die Entscheidung getroffen, regelmäßig neue Kernel als neue Pakete und nicht als Upgrades für vorhandene Pakete bereitzustellen, um die Möglichkeit zu haben, mehrere Kernel zu installieren und nach Belieben zwischen ihnen zu wechseln. Ich stimme zu, dass diese Annahme nicht den 95% der Leute entspricht, die nur den neuesten Kernel wollen (und vielleicht einen Fallback bei neuen Boot-Problemen) und die installierten Kernel nicht selbst verwalten wollen. Vielleicht wird Ubuntu in Zukunft dieses Verhalten ändern. Stellen Sie vorerst sicher, dass Ihr / boot riesig ist.
Thomasrutter

1
@thomasrutter Wenn Sie (wie ich und die 95% der Menschen, über die Sie sprechen) der Meinung sind, dass dieser Fehler wichtig ist, stimmen Sie hier darüber ab: bugs.launchpad.net/ubuntu/+source/update-manager/+bug/1183692
FriendFX

46

sudo apt-get autoremove

Hat den Trick für mich getan, es hat alle nicht verwendeten Kernelpakete erfolgreich aufgeräumt.


3
das ist nicht richtig. from man apt-getautoremove wird verwendet, um Pakete zu entfernen, die automatisch installiert wurden, um Abhängigkeiten für ein Paket zu erfüllen, und die nicht mehr benötigt werden. Ein Kernel wird nicht installiert, um Abhängigkeiten zu erfüllen. Er wird während eines Upgrades installiert.
Dward

5
@neon_overload Ich habe es gerade gepostet, weil es den Trick für mich getan hat.
Oben ohne

1
@dward Es hat etwas Platz für mich frei gemacht: vorher entfernen: /dev/sda1, 240M total, 171M used, 57M free, 75% used /boot nachher: /dev/sda1, 240M total, 129M used, 98M free, 57% used /boot
Stefan Rogin

6
Im Dialogfeld "Nicht genügend freier Speicherplatz" sollte eine Schaltfläche zum Ausführen dieser Aufgabe vorhanden sein. Dies würde insbesondere unerfahrenen Benutzern helfen, die mit der Befehlszeile nicht vertraut sind.
Martin R.

1
Hat den Trick ohne mein Betriebssystem zu brechen
Ruthvik Vaila

8

Entspricht die akzeptierte Antwort - andere (möglicherweise) einfacher Weg, um die Installation ubuntu-tweakTool kann von folgenden Website heruntergeladen wird hier . Gehen Sie zu "Janitor" und wählen Sie "Old Kernel" zum Reinigen. Dies ist mit wenigen Klicks erledigt. (getestet auf 14.04 desktop)

Bildbeschreibung hier eingeben


Eine Situation mit Platzmangel ist /bootdie ganze Zeit gegeben, daher ist dies meine Lieblingslösung - eine einfach auszuführende Anwendung, die den Job mit einem Klick erledigt.
S3M3N

2

Im Vergleich zu anderen GUI-Antworten liegt der Vorteil dieser Antwort darin, dass Ubuntu Bash nativ verwendet wird, ohne dass Anwendungen von Drittanbietern installiert werden.

Zenity- und Bash-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

Der aktuelle Kernel, mit dem Sie gebootet haben, kann 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 dieses Datum „berühren“ jedes Mal , wenn der Kernel dies mit Booten ( Wie finden Sie heraus , wenn eine bestimmte Kernel - Version zuletzt gestartet wurde? ) Cron Reboot - Skript. 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

Um die Datei ausführbar zu machen, gehen Sie wie folgt vor:

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

ANMERKUNG: Eine Serverversion (textbasiert, nicht GUI) dieses Skripts finden Sie unter: Wie entferne ich alte Kernelversionen, um das Startmenü zu bereinigen?


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 .


Du bist unglaublich! Wirklich toll, danke! Du hast mich glücklich gemacht!
Zhartaunik

0

Über den synaptic package manager können Sie problemlos mit Kerneln umgehen. Aber zuerst sollten Sie einen aktuell verwendeten Kernel-Release-Namen in der Terminal-Eingabeaufforderung kennen:

linux@linux-desktop:~$ uname -r 4.4.0-75-generic Zumindest diese Version solltest du also unangetastet lassen. Öffnen Sie synaptic und füllen Sie den Platzhalter für den Schnellfilter wie Bildbeschreibung hier eingeben folgt aus: Jetzt können Sie alle Pakete auswählen, die Sie löschen möchten, und folgende Schritte ausführen : Zum vollständigen Entfernen markieren -> Übernehmen . Ich würde vorschlagen, mindestens ein aktuelles Kernelpaket und einen vorherigen Kernel beizubehalten. In diesem Fall können Sie beispielsweise Linux-Image-4.4.0-66-generic und Linux-Image-Extra-4.4.0-66-generic sicher entfernen , aber es ist gut, 4.4.0-72 und natürlich zu behalten 4.4.0-75 .



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.