Impossibile eseguire l'aggiornamento a causa di spazio su disco insufficiente all'avvio / avvio


123

Provo a fare do-release-upgrade ma poi ottengo:

Spazio su disco disponibile insufficiente

L'aggiornamento è stato interrotto. L'aggiornamento richiede un totale di 25,7 M di spazio libero su disco / avvio. Liberare almeno altri 25,7 M di spazio su disco su "/ boot". Svuota il cestino e rimuovi i pacchetti temporanei di precedenti installazioni usando 'sudo apt-get clean'.

Uscita di 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

Come mai non rimane spazio all'avvio? Ecco l'output di 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

Uscita di 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

Aggiungere l'output a ls -l /boote uname -aalla tua domanda.
jippie,

Aggiungi anche l'output a dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'alla tua domanda.
jippie,

ls -as /bootpotrebbe essere utile invece. Includerà solo le dimensioni dei file.
adempewolff,

l'output di ls -l / boot è abbastanza lungo post qui, quindi ecco un pastebin pastebin.com/yM1aEJUx
morsetto

5
No non lo è. È la causa del tuo problema. Se la tua domanda è davvero troppo lunga, qualcuno la modificherà. L'uso di servizi esterni come pastebin interromperà il valore della domanda per riferimento futuro.
jippie,

Risposte:


160

La tua partizione / boot è piena di vecchi kernel. Lo fa a volte, non sono sicuro del perché non sia mai stato risolto. Puoi rimuovere facilmente i vecchi kernel se sai in quali pacchetti sono arrivati.

Prima controlla uname -aper verificare la tua versione attuale.

Quindi eseguire il comando seguente:

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

Questo comando elencherà tutti i pacchetti che non ti servono più. Non mi piace rimuoverli automaticamente, mi piace avere il controllo quando si tratta di rimuovere i kernel. Quindi, per ogni pacchetto elencato, procedi come segue:

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

Intermezzo

Questo intermezzo descrive in modo più dettagliato come funzionano i comandi e tenta di risolvere un problema linux-libc-dev:amd64. La maggior parte degli utenti può saltare questo paragrafo.

  • dpkg -l 'linux-*' elenca tutti i pacchetti che hanno un nome che inizia con 'linux-'
  • sed '/^ii/!d; remove all lines that do *not* start withii`
  • uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/" trova la versione corrente del kernel in esecuzione
  • /'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d Rimuovi tutte le righe, tranne quelle che contengono il numero di versione del kernel corrente
  • s/^[^ ]* [^ ]* \([^ ]*\).*/\1/ Per ogni elenco di righe solo il nome del pacchetto
  • /[0-9]/!d Rimuovi le righe che non contengono numeri.

Per risolvere il problema di Frederick Nord, penso che il comando possa essere modificato come segue:

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

In sostanza aggiunge un filtro aggiuntivo:

  • / ^ linux- (headers \ | image) /! d Elimina tutte le righe che non iniziano con linux-headersolinux-image

/Intermezzo

Dove some-kernel-packagepuò essere sostituito con uno dei pacchetti elencati. Basta fare attenzione a non rimuovere i pacchetti del kernel che sono attualmente in uso (come elencati dal uname -a) ad es. sudo apt-get purge -y linux-headers-3.0.0-12eccetera.

Può essere ulteriormente automatizzato usando il comando xargs, ma non mi piace. È una cosa personale. Tuttavia, ecco il comando per farlo:

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

Ecco /bootcome appare il mio , un kernel di riserva (2.6.38-11) per ogni evenienza e 3.2.0-24 essendo attuali:

$ 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

E utilizzo del file system:

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

2
Questa soluzione è stata fortemente ispirata da un articolo di OzzyFrank su ubuntugenius.wordpress.com/2011/01/08/…
jippie,

6
Sì, perché questo è un problema? Questo non dovrebbe essere gestito dall'utente.
Elijah Lynn,

2
FWIW: Questo corrispondeva anche a me per linux-libc-dev: amd64. Quindi potrebbe benissimo essere un po 'troppo generoso.
Federico Nord,

4
It does that sometimes, not sure why it is never fixedUbuntu ha preso la decisione, nel bene o nel male, di fornire regolarmente nuovi kernel come nuovi pacchetti anziché come aggiornamenti ai pacchetti esistenti, per dare la possibilità di avere più kernel installati e passare da uno all'altro a piacimento. Sono d'accordo che questo presupposto non si adatta al 95% delle persone che vogliono solo l'ultimo kernel (e forse un fallback in caso di nuovi problemi di avvio) e che non vogliono gestire da soli i kernel installati. Forse in futuro Ubuntu cambierà questo comportamento. Per ora, assicurati che il tuo / boot sia enorme.
thomasrutter,

1
@thomasrutter Se (come me e il 95% delle persone di cui stai parlando) pensi che questo bug sia importante, vota qui: bugs.launchpad.net/ubuntu/+source/update-manager/+bug/1183692
FriendFX

46

sudo apt-get autoremove

ha fatto il trucco per me, ha ripulito con successo tutti i pacchetti del kernel inutilizzati.


3
questo non è corretto. da man apt-getautoremove viene utilizzato per rimuovere i pacchetti che sono stati installati automaticamente per soddisfare le dipendenze per alcuni pacchetti e che non sono più necessari. un kernel non verrebbe installato per soddisfare le dipendenze, ma verrà installato durante gli aggiornamenti.
dward

5
@neon_overload L'ho appena pubblicato perché ha funzionato, per me.
topless il

1
@dward Mi ha liberato un po 'di spazio: prima dell'autremove: /dev/sda1, 240M total, 171M used, 57M free, 75% used /boot dopo: /dev/sda1, 240M total, 129M used, 98M free, 57% used /boot
Stefan Rogin

6
Dovrebbe essere presente un pulsante per eseguire questa attività nella finestra di dialogo "Spazio su disco insufficiente". Ciò aiuterebbe in particolare gli utenti meno esperti che non hanno familiarità con la riga di comando.
Martin R.

1
Ha fatto il trucco senza rompere il mio sistema operativo
Ruthvik Vaila

8

Equivalente alla risposta accettata: un altro modo (forse) più semplice è installare lo ubuntu-tweakstrumento, che può essere scaricato da qui . Vai su "Janitor" e seleziona "Old Kernel" per pulire. Può essere fatto in pochi clic. (testato sul desktop 14.04)

inserisci qui la descrizione dell'immagine


La situazione con mancanza di spazio è sempre attiva, /bootquindi questa è la mia soluzione preferita: un'applicazione facile da eseguire che fa il lavoro con un clic.
s3m3n,

2

Rispetto ad altre risposte della GUI qui, il vantaggio di questa risposta è che Ubuntu Bash nativo viene utilizzato senza installare applicazioni di terze parti.

Soluzione basata su Zenity e Bash

Zenity fornisce una bella interfaccia GUI al terminale per elaborare un elenco e selezionare gli elementi con i pulsanti di opzione :

rm-kernel 1

Il kernel corrente con cui hai avviato non può essere rimosso e non è incluso nell'elenco. La dimensione indicata è la quantità che verrà salvata nella /bootdirectory. Altro viene salvato sul disco perché i binari del kernel risiedono anche in altre aree. Nota del 27 luglio 2017: le directory /usr/src/*kernel_version*e /lib/modules/*kernel_version*ora sono incluse anche.

La data modificata viene rilevata utilizzando il statcomando. Sul mio sistema quella data viene "toccata" ogni volta che il kernel viene avviato usando questo ( come si fa a sapere quando è stata avviata l'ultima versione del kernel? ) Cron reboot script. Tuttavia, sul tuo sistema la data sarà la data di rilascio del kernel, non l'ultima volta che l'hai avviata.

apt-get purge ti dà la possibilità di interrompere

Ti viene data un'ultima opportunità per visualizzare tutto ciò che verrà eliminato e vedere lo spazio totale su disco (un po 'fuorviante) che verrà recuperato:

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] 

Il codice

Copia questo codice in un file eseguibile denominato 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

NOTA: per creare il file è necessaria l'autorizzazione sudo, quindi utilizzare:

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

Per rendere eseguibile il file utilizzare:

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

NOTA: per una versione server di questo script (basata sul testo e non sulla GUI), consultare: Come rimuovo le versioni del kernel precedente per ripulire il menu di avvio?


Aggiornamenti del 28 luglio 2017

Sono state prese le dimensioni calcolate di ciascun kernel da /boot/*kernel_version*cui erano 5 file per un totale di ~ 50 MB. La formula è stata modificata per includere i file in /usr/src/*kernel_version*e /lib/modules/*kernel_version*. La dimensione calcolata per ciascun kernel è ora ~ 400 MB. Il codice precedente per rm-kernelse rm-kernels-serverè stato aggiornato. Tuttavia, le schermate di esempio sopra non riflettono ancora queste modifiche.

L'impostazione predefinita è stimare la dimensione dei file per le intestazioni di Linux a 125 MB e l'immagine di Linux a 220 MB perché dupuò essere dolorosamente lento a meno che i file non siano nella cache. Per ottenere la dimensione reale usando dupassare qualsiasi parametro allo script.

Il totale di tutte le dimensioni del kernel (esclusa l'attuale versione in esecuzione che non può essere rimossa) è ora mostrato nella barra del titolo.

La finestra di dialogo utilizzata per visualizzare la data dell'ultimo accesso di ciascun kernel . Questa data può essere sovrascritta in massa per tutti i kernel durante il backup o operazioni simili. La finestra di dialogo ora mostra invece la data modificata .


Sei fantastico! Grazie davvero! Mi hai reso felice!
Zhartaunik,

0

Puoi gestire facilmente i kernel tramite il gestore pacchetti sinaptico. Ma prima dovresti conoscere un nome di rilascio del kernel attualmente utilizzato, nel prompt del terminale:

linux@linux-desktop:~$ uname -r 4.4.0-75-generic Quindi almeno questa versione dovresti rimanere intatta. Apri synaptic e inizia a compilare il segnaposto del filtro rapido come mostrato di seguito: inserisci qui la descrizione dell'immagine Ora puoi selezionare tutti i pacchetti che desideri eliminare ed effettuare le seguenti operazioni: Contrassegna per la rimozione completa -> Applica . Vorrei suggerire di mantenere almeno un pacchetto del kernel più recente e un kernel precedente. Ad esempio in questo caso puoi tranquillamente sbarazzarti di linux-image-4.4.0-66-generic e linux-image-extra-4.4.0-66-generic , ma è bene conservare 4.4.0-72 e ovviamente 4.4.0-75 .



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.