Minha partição / boot atingiu 100% e agora não consigo atualizar. Não é possível remover os kernels antigos para liberar espaço

154

Meu primeiro problema foi quando tentei apt-get updateou apt-get upgrade. Na atualização, recebo o seguinte erro:

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.

Eu tentei executar o apt-get install -f e esta foi a saída (depois de dizer sim no 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)

Eu tentei correr apt-get autoremovee isso me dá o mesmo erro que apt-get upgrade.

Quando corro df, recebo isso para /boot:

/dev/sda1                    233191     230297         0 100% /boot

Então, li em outro lugar que eu deveria tentar limpar os kernels antigos. Eu verifiquei quais kernels eu tinha com:

$ 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 tento remover o mais antigo com isso:

$ 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).

Como posso liberar ou estender a inicialização sem atrapalhar minha instalação?

Strifey16
fonte
Acho que a resposta do @ mreiter pode ser a melhor: ele usa o gerenciador de pacotes e funcionou quando outros comandos do gerenciador de pacotes falharam, pelo menos para mim: askubuntu.com/a/205776/247661
Aaron Hall
1
@dskrvk Yes! Por que Remove-Unused-Dependenciesnão é o padrão?
Steven R. Loomis

Respostas:

130

Liberando espaço no sistema de arquivos raiz

Para liberar espaço no sistema de arquivos raiz, você pode tentar executar apt-get clean.

Se isso não funcionar, você pode acessar /var/cache/apt/archivese remover manualmente alguns arquivos do cache para recuperar algum espaço, por exemplo:

sudo rm linux-headers-*

Não vai doer remover todos os .debarquivos aqui, se você precisar - é o que apt-get cleanfaz. Eles serão automaticamente baixados aptnovamente se forem necessários novamente.

Liberando espaço no sistema de arquivos / boot

O Pôster original possui uma /bootpartição separada , e é isso que está cheio e impedindo o aptfuncionamento do sistema. Será necessário liberar espaço lá.

Se houver espaço suficiente, acesse /boote remova um ou mais arquivos de configuração:

sudo rm config-3.2.0-19-generic-pae

por exemplo, mas usando o nome de uma das versões do kernel que você deseja remover de qualquer maneira. Isso liberará um pouco de espaço (cerca de 144 mil cada).

Se você precisar de mais espaço remover individualmente velhos vmlinuz, initrd, abie System.maparquivos até que você tenha espaço suficiente (cerca de 22M para um dos meus versões do kernel i386).

Faça o que fizer, não remova todos eles . Você deve pelo menos manter as duas últimas versões correspondentes de cada tipo de arquivo, para cada tipo de kernel que você usa.

Em seguida, prossiga com os comandos do apt-get install. Como mencionado acima, eles podem ter que baixar novamente algumas das debs que você excluiu, mas, se for o caso, isso acontecerá automaticamente. Quando você tiver o apt trabalhando novamente, limpe usando o apt-get para remover os pacotes correspondentes aos arquivos que você removeu - para que tudo corresponda.


O arquivo de configuração /booté a configuração do kernel que foi usada pela equipe do kernel para criar o kernel com o mesmo nome. Deve ser inofensivo removê-lo, a menos que você o queira para referência ou para ajudá-lo a construir seus próprios núcleos.

Finalmente, você está removendo manualmente um ou mais pacotes do kernel antigo da /bootpartição para liberar ainda mais espaço para o novo.

John S Gruber
fonte
Eu tentei remover quase todas as configurações. Ainda não parece ter espaço suficiente. Quais outros arquivos seriam seguros para remover? Meu sistema de arquivos raiz não está nem perto do cheio, então não estou preocupado com isso.
Strifey16
Atualizei minha resposta com os outros arquivos para remover manualmente. Parece-me que remover os conjuntos 3.0.0.13 e 3.0.0.14 (cinco arquivos no conjunto, incluindo o arquivo abi) seria suficiente.
John S Gruber
2
Isso consertou. Percebi que provavelmente se trataria de remover arquivos manualmente, mas sempre hesito em fazer isso com qualquer coisa instalada pelo apt, então pensei em perguntar aqui primeiro.
precisa saber é o seguinte
9
Não use sudo rmpara remover de / boot. Em vez disso, use sudo dpkg --purgepara remover alguns pacotes antigos de imagem linux. Depois disso, use sudo apt-get -f installpara corrigir a dependência quebrada.
9136 jarno
4
Embora em algum momento o sistema esteja tão cheio que nem o dpkg possa funcionar. Mas rmpode ser usado então.
Jarno
66

No meu caso, os aptcomandos e dpkgcomandos não puderam terminar e não puderam ser removidos. A atualização automática falhou na instalação 2.6.32-56-server.

Meu primeiro passo, foi identificar o espaço a ser usado,

cd /boot
du -sk *|sort -n

Eu tinha cerca de 30 kernels e arquivos de suporte.

Eu fiz um uname -apara obter o kernel em execução, identifiquei que estava no Linux alternativo 2.6.32-43-servere fiz uma tardas 6 versões que não estavam em execução e eram antigas.

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

Fiz então rm -rfo que havia feito 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

Estou mostrando esses comandos como exemplos, você terá que decidir com o que trabalhará para sua situação.

Agora que eu tinha algum espaço /boot, eu era capaz de correr

apt-get -f install 

Para limpar a instalação com falha do 2.6.32-56-server.

Então eu fiz um

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

Isso me deu espaço para devolver o que eu havia feito backup.

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

Para limpar, eu poderia executar:

apt-get autoremove

Eu reiniciei e agora estou usando 4% de /boot.

AG Russell
fonte
Este foi o mais útil para mim dentre todas as sugestões. Muito obrigado!
Joshua F. Rountree
a remoção de arquivos de / boot interrompe terrivelmente o apt e o dpkg, pois os scripts de instalação e remoção falham HARD quando os arquivos estão ausentes. Não vejo como você conseguiu isso.
FizxMike
20

Você pode usar em dpkgvez de apt-getremover os kernels antigos:

sudo dpkg -r linux-image-3.2.0-29-generic
psusi
fonte
Talvez haja pontos positivos para a utilização deste, mas a sugestão de @ mreiter trabalhou para mim quando este não fez (este foi sugerido no canal IRC do Ubuntu.)
Aaron Hall
3
@AaronHall Esta resposta simplesmente contém a parte principal da resposta do mreiter (a última linha) e é muito mais curta, pois não cobre a limpeza de cabeçalhos (o que não ajuda no caso de /bootpartição separada ).
Melebius 06/04
9

Notei que ainda havia alguns arquivos das versões antigas no diretório de inicialização:

$ ls /boot
vmcoreinfo-2.6.31-17-server

E o gerenciador de pacotes listaria as versões antigas:

dpkg -l | grep linux-image

Portanto, usei esse comando ( autoremovetambém removeria imagens mais recentes que não desejo remover)

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

Eu ainda tinha alguns cabeçalhos:

dpkg -l | grep linux-headers

Então eu fiz isso:

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

Finalmente, havia um pacote que não consegui remover com o apt-get purge:

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

Fonte: Remova um pacote marcado como rc pelo dpkg

sudo dpkg --purge linux-image-2.6.28-11-server
mreiter
fonte
3

Verifique o uso de /var/tmpcom du -sh /var/tmp/. Todos os arquivos nessa pasta podem ser excluídos para liberar espaço.

Você pode executar o seguinte para remover os kernels antigos:

sudo apt-get clean
sudo apt install byobu
sudo purge-old-kernels
sudo apt autoremove
sudo update-grub
Tertius
fonte
O que /var/tmptem a ver com kernels antigos? E nem sempre é seguro excluir tudo em /var/tmp...
fosslinux
3

Isto é o que eu usei:

sudo apt-get autoremove linux-image-xxxx

Faça isso para todos os kernels antigos e mantenha apenas os dois mais recentes.

Se você deseja remover automaticamente os kernels antigos e atualizar o GRUB, consulte: Documentação do Ubuntu

Samer
fonte
2
Essa deve ser a resposta aceita. Se você não se importa em limpar tudo, nem precisa especificar a imagem do Linux.
CyberEd
2

Descobri que a única coisa que funcionava para mim era usar o Aptitude.

sudo aptitude

Então, quando abrir, geralmente dirá algo sobre dependências não atendidas na parte inferior. Você pode pressionar a letra gpara prosseguir com a remoção sugerida. Ele o levará a uma página onde ele lista o que vai acontecer.

Deve haver um sinal de menos -ao lado dos grãos quebrados. Pressione gnovamente e ele removerá os grãos quebrados. Pressione qpara sair. Então você poderá usar sudo apt-get autoremovepara se livrar dos kernels antigos e liberar espaço.

Matthew Swanson
fonte
1
esta é a única resposta válida. todas as outras respostas não funcionaram, pois o gerenciador de pacotes queria instalar um pacote antes que ele pudesse remover qualquer coisa.
machineaddict
2

Você não pode agir sobre pacotes, mas pode agir sobre outros arquivos. Primeiro, acesse sua pasta pessoal e veja se há algo que você possa excluir. Caso contrário, tente mover uma boa quantidade de arquivos para outra partição (ou uma unidade flash) e tente sudo apt-get install -flimpar os problemas de dependência de pacotes (provavelmente você instalou um arquivo .deb dpkg) e limpe todos os kernels antigos. Depois de ter pelo menos 10 MB com segurança, tente remover softwares ou arquivos desnecessários.

ζ--
fonte
5
A pasta de casa não é em / boot
Thorbjørn Ravn Andersen
1

Use o Synaptic Package Manager. Basta escolher o pacote que você deseja remover e ele solicitará que você também remova os pacotes que dependem dele. Na minha experiência, os pacotes do kernel sempre vêm em grupos de dois (ou mais, dependendo de como você conta) que são interdependentes. Geralmente, você pode encontrar antigos rapidamente usando o filtro "local / obsoleto".

Wegko
fonte
2
Por exemplo, em um servidor (somente texto), não há Synaptic. Portanto, não é realmente uma solução viável para servidores.
Nerdoc 31/08/19
1

Eu tenho lutado com esse problema de tempos em tempos e ainda não vi nenhuma solução que realmente faça o trabalho completo. Em alguns casos, a remoção de kernels antigos acaba em dependências que me impedem de remover qualquer coisa e eu tive que remover manualmente os kernels do / boot. No entanto, eu ainda queria fazer o trabalho completo, pois imagino que os kernels excluídos manualmente estão registrados em algum lugar e podem causar problemas futuros, quando algo relata arquivos ausentes por causa de mim sentado rm -rf nos arquivos.

Então, eu escrevi esse script, com base em muitas sugestões pesquisadas aqui que não exigem nenhuma instalação adicional de algo. O script foi modificado algumas vezes para suportar algumas das minhas próprias situações "inesperadas". Por exemplo, executando isso em um raspberry pi, o update-grub provavelmente não existe. E, em alguns casos, ao executar os últimos atualizadores, os servidores estavam presos ao IPv6, onde alguns sites estavam inacessíveis.

O script calcula se é necessário remover com força os kernels completamente bloqueados devido à criação de dependências, ou se é possível fazê-lo da maneira "correta".

#!/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
Tomas Tornevall
fonte
Você tentou o linux-purge ? No entanto, ele não tem essa coisa do Force IPv4 atualmente.
jarno 14/08
Seu script eliminaria linux-image-generic no meu sistema, o que é ruim.
jarno 14/08
Por algum motivo, eles são recolocados quando os núcleos antigos foram limpos. Pelo menos esse tem sido o meu caso desde que construí esse script. No entanto, esse script é algo que eu uso quando não há outras opções para prosseguir. Normalmente, as atualizações estão cuidando disso sozinhas, mas quando chega esse momento, quando nada mais funciona, isso pode ser uma boa opção, pois geralmente existem mais kernels que serão configurados após a limpeza. Se isso é bom ou ruim provavelmente é discutível.
Tomas Tornevall 27/09
0

A simples execução sudo apt-get -f autoremoveresolveu o meu problema.

forzagreen
fonte
2
Você tinha 100% de espaço em disco / uso de inicialização?
fosslinux
Olhando para o meu histórico de monitoramento, não parecia. PS: Eu estou no Vagrant hospitaleiro, e meu sistema de arquivos de inicialização /dev/sda1é montado sobre/
forzagreen
0

Rode isto:

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

Fonte: Recebo esse erro após a atualização. por favor ajude

Ardi Nusawan
fonte
o que o sudo dpkg-reconfigure -a isto faz? No Ubuntu 16 o diz desconhecido opção -a
Shivam Kotwalia
Para esta pergunta, aptfalha ao remover os pacotes do kernel porque o próprio processo de remoção gera arquivos /boot, que já estão cheios. É por isso que apt-get autoremovefalha. A pergunta que você está procurando é askubuntu.com/q/142926/158442 , que já está autoremovelistada.
muru
@muru Acabei de publicar porque fez o truque para mim: D
Ardi Nusawan
Tenho certeza que sim, o que estou dizendo é que seu problema teria sido a outra pergunta, não essa.
muru
@muru oh ok entendi: D
Ardi Nusawan
0

Eu vi alguns artigos no / boot estarem cheios, o que não é resolvido pelo dpkg eliminando os kernels antigos do linux, porque o apt-get -f install ou o apt-get -f autoremov reinstala os kernels.

No meu caso, pelo menos, os pacotes assinados e extras também precisavam ser removidos - os kernels eram dependências desses pacotes, portanto, eles foram reinstalados. Geralmente, os pacotes do kernel relacionados devem ser eliminados antes de chamar 'install'. Se você tentou fazer o apt-get upgrade logo após a limpeza, a mensagem de erro deveria dizer quais pacotes tinham uma dependência não atendida do kernel que você acabou de limpar.

No meu caso, a seguinte tática funcionou:

#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
Rhandi Martin
fonte
0

Instale a ferramenta linux-purge como esta .

Em seguida, execute no terminal:

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

Em seguida, continue removendo os kernels, por exemplo

sudo linux-purge --keep 1 --choose

Extra:

Se você deseja usar o linux-purge para remoção autônoma do kernel, em vez de usar atualizações autônomas para isso, desabilite a remoção de itens não utilizados editando /etc/apt/apt.conf.d/50unattended-upgrades e configure um serviço systemd executando

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

quando você quiser.

jarno
fonte