Nie można zaktualizować z powodu małej ilości miejsca na dysku przy / boot

123

Próbuję to zrobić, do-release-upgrade ale otrzymuję:

Za mało wolnego miejsca na dysku

Aktualizacja została przerwana. Aktualizacja wymaga w sumie 25,7 M wolnego miejsca na dysku „/ boot”. Zwolnij co najmniej dodatkowe 25,7 M miejsca na dysku podczas „/ boot”. Opróżnij kosz i usuń tymczasowe pakiety wcześniejszych instalacji, używając „sudo apt-get clean”.

Wyjście 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

Dlaczego nie ma miejsca na bagażniku? Oto wynik 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

Wyjście 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
Zacisk
źródło
Dodaj wynik do pytania ls -l /booti uname -ado niego.
jippie
Dodaj również wynik dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'do swojego pytania.
jippie
ls -as /bootmoże być przydatne zamiast tego. Będzie zawierał tylko rozmiary plików.
adempewolff
wyjście ls -l / boot jest tutaj zbyt długie, więc tutaj jest pastebin pastebin.com/yM1aEJUx
zacisk
5
Nie, nie jest. To jest przyczyna twojego problemu. Jeśli twoje pytanie rzeczywiście staje się zbyt długie, ktoś je edytuje. Korzystanie z usług zewnętrznych, takich jak pastebin, spowoduje uszkodzenie wartości pytania na przyszłość.
jippie

Odpowiedzi:

160

Partycja / boot jest wypełniona starymi jądrami. Czasami tak się dzieje, nie jestem pewien, dlaczego nigdy tego nie naprawiono. Możesz łatwo usunąć stare jądra, jeśli wiesz, w których pakietach się znajdują.

Najpierw sprawdź, uname -aczy masz aktualną wersję.

Następnie uruchom następujące polecenie:

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

To polecenie wyświetli listę wszystkich pakietów, których już nie potrzebujesz. Nie lubię ich usuwać automatycznie, lubię mieć kontrolę nad usuwaniem jąder. Dlatego dla każdego wymienionego pakietu wykonaj następujące czynności:

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

Intermezzo

To intermezzo opisuje bardziej szczegółowo działanie poleceń i próbuje rozwiązać problem linux-libc-dev:amd64. Większość użytkowników może pominąć ten akapit.

  • dpkg -l 'linux-*' wyświetla listę wszystkich pakietów, których nazwa zaczyna się od „linux-”
  • sed '/^ii/!d; remove all lines that do *not* start withii`
  • uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/" znajdź bieżącą wersję jądra
  • /'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d Usuń wszystkie linie, z wyjątkiem tych, które zawierają bieżący numer wersji jądra
  • s/^[^ ]* [^ ]* \([^ ]*\).*/\1/ Dla każdej listy linii tylko nazwa pakietu
  • /[0-9]/!d Usuń linie, które nie zawierają liczb.

Aby naprawić problem Fredericka Norda, myślę, że polecenie można zmienić w następujący sposób:

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

Zasadniczo dodaje dodatkowy filtr:

  • / ^ linux- (headers \ | image) /! d Usuń wszystkie linie, które nie zaczynają się od linux-headerslublinux-image

/Intermezzo

Gdzie some-kernel-packagemożna zastąpić jednym z wymienionych pakietów. Uważaj tylko, aby nie usunąć aktualnie używanych pakietów jądra (wymienionych przez uname -a), np. sudo apt-get purge -y linux-headers-3.0.0-12itp.

Można go zautomatyzować dalej za pomocą polecenia xargs, ale mi się to nie podoba. To jest sprawa osobista. Oto jednak polecenie:

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

Tak to /bootwygląda, jedno zapasowe jądro (2.6.38-11) na wszelki wypadek i 3.2.0-24 są aktualne:

$ 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

I wykorzystanie systemu plików:

$ df -h /boot
Filesystem Size Used Avail Use% Mounted
/dev/sda5  228M  63M  154M  29% /boot
jippie
źródło
2
To rozwiązanie zostało mocno zainspirowane artykułem OzzyFrank na ubuntugenius.wordpress.com/2011/01/08/…
jippie
6
Tak, dlaczego to jest pytanie? To nie powinno być zadaniem użytkownika.
Elijah Lynn
2
FWIW: To również pasowało do mnie linux-libc-dev: amd64. Więc może to być zbyt hojne.
Frederick Nord
4
It does that sometimes, not sure why it is never fixedUbuntu zdecydowało się na lepsze lub gorsze, aby zapewnić regularne nowe jądra jako nowe pakiety, a nie jako aktualizacje istniejących pakietów, aby dać możliwość zainstalowania wielu jąder i przełączania się między nimi do woli. Zgadzam się, że to założenie nie pasuje do 95% osób, które chcą tylko najnowszego jądra (i być może jednej rezerwy w przypadku nowych problemów z uruchamianiem) i które nie chcą samodzielnie zarządzać zainstalowanymi jądrami. Być może w przyszłości Ubuntu zmieni to zachowanie. Na razie upewnij się, że Twój / boot jest ogromny.
thomasrutter
1
@thomasrutter Jeśli (podobnie jak ja i 95% osób, o których mówisz) uważasz, że ten błąd jest ważny, zagłosuj na niego tutaj: bugs.launchpad.net/ubuntu/+source/update-manager/+bug/1183692
FriendFX
46

sudo apt-get autoremove

załatwił sprawę, skutecznie wyczyścił wszystkie nieużywane pakiety jądra.

topless
źródło
3
to nie jest poprawne. z man apt-getautorove służy do usuwania pakietów, które zostały automatycznie zainstalowane w celu spełnienia zależności dla niektórych pakietów i które nie są już potrzebne. jądro nie zostanie zainstalowane w celu spełnienia zależności, są instalowane podczas aktualizacji.
dward
5
@neon_overload Właśnie opublikowałem, bo to załatwiło sprawę.
topless
1
@dward To zwolniło dla mnie trochę miejsca: przed autremove: /dev/sda1, 240M total, 171M used, 57M free, 75% used /boot po: /dev/sda1, 240M total, 129M used, 98M free, 57% used /boot
Stefan Rogin
6
Powinien istnieć przycisk do wykonania tego zadania w oknie dialogowym „Za mało wolnego miejsca na dysku”. Pomoże to szczególnie początkującym użytkownikom, którzy nie znają wiersza poleceń.
Martin R.
1
Wykonałem
8

Odpowiednik przyjętej odpowiedzi - innym (być może) łatwiejszym sposobem jest zainstalowanie ubuntu-tweaknarzędzia, które można pobrać stąd . Przejdź do „Dozorca” i wybierz „Stare jądro”, aby wyczyścić. Można to zrobić za pomocą kilku kliknięć. (testowany na komputerze 14.04)

wprowadź opis zdjęcia tutaj

Yixing
źródło
Sytuacja, w której brakuje miejsca, /bootzdarza się cały czas, więc jest to moje ulubione rozwiązanie - łatwa do uruchomienia aplikacja, która wykonuje zadanie jednym kliknięciem.
s3m3n
2

W porównaniu z innymi odpowiedziami GUI tutaj zaletą tej odpowiedzi jest to, że Ubuntu Bash jest używany bez instalowania aplikacji innych firm.

Rozwiązanie oparte na Zenity i Bash

Zenity zapewnia przyjemny interfejs GUI do terminala do przetwarzania listy i wybierania elementów za pomocą przycisków opcji :

jądra rm 1

Bieżącego jądra, z którego uruchomiłeś system, nie można usunąć i nie ma go na liście. Podany rozmiar określa, ile zostanie zapisanych w /bootkatalogu. Więcej jest zapisywane na dysku, ponieważ pliki binarne jądra znajdują się również w innych obszarach. Uwaga z 27 lipca 2017: Katalogi /usr/src/*kernel_version*i /lib/modules/*kernel_version*teraz również są uwzględnione.

Data modyfikacji zostaje odkryta za pomocą statpolecenia. W moim systemie ta data jest „dotykana” za każdym razem, gdy jądro jest uruchamiane przy użyciu tego ( Jak dowiedzieć się, kiedy konkretna wersja jądra była ostatnio uruchamiana? ) Skrypt restartu cron . Jednak w twoim systemie data będzie datą wydania jądra, a nie ostatnim uruchomieniem systemu.

apt-get purge daje szansę na przerwanie ciąży

Masz ostatnią okazję, aby zobaczyć wszystko, co zostanie wyczyszczone i zobaczyć całkowite miejsce na dysku (nieco mylące), które zostanie odzyskane:

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] 

Kod

Skopiuj ten kod do pliku wykonywalnego o nazwie rm-kernelsw /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

UWAGA: Aby utworzyć plik, potrzebujesz uprawnień sudo, więc użyj:

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

Aby użyć pliku wykonywalnego:

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

UWAGA: W przypadku wersji skryptu dla serwera (tekstowej, a nie graficznej) zobacz: Jak usunąć stare wersje jądra, aby wyczyścić menu startowe?


Aktualizacje z 28 lipca 2017 r

Pobrano obliczony rozmiar każdego jądra, z /boot/*kernel_version*którego było 5 plików o łącznej ~ 50 MB. Formuła uległa zmianie, aby uwzględnić pliki w /usr/src/*kernel_version*i /lib/modules/*kernel_version*. Obliczony rozmiar każdego jądra wynosi teraz ~ 400 MB. Powyższy kod dla rm-kernelsi rm-kernels-serverzostał zaktualizowany. Jednak powyższe przykładowe ekrany nie odzwierciedlają jeszcze tych zmian.

Domyślnie szacuje się rozmiar plików nagłówków linuksa na 125 MB i obrazu linux na 220 MB, ponieważ dumoże być boleśnie powolny, chyba że pliki są w pamięci podręcznej. Aby uzyskać rzeczywisty rozmiar, użyj dudowolnego parametru do skryptu.

Suma wszystkich rozmiarów jądra (z wyjątkiem bieżącej wersji, której nie można usunąć) jest teraz wyświetlana na pasku tytułu.

Okno dialogowe używane do wyświetlania daty ostatniego dostępu każdego jądra . Ta data może zostać masowo nadpisana dla wszystkich jąder podczas tworzenia kopii zapasowej lub podobnych operacji. Okno dialogowe pokazuje teraz zamiast tego datę modyfikacji .

WinEunuuchs2Unix
źródło
Jesteś niesamowity! Naprawdę wielkie dzięki! Sprawiłeś że jestem szczęśliwy!
zhartaunik
0

Możesz łatwo obsługiwać jądra za pomocą menedżera pakietów synaptic. Ale najpierw powinieneś znać aktualnie używaną nazwę wydania jądra, w linii poleceń:

linux@linux-desktop:~$ uname -r 4.4.0-75-generic Więc przynajmniej ta wersja powinna pozostać nietknięta. Otwórz synaptic i zacznij wypełniać symbol zastępczy szybkiego filtru, jak pokazano poniżej: wprowadź opis zdjęcia tutaj Teraz możesz wybrać wszystkie pakiety, które chcesz usunąć, i wykonaj następujące czynności: Zaznacz do całkowitego usunięcia -> Zastosuj . Sugerowałbym zachować przynajmniej najnowszy aktualny pakiet jądra i jedno poprzednie jądro. Na przykład w tym przypadku możesz bezpiecznie pozbyć się linux-image-4.4.0-66-generic i linux-image-extra-4.4.0-66-generic , ale dobrze jest zachować 4.4.0-72 i oczywiście 4.4.0–75 .

mieszaniec
źródło
0

Dla ułatwienia linii poleceń:

https://github.com/erichs/bootnukem

git clone https://github.com/erichs/bootnukem.git
cd bootnukem
sudo ./install.sh

Następnie

sudo bootnukem --dry-run
Jonathan
źródło