Qual é a maneira mais segura de limpar a partição de inicialização / inicialização?

274

Tenho 200 MB atribuídos para a /bootpartição. Sempre que tento atualizar o kernel, recebo uma mensagem de erro que basicamente diz que /bootestá cheia.

O que posso fazer para /bootlimpar e remover / fazer backup dos kernels antigos?

koba101
fonte
1
Veja a Wiki da comunidade Ubuntu
jarno 22/16/16
Se / boot estiver cheio, consulte askubuntu.com/questions/263363/…
nslntmnx

Respostas:

335

Método de linha de comando:

Primeiro verifique sua versão do kernel, para não excluir a imagem do kernel em uso, executando:

uname -r

Agora execute este comando para obter uma lista dos kernels instalados:

dpkg --list 'linux-image*' | grep ^ii

e exclua os kernels que você não deseja / precisa executando:

sudo apt-get remove linux-image-VERSION

Substitua VERSION pela versão do kernel que você deseja remover.

Quando você terminar de remover os kernels mais antigos, poderá executar isso para remover todos os pacotes desnecessários:

sudo apt-get autoremove

E, finalmente, você pode executar isso para atualizar a lista do kernel do grub:

sudo update-grub
PeppeDAlterio
fonte
34
sudo dpkg --list 'linux-image*' | grep ^iitorna um pouco mais fácil ver apenas os kernels instalados. Também acho que update-grubé inofensivo, mas não estritamente necessário, que é executado automaticamente quando você desinstala um kernel.
Nelson
9
Use sudo dpkg --list 'linux-image*' | grep ^ii | awk '{print $2}' | sort | egrep "[0-9]-generic" | head -n -3 | tr '\n' ' '; echo ""para obter a lista de nomes de pacotes a serem usados sudo apt-get remove. head -n -3é usado para manter os 3 núcleos mais recentes restantes no sistema.
Sithsu
2
meu liner simples::apt-get remove `dpkg --list 'linux-image*' |grep ^ii | awk '{print $2}'\ | grep -v \`uname -r\``
gcb
27
sudo apt-get autoremovedeve ser suficiente (geralmente deixando-o com os 3 últimos kernels)
MBX
6
Esta é uma boa resposta, mas duvido que possa funcionar na maioria dos casos (se não todos): o problema é que /bootestá cheio, por apt-getisso falhará com algum código de erro ou outro. A resposta abaixo é um pouco "hackier" (Devo confessar que eu tinha que me preparar para emitir que rm -rfem /boot), mas o único que é provável que trabalhar nesta situação.
Marco
284

NOTA: isto é apenas se você não puder usar o apt para limpar devido a uma inicialização 100% completa

Se o apt-get não estiver funcionando porque o seu / boot está em 100%, será necessário limpar / inicializar primeiro. Provavelmente, houve uma atualização do kernel em uma instalação parcial, o que significa que o apt praticamente congelou completamente e continuará dizendo para você executar, apt-get -f installmesmo que esse comando continue falhando.

Obtenha a lista de imagens do kernel e determine o que você pode fazer sem. Este comando mostrará os kernels instalados, exceto o atualmente em execução sudo dpkg --list 'linux-image*'|awk '{ if ($1=="ii") print $2}'|grep -v `uname -r`. Observe as duas versões mais recentes da lista. Você não precisa se preocupar com o que está sendo executado, pois ele não está listado aqui. Você pode verificar isso com uname -r.

Crie um comando para excluir todos os arquivos em / boot para kernels que não importam para você usando a expansão de chaves para mantê-lo saudável. Lembre-se de excluir a atual e as duas imagens mais recentes do kernel. Exemplo: sudo rm -rf /boot/*-3.2.0-{23,45,49,51,52,53,54,55}-*. Você também pode usar um intervalo com a sintaxe {80..84}.

sudo apt-get -f install para limpar o que está deixando o apt mal-humorado com uma instalação parcial.

Se você encontrar um erro que inclua uma linha como "Erro interno: não foi possível encontrar a imagem (/boot/vmlinuz-3.2.0-56-generic)", execute o comando sudo apt-get purge linux-image-3.2.0-56-generic(com a versão apropriada).

Finalmente, sudo apt-get autoremovepara limpar os pacotes antigos de imagens do kernel que ficaram órfãos pela limpeza manual da inicialização.

Sugestão, execute sudo apt-get updatee sudo apt-get upgradecuide de todas as atualizações que podem ter sido copiadas enquanto aguarda a descoberta da partição completa / inicialização.

Sugestão2, reveja https://help.ubuntu.com/community/AutomaticSecurityUpdates e considere configurar a Atualização autônoma :: Remover-Não-Dependências-dependentes como verdadeira em /etc/apt/apt.aptf.d/50unattended-upgrades. Isso equivale a executar a remoção automática após cada atualização de segurança para garantir que você limpe os kernels não utilizados, mas também removerá outras coisas que considera não utilizadas, poupando-o desse problema no futuro.

flickerfly
fonte
3
Desta forma, eu tenho o mais recente para a próxima reinicialização e, em seguida, o anterior, apenas no caso de algo quebrar nessa. Normalmente, tenho muito espaço para não machucar ter alguns e isso satisfaz minha paranóia por não ter opções de backup suficientes em qualquer cenário.
Flickerfly
1
Eu nunca tive um problema causado por atualizações autônomas. Eu posso imaginar cenários em que isso poderia ser um problema, principalmente devido à perda de dependências em instalações não-deb-pack. Esta versão possui dependências fornecidas pela instalação anterior, mas o apt não sabe que ainda é necessário. Na próxima vez que você executar a remoção automática, essas dependências desaparecerão. Se automatizado, isso pode ser um pouco confuso. Se você não instalar fora dos repositórios, acredito que seja totalmente seguro.
Flickerfly
3
Depois de ver isso em vários servidores virtuais do vsphere (onde os kernels estavam sendo atualizados automaticamente, mas não removidos posteriormente), escrevi um script python para automatizá-lo. Eu adoraria ter mais olhos sobre ele
EvanK
2
Se você usar dpkg --purgeem um boot completo você terá o seguinte $ sudo dpkg --purge linux-image-3.13.0-65-generic dpkg: dependency problems prevent removal of linux-image-3.13.0-65-generic: linux-image-extra-3.13.0-65-generic depends on linux-image-3.13.0-65-generic. dpkg: error processing package linux-image-3.13.0-65-generic (--purge): dependency problems - not removing Errors were encountered while processing: linux-image-3.13.0-65-generic
flickerfly
1
Após a limpeza / inicialização, o apt-get install -f ainda não funcionou. Usando df -ieu descobri que eu também estava ficando sem inodes em /causa da enorme quantidade de arquivos para o código fonte de kernels mais antigos em/usr/src
Kristofer
51

Há documentação sobre isso em https://help.ubuntu.com/community/RemoveOldKernels

Em resumo: Use

sudo apt-get autoremove --purge
# and/or:
sudo purge-old-kernels

A purge-old-kernelsferramenta pode ser instalada via sudo apt install byobu. Aqui está a descrição da sua página de manual:

Este programa removerá pacotes antigos de kernel e cabeçalho do sistema, liberando espaço em disco. Ele nunca removerá o kernel atualmente em execução. Por padrão, ele manterá pelo menos os 2 kernels mais recentes, mas o usuário pode substituir esse valor usando o --keep parâmetro

Se você deseja uma solução copiar e colar, o ReSearchIT Eng sugeriu o seguinte:

sudo apt install -y byobu
sudo purge-old-kernels -y --keep 1
sudo apt-get -y autoremove --purge
peq
fonte
3
No meu caso apt não está funcionando devido a um kernel pendente ea correção sugerida é um catch-22:
James Bowery
Primeiro tive que consertar pacotes quebrados com askubuntu.com/a/304388/284313 Depois disso, sua solução funcionou.
James Bowery
3
Eu acho que essa deve ser a solução aceita a partir de agora.
27517 Fran Franzozo
3
isso é muito mais seguro que a resposta aceita. Eu acho que apt-get autoremove --purgedeveria ser suficiente, no entanto.
Woodrow Barlow
7

Eu descobri que é muito mais fácil abandonar a pequena partição e mudar /bootpara a raiz. Isso também evita problemas de falta de espaço no futuro.

Primeiro, mova seus dados da partição de inicialização para raiz (execute como sudo -s):

cp -a /boot /boot2
umount /boot
rmdir /boot
mv /boot2 /boot

Remova (ou comente) a /bootentrada em /etc/fstab:

vim /etc/fstab

Atualize o grub e verifique se está tudo correto:

update-grub

apt agora deve poder atualizar sem problemas.

Isso deixa uma partição de 200mb não utilizada (que você pode usar para outra coisa se achar que vale a pena).

Laktak
fonte
5
É uma boa ideia, mas não funciona se você deseja ter criptografia de disco completo para sua partição raiz.
Paŭlo Ebermann 9/11
Sim, existem casos em que / boot deve ser uma partição separada. Outro exemplo foi que o Grub não pôde carregar anteriormente de uma partição LVM.
Bastion
4

Removendo Kernels antigos (para liberar espaço no / boot), consulte: http://askubuntu.com/questions/89710/how-do-i-free-up-more-space-in-boot

sudo apt-get purge $(dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve "$(uname -r | sed -r 's/-[a-z]+//')")

Então corra

sudo apt-get update
Amos Folarin
fonte
1
este foi o único que funcionou .... ótima solução #
John
Melhor resposta! Esta é a única solução que funcionou para mim; autoremove é estúpido; ele tenta reinstalar todos os kernels com dependências não atendidas antes de removê-los oficialmente. Eu andava em círculos ficando sem espaço uma e outra vez. Esta resposta é ouro.
Lonnie Melhor
3

sudo apt-get autoremove

Isso remove todos, exceto os 2 últimos kernels. Testado no Ubuntu 16.04 LTS quando /bootestava com 100% da capacidade e apt-get upgradefalhou em sua última atualização do kernel. A remoção automática do kernel é iterativa; portanto, se você tiver vários kernels, eles serão removidos um de cada vez. Então seja paciente.

DeepSpace101
fonte
1

Por que fazer manualmente quando você pode fazer isso com uma ferramenta? Você sabe que precisará disso novamente em 30 segundos, porque leva 30 segundos para eles enviarem uma nova atualização de kernal hoje em dia = P

Eu recomendo usar esta ferramenta, bootnukem

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

Então

sudo bootnukem --dry-run

Remova --dry-runquando confirmar que parece seguro

Jonathan
fonte