La mia partizione / boot ha raggiunto il 100% e ora non riesco ad aggiornare. Impossibile rimuovere i vecchi kernel per fare spazio


154

Il mio primo problema è stato quando ho provato a apt-get updateo apt-get upgrade. All'aggiornamento viene visualizzato il seguente errore:

You might want to run 'apt-get -f install' to correct these.
The following packages have unmet dependencies:
linux-image-server : Depends: linux-image-3.2.0-27-generic but it is not installed
E: Unmet dependencies. Try using -f.

Ho provato a eseguire apt-get install -f e questo era l'output (dopo aver detto di sì al prompt)

(Reading database ... 186183 files and directories currently installed.)
Unpacking linux-image-3.2.0-27-generic (from .../linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb) ...
Done.
dpkg: error processing /var/cache/apt/archives/linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb (--unpack):
 failed in write on buffer copy for backend dpkg-deb during `./boot/System.map-3.2.0-27-generic': No space left on device
 No apport report written because the error message indicates a disk full error
                                                                          dpkg-deb:    error: subprocess paste was killed by signal (Broken pipe)
Examining /etc/kernel/postrm.d .
run-parts: executing /etc/kernel/postrm.d/initramfs-tools 3.2.0-27-generic   /boot/vmlinuz-3.2.0-27-generic
run-parts: executing /etc/kernel/postrm.d/zz-update-grub 3.2.0-27-generic /boot/vmlinuz-3.2.0-27-generic
Errors were encountered while processing:
/var/cache/apt/archives/linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

Ho provato a correre apt-get autoremovee mi dà lo stesso errore di apt-get upgrade.

Quando corro df, ottengo questo per /boot:

/dev/sda1                    233191     230297         0 100% /boot

Quindi, ho letto altrove che dovrei provare a eliminare vecchi kernel. Ho verificato quali kernel avevo con:

$ dpkg -l linux-image-\* | grep ^ii
ii  linux-image-2.6.38-13-server  2.6.38-13.52  Linux kernel image for version 2.6.38 on x86_64
ii  linux-image-3.0.0-13-server   3.0.0-13.22   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-14-server   3.0.0-14.23   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-15-server   3.0.0-15.26   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-16-server   3.0.0-16.29   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-17-server   3.0.0-17.30   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.2.0-24-generic  3.2.0-24.39   Linux kernel image for version 3.2.0  on 64 bit x86 SMP
ii  linux-image-3.2.0-25-generic  3.2.0-25.40   Linux kernel image for version 3.2.0  on 64 bit x86 SMP
ii  linux-image-3.2.0-26-generic  3.2.0-26.41   Linux kernel image for version 3.2.0  on 64 bit x86 SMP

Quando provo a rimuovere il più vecchio con questo:

$ sudo apt-get purge linux-image-2.6.38-13-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
linux-image-server : Depends: linux-image-3.2.0-27-generic but it is not going to be     installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

Come posso liberare o estendere l'avvio senza incasinare la mia installazione?


Penso che la risposta di @mreiter possa essere la migliore: usa il gestore dei pacchetti, e ha funzionato quando altri comandi del gestore dei pacchetti hanno fallito, almeno per me: askubuntu.com/a/205776/247661
Aaron Hall


1
@dskrvk Sì! Perché Remove-Unused-Dependenciesnon è l'impostazione predefinita?
Steven R. Loomis,

Risposte:


130

Liberare spazio sul file system di root

Per liberare spazio sul file system di root, puoi provare a eseguire apt-get clean.

Se il problema persiste, puoi andare a /var/cache/apt/archivesrimuovere manualmente alcuni file dalla cache per recuperare spazio, ad esempio:

sudo rm linux-headers-*

Se necessario, non rimuoverai tutti i .debfile qui, ecco cosa apt-get cleanfa. Saranno automaticamente scaricati nuovamente aptse sono necessari di nuovo.

Liberare spazio sul file system / boot

Il poster originale ha una /bootpartizione separata , ed è ciò che è pieno e impedisce al aptsistema di funzionare. Sarà necessario per lui liberare spazio lì.

Se c'è abbastanza spazio, vai a /boote rimuovi uno o due file di configurazione:

sudo rm config-3.2.0-19-generic-pae

per esempio, ma usando il nome di una delle versioni del kernel che intendi rimuovere comunque. Questo libererà un po 'di spazio (circa 144K ciascuno).

Se avete bisogno di più spazio di rimuovere singolarmente i vecchi vmlinuz, initrd, abie System.mapfile fino ad avere spazio sufficiente (circa 22M per una delle mie versioni del kernel i386).

Qualunque cosa tu faccia, non rimuoverli tutti . Dovresti almeno conservare le ultime due versioni corrispondenti di ogni tipo di file, per ogni tipo di kernel che usi.

Quindi procedere con i comandi di installazione di apt-get. Come accennato in precedenza, potrebbe essere necessario scaricare nuovamente alcuni dei detriti che hai eliminato, ma in tal caso avverrà automaticamente. Quando apt ha di nuovo funzionato, ripulisci usando apt-get per rimuovere i pacchetti corrispondenti ai file che hai rimosso, in modo che tutto corrisponda.


Il file di configurazione in /bootè la configurazione del kernel utilizzata dal team del kernel per creare il kernel con lo stesso nome. Dovrebbe essere innocuo rimuoverlo a meno che tu non lo desideri come riferimento o per aiutarti a costruire i tuoi kernel.

Infine stai rimuovendo manualmente un vecchio pacchetto del kernel o due dalla /bootpartizione per fare ancora più spazio per quello nuovo.


Ho provato a rimuovere quasi tutte le configurazioni. Non sembra ancora avere abbastanza spazio. Quali altri file potrebbero essere rimossi in modo sicuro? Il mio file system di root non è affatto completo, quindi non me ne preoccupo.
Strifey16

Ho aggiornato la mia risposta con gli altri file da rimuovere a mano. Mi sembra che sarebbe sufficiente rimuovere i set 3.0.0.13 e 3.0.0.14 (cinque file sul set incluso il file abi).
John S Gruber,

2
Questo l'ha risolto. Mi sono reso conto che probabilmente sarebbe arrivato alla rimozione manuale dei file, ma sono sempre restio a farlo con qualsiasi cosa installata da apt, quindi ho pensato di chiedere prima qui.
Strifey16

9
Non utilizzare sudo rmper rimuovere da / boot. Invece, usa sudo dpkg --purgeper rimuovere alcuni vecchi pacchetti di immagini linux. Successivamente utilizzare sudo apt-get -f installper correggere la dipendenza interrotta.
jarno,

4
Anche se a volte il sistema può essere così pieno che persino dpkg non può funzionare. Ma rmpuò essere usato allora.
jarno,

66

Nel mio caso, i aptcomandi e il dpkgcomando non sono stati completati e non sono stati rimossi. L'aggiornamento automatico non è riuscito durante l'installazione 2.6.32-56-server.

Il mio primo passo è stato identificare lo spazio da utilizzare,

cd /boot
du -sk *|sort -n

Avevo circa 30 kernel e file di supporto.

Ho fatto un uname -aper ottenere il kernel in esecuzione, ho identificato che ero su Linux alternativo 2.6.32-43-servere ho fatto una tardelle 6 versioni che non erano in esecuzione ed erano vecchie.

tar -cvf ~username/boot.tar *2.6.32-44-server *2.6.32-45-server *2.6.32-46-server *2.6.32-47-server *2.6.32-48-server *2.6.32-49-server

Ho quindi fatto una rm -rfdelle operazioni di cui avevo effettuato il backup:

rm -rf *2.6.32-44-server *2.6.32-45-server *2.6.32-46-server *2.6.32-47-server *2.6.32-48-server *2.6.32-49-server

Sto mostrando questi comandi come esempi, dovrai decidere con cosa lavorerai per la tua situazione.

Ora che avevo un po 'di spazio /boot, sono stato in grado di correre

apt-get -f install 

Per ripulire l'installazione non riuscita di 2.6.32-56-server.

Poi ho fatto un

apt-get remove linux-headers-2.6.32-38 linux-headers-2.6.32-38-server linux-image-2.6.32-38-server
apt-get remove linux-headers-2.6.32-39 linux-headers-2.6.32-39-server linux-image-2.6.32-39-server

Questo mi ha dato spazio per rimettere in ordine ciò di cui avevo effettuato il backup.

tar -xf ~username/boot.tar
rm  ~username/boot.tar    

Per ripulire, allora potrei eseguire:

apt-get autoremove

Ho riavviato e ora sto usando il 4% di /boot.


Questo è stato il più utile per me tra tutti i suggerimenti. Grazie mille!
Joshua F. Rountree,

la rimozione di file da / boot interrompe orribilmente apt e dpkg poiché i loro script di installazione e rimozione non riescono DURO quando mancano i file. Non vedo come hai fatto a farlo funzionare.
FizxMike,

20

Puoi usare dpkginvece di apt-getrimuovere i kernel più vecchi:

sudo dpkg -r linux-image-3.2.0-29-generic

Forse ci sono problemi per l'utilizzo di questo, ma il suggerimento di @mreiter ha funzionato per me quando questo non ha funzionato (questo è stato suggerito sul canale di supporto IRC di Ubuntu.)
Aaron Hall

3
@AaronHall Questa risposta contiene semplicemente la parte chiave della risposta di mreiter (l'ultima riga) ed è molto più breve in quanto non copre la pulizia delle intestazioni (che non aiuta in caso di /bootpartizione separata ).
Melebio

9

Ho notato che c'erano ancora alcuni file delle vecchie versioni nella directory di avvio:

$ ls /boot
vmcoreinfo-2.6.31-17-server

E il gestore pacchetti avrebbe elencato le vecchie versioni:

dpkg -l | grep linux-image

Ho quindi utilizzato questo comando ( autoremoverimuoverei anche le immagini più recenti che non desidero rimuovere)

sudo apt-get purge linux-image-2.6.31-17-server

Mi restavano ancora alcune intestazioni:

dpkg -l | grep linux-headers

Quindi ho fatto questo:

sudo apt-get purge linux-headers-2.6.32-34

Alla fine era rimasto un pacchetto che non potevo rimuovere con apt-get purge:

$ dpkg -l | grep linux-image
rc  linux-image-2.6.28-11-server

Fonte: rimuove un pacchetto contrassegnato come rc da dpkg

sudo dpkg --purge linux-image-2.6.28-11-server

3

Controlla l'uso di /var/tmpcon du -sh /var/tmp/. Tutti i file in quella cartella possono essere eliminati per fare spazio.

È quindi possibile eseguire quanto segue per rimuovere i vecchi kernel:

sudo apt-get clean
sudo apt install byobu
sudo purge-old-kernels
sudo apt autoremove
sudo update-grub

Cosa /var/tmpc'entra con i vecchi kernel? E non è sempre sicuro cancellare tutto in /var/tmp...
fosslinux il

3

Questo è quello che ho usato:

sudo apt-get autoremove linux-image-xxxx

Fallo per tutti i vecchi kernel e mantieni solo i due più recenti.

Se vuoi rimuovere automaticamente i vecchi kernel e aggiornare GRUB vedi questo: Documentazione Ubuntu


2
Questa dovrebbe essere la risposta accettata. Se non ti dispiace ripulire tutto, non è nemmeno necessario specificare l'immagine di Linux.
CyberEd

2

Ho scoperto che l'unica cosa che ha funzionato per me era usare Aptitude.

sudo aptitude

Quindi quando si apre di solito dice qualcosa sulle dipendenze non soddisfatte sul fondo. Puoi premere la lettera gper procedere con la rimozione suggerita. Ti porterà a una pagina in cui elenca cosa sta per succedere.

Dovrebbe esserci un segno meno -accanto ai kernel rotti. Premere di gnuovo e rimuoverà i kernel rotti. Premere qper uscire. Quindi dovresti essere in grado di utilizzare sudo apt-get autoremoveper sbarazzarti dei vecchi kernel e liberare spazio.


1
questa è l'UNICA risposta valida. tutte le altre risposte non hanno funzionato, in quanto il gestore dei pacchetti voleva installare un pacchetto prima che potesse rimuovere qualsiasi cosa.
machineaddict,

2

Non puoi agire sui pacchetti, ma puoi agire su altri file. Per prima cosa, vai nella tua cartella home e vedi se c'è qualcosa che puoi eliminare. In caso contrario, prova a spostare una buona quantità di file in un'altra partizione (o in un'unità flash), quindi prova sudo apt-get install -fa ripulire i problemi di dipendenza del pacchetto (molto probabilmente hai installato un file .deb dpkg), quindi elimina i vecchi kernel. Una volta che hai almeno 10 MB di sicurezza, prova a eliminare software o file non necessari.


5
La cartella home non è in / boot
Thorbjørn Ravn Andersen

1

Usa Synaptic Package Manager. Basta scegliere il pacchetto che si desidera rimuovere e ti chiederà di rimuovere anche i pacchetti che dipendono da esso. Nella mia esperienza, i pacchetti del kernel vengono sempre in gruppi di due (o più, a seconda di come si conta) che sono interdipendenti. Di solito puoi trovare rapidamente quelli vecchi usando il filtro "locale / obsoleto".


2
Ad esempio su un server (solo testo), non c'è Synaptic. Quindi non è davvero una soluzione praticabile per i server.
nerdoc,

1

Ho lottato con questo problema di tanto in tanto, e ancora non ho visto alcuna soluzione che effettivamente fa il lavoro completo. In alcuni casi, rimuovere i vecchi kernel finisce in dipendenze che mi impediscono di rimuovere qualsiasi cosa e ho dovuto rimuovere i kernel manualmente da / boot. Tuttavia, volevo comunque fare il lavoro completo poiché immagino che i kernel eliminati manualmente vengano registrati da qualche parte e possano causare problemi futuri, quando qualcosa segnala che mancano dei file a causa mia mentre sono seduto facendo rm -rf sui file.

Quindi ho scritto questo script, basato su molti suggerimenti su Google che non richiedono ulteriori installazioni di qualcosa. Lo script è stato modificato alcune volte per supportare alcune mie situazioni "inaspettate". Ad esempio, eseguendolo su un raspberry pi, probabilmente update-grub non esiste. E in alcuni casi durante l'esecuzione degli ultimi programmi di aggiornamento, i server erano bloccati con IPv6 in cui alcuni siti non erano raggiungibili.

Lo script capisce se deve rimuovere forzatamente i kernel che sono completamente bloccati a causa di build di dipendenze, o se può farlo nel modo "giusto".

#!/bin/bash

ipv4="-o Acquire::ForceIPv4=true"

if [ "$1" = "4" ] ; then
    withip=$ipv4
    echo "Going IPv4 ($withip)"
fi

echo "Autoremove+Purge."
apt-get $withip -y -f autoremove --purge >/dev/null 2>&1

if [ "$?" != "0" ] ; then
    echo "Auto Removal Failed!"
fi

echo "Old dependency fix."
apt-get $withip -f -y install >/dev/null 2>&1

if [ "$?" != "0" ] ; then
    echo "That failed. So we'll try to make up to it during this process."
fi

echo "Now, going old kernel cleanup!"
kern=$(dpkg --list 'linux-image*'|awk '{ if ($1=="ii") print $2}'|grep -v `uname -r`)
hadErrors=0

for k in $kern
do
    echo apt-get -y purge $k
    apt-get $withip -y purge $k >/dev/null 2>&1

    if [ "$?" != "0" ] ; then
        echo "Failed apt-purge... Using plan B (--force-all -P)..."
        dpkg --force-all -P $k >/dev/null 2>&1
        echo "Rerunning stuff (apt-get -f -y install) for dependencies..."
        apt-get $withip -f -y install >/dev/null 2>&1
        if [ "$?" != "0" ] ; then
            echo "Still failing..."
            hadErrors=1
        fi
    fi
done

if [ "$hadErrors" = "1" ] ; then
    echo "I had errors. I should rerun this process, to see if there are more kernels that were left out after cleanup..."
    /usr/local/tornevall/cleankernel
fi

apt-get $withip autoremove
apt-get $withip update
apt-get $withip upgrade
apt-get $withip dist-upgrade

grb=$(which update-grub)
if [ "" != "$grb" ] ; then
    update-grub
else
    echo "Can't upgrade grub since update-grub is missing..."
fi

Hai provato a eliminare Linux ? Tuttavia, al momento non ha quell'elemento Force IPv4.
jarno,

Il tuo script eliminerebbe linux-image-generic nel mio sistema, il che è male.
jarno,

Per qualche motivo vengono rimessi quando i vecchi kernel sono stati ripuliti. Almeno questo è stato il caso per me da quando ho creato questo script. Tuttavia, questo script è qualcosa che uso quando non ci sono altre opzioni per procedere. Normalmente, gli aggiornamenti si prendono cura di questo da soli, ma quando si tratta di questo momento, quando nient'altro funziona, questa potrebbe essere una buona opzione in quanto di solito arrivano più kernel che verranno impostati dopo la pulizia. Se questo è buono o cattivo è probabilmente discutibile.
Tomas Tornevall,

0

La semplice esecuzione ha sudo apt-get -f autoremoverisolto il mio problema.


2
Hai avuto il 100% di spazio su disco / utilizzo di avvio?
Fosslinux,

Guardando la mia cronologia di monitoraggio, non sembrava. PS: Sono su Vagrant xenial e il mio file system di avvio /dev/sda1è montato/
forzagreen

0

Esegui questo:

sudo apt-get autoremove
sudo apt-get --purge remove && sudo apt-get autoclean
sudo apt-get -f install
sudo dpkg-reconfigure -a

Fonte: ottengo questo errore dopo l'aggiornamento. per favore aiuto


cosa fa sudo dpkg-reconfigure -a questo fa? Su Ubuntu 16 dice l'opzione sconosciuta -a
Shivam Kotwalia,

Per questa domanda, aptnon riuscirà a rimuovere i pacchetti del kernel perché il processo di rimozione stesso genera file /boot, che è già pieno. Ecco perché apt-get autoremovefallisce. La domanda che stai cercando è askubuntu.com/q/142926/158442 , che ha già autoremoveelencato.
Muru,

@muru L'ho appena pubblicato perché ha funzionato, per me: D
Ardi Nusawan,

Ne sono sicuro, quello che sto dicendo è che il tuo problema sarebbe stata l'altra domanda, non questa.
Muru,

@muru oh ok capito: D
Ardi Nusawan

0

Ho visto un paio di articoli su / boot essere pieni che non è risolto da dpkg che cancella i vecchi kernel di Linux, perché apt-get -f install o apt-get -f autoremov e reinstalla i kernel.

Nel mio caso, almeno, anche i pacchetti firmati ed extra dovevano essere rimossi - i kernel erano dipendenze per questi pacchetti, quindi per reinstallarli. Generalmente, i pacchetti del kernel correlati dovrebbero essere eliminati prima di chiamare 'install'. Se hai provato ad apt-get upgrade subito dopo l'eliminazione, il messaggio di errore avrebbe dovuto dire quali pacchetti avevano una dipendenza non soddisfatta del kernel che hai appena eliminato.

Nel mio caso, la seguente tattica ha funzionato:

#as sudo, repeat 1-3 for any old kernels; can be scripted
dpkg --force-all -P linux-image-4.4.0-112-generic 
dpkg --purge linux-image-extra-4.4.0-112-generic
dpkg --purge linux-signed-image-4.4.0-112-generic
apt-get -f install #dependency resolution didn't have work to do for kernel packages
apt-get autoremove --purge -f 
apt-get autoclean
apt-get upgrade

0

Installa lo strumento Linux-Purge in questo modo .

Quindi eseguire nel terminale:

sudo linux-purge --clear-boot --fix

Quindi continua a rimuovere i kernel ad es

sudo linux-purge --keep 1 --choose

Extra:

Se vuoi usare linux-purge per la rimozione automatica del kernel invece di usare gli aggiornamenti automatici per questo, dovresti disabilitare la rimozione di cose inutilizzate modificando /etc/apt/apt.conf.d/50unattended-upgrades e impostare un servizio systemd esecuzione

/usr/local/bin/linux-purge --auto-only --keep 1 --yes

quando vuoi.

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.