Questão Como faço para remover versões antigas do kernel para limpar o menu de inicialização?


Toda vez que eu instalo um novo kernel Linux, ele fica no grub_config, tornando o menu de inicialização mais longo a cada vez.

Eu sei que posso pesquisar manualmente através dos pacotes instalados e removê-los.

O Ubuntu oferece alguma maneira mais fácil de limpá-los ou impedi-los de aparecer na lista de inicialização?


658


origem


Além de remover os kernels antigos, remova o comentário desta linha /etc/default/grub se você quiser se livrar dos itens de "recuperação" no menu: # GRUB_DISABLE_LINUX_RECOVERY = "true" - poolie
Em lançamentos recentes, o Ubuntu esconde kernels no submenu do Grub, então não é tão intrusivo. Entretanto, pode ser uma boa ideia remover kernels extras para economizar espaço, especialmente se você tiver uma partição pequena / boot separada. - jarno
Existe um comando do ubuntu, chamado purge-old-kernels, para fazer o trabalho. Ver meu responda Para maiores informações. - jarno
sudo apt-get autoremove deve fazer o truque no Ubuntu 14.04+ - hobs
O acúmulo de kernels antigos é um bug, com correção em andamento: bugs.launchpad.net/bugs/1357093 . Quando a correção for liberada, os kernels mais antigos serão automaticamente removidos por padrão. - user535733


Respostas:


16.04 e versões mais recentes do Ubuntu

sudo apt autoremove

Esse comando remove pacotes que foram instalados automaticamente para resolver uma dependência, mas agora não dependem mais. Isso inclui versões antigas de linux-headers-* e linux-image-*. (Também é inteligente sobre esse processo, deixando uma versão extra do kernel como um substituto!)

11.10 e versões mais recentes do Ubuntu

GRUB2 e sua exibição de todos os kernels

As últimas versões de Grub2 instalado em Ubuntu exibe automaticamente o kernel mais recente e esconde os kernels mais antigos que você pode ter instalado.

GNU GRUB

Se você não vê o seu grub - então lembre-se de pressionar Mudança enquanto a inicialização.

Como você pode ver, apenas o kernel mais recente é exibido.

Se você selecionar a opção mostrada (pressione Entrar) então todos os kernels antigos ficam visíveis e disponíveis para inicializar.

GNU GRUB Previous versions 

Como excluir permanentemente kernels mais antigos

Inicialize primeiro com o kernel disponível mais recente.

Existem várias maneiras de excluir kernels antigos. Pessoalmente, eu não tocaria Zelador de computador desde que isto é reconhecido para quebrar seu computador com suas sugestões.

sináptica

Uma alternativa é Sináptica (sudo apt install synaptic)

procurar por linux-image, clique com o botão direito do mouse em um kernel e escolha a remoção completa e, finalmente, clique no Aplique botão para excluir o kernel.

Synaptic Package Manager

Repita a pesquisa, mas desta vez para linux-header - você pode excluir os cabeçalhos associados para a imagem do kernel escolhida anteriormente.

Sináptica embora não tente verificar o que você está tentando remover ... você pode excluir inadvertidamente seu kernel mais novo - ou até mesmo excluir todos os seus kernels através desta ferramenta, deixando-o com um kernel não inicializável. Ubuntu!

Lembre-se de verificar qual kernel você está usando:

uname -r

O resultado seria semelhante a:

Terminal <uname -r>

Lembre-se do resultado e do número - certifique-se de não excluir a imagem ou o cabeçalho correspondente.

Recomendação

Minha recomendação é manter pelo menos dois ou, de preferência, três kernels, incluindo o mais recente. O motivo da recomendação é que você terá pelo menos um / dois outros kernels para inicializar, se, por qualquer razão, o kernel mais recente não conseguir inicializar ou se introduzir uma capacidade regredida, como falha de rede sem fio.


569



Removendo antigos pacotes "linux-image *" usando o synaptic, funcionou bem com o 10.04 também. (Eu mencionei porque o título sugere que só pode ser para 11,10 e para cima) - mivk
a -ymudar no final do apt-get A linha é necessária, caso contrário, o apt-get apenas pede confirmação e, como a entrada é um canal, ela apenas é anulada. Então deve terminar em: | xargs sudo apt-get purge -y - Josh
Removendo cerca de 20 versões do antigo linux-image e linux-headers libertou 4,5 GB de espaço na minha máquina. - Andrew Mao
Esse método funciona bem, mas a exclusão de cada kernel regenera excessivamente o grub.cfg, o que leva tempo. Existe alguma maneira de desativar isso para exclusão em lote e, em seguida, gerar novamente uma vez? - spacediver
Eu questiono o @spacediver - este é um processo louco e lento quando você tem 38 kernels desnecessários, já que como cada um é desinstalado, ele passa por todos os demais enquanto gera um novo grub.cfg. Isso é o que chamamos de operação N ^ 2 - ela processa um kernel sobre (38 ^ 2/2) = 722 vezes e é muito lenta. Certamente o Ubuntu pode chegar a algo melhor .... - nealmcb


Primeiro, reinicie seu sistema para ter certeza de que ele está usando o kernel mais recente. Então abra o terminal e verifique seu kernel atual:

uname -r 

NÃO REMOVA ESTE KERNEL!

Em seguida, digite o comando abaixo para visualizar / listar todos os kernels instalados em seu sistema.

dpkg --list | grep linux-image 

Encontre todos os kernels que estão abaixo do seu kernel atual. Quando você souber qual kernel remover, continue abaixo para removê-lo. Execute os comandos abaixo para remover o kernel selecionado.

sudo apt-get purge linux-image-x.x.x-x-generic 

Finalmente, execute os comandos abaixo para atualizar o grub2

sudo update-grub2 

Reinicie seu sistema.


366



Ao fazer isso em 10.04 e 12.04, descobri que update-grub foi executado automaticamente durante o processo de limpeza. - aidan
de bash cinta de expansão pode ser usado, e. sudo apt-get purge linux-image-3.2.0-3{0..5}-generic (remove 30,31, .., 35) - ajo
Não há necessidade de reiniciar o sistema depois. Na verdade, você deve reiniciar o sistema antes executando estas etapas, para garantir que você esteja usando a versão mais recente do kernel que você provavelmente acabou de fazer o download e instalou (você fez uma atualização do apt-get && apt-get antes disso, certo ??) - Ricket
Você também pode querer desinstalar o linux-signed-image pacotes que podem ser instalados em sistemas UEFI: sudo apt-get purge linux-signed-image-3.11.0-{12,14,24}-generic que removeria 12, 14 e 24 - devius
@jarno Eu não sei se estou usando um kernel assinado ou não, mas uname -r não tem nenhum signed string no meu sistema. Eu pareço ter uma imagem assinada instalada e a saída disso ls comando é: /boot/vmlinuz-3.19.0-16-generic.efi.signed. - devius


Meu one-liner para remover kernels antigos (isso também libera espaço em disco)

dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p' | xargs sudo apt-get -y purge

Explicação (lembre-se | usa a saída do comando anterior como a entrada para o próximo)

  • dpkg --list lista todos os pacotes instalados
  • grep linux-image procura as imagens linux instaladas
  • awk '{ print $2 }' apenas gera a segunda coluna (que é o nome do pacote)
  • sort -V coloca os itens em ordem pelo número da versão
  • sed -n '/'`uname -r`'/q;p' imprime as linhas antes do kernel atual
  • xargs sudo apt-get -y purge purga os kernels encontrados

Desenrolando o sed invocação:

  • -n conta sed estar quieto
  • `uname -r` gera a versão atual do kernel instalado - nós a incluímos em backticks para que a saída seja incluída como parte do comando (você também pode ver isso como $(uname -r) 
  • /something/q diz parar quando você combina 'algo' (neste caso, algo é resultado de uname -r) - a / cercam uma expressão regular
  • p é impressão
  • a ; é o comando separtor, então /something/q;p diz quit quando você combina algo, então print

completamente, sed -n '/'`uname -r`'/q;p' é imprimir as linhas até coincidir com o nome atual do kernel.

Se você é paranóico (como eu), você pode fazer a última parte xargs echo sudo apt-get -y purge para que o comando para limpar os kernels antigos seja impresso, você pode verificar se nada inesperado está incluído antes de executá-lo.


Versão modificada para remover cabeçalhos:

dpkg --list | grep 'linux-image' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge
dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge

Note o sed invocação é modificada. "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")" extrai apenas a versão (por exemplo, "3.2.0-44"), sem "-genérico" ou similar de uname -r


Versão all-in-one para remover imagens e cabeçalhos (combina as duas versões acima):

echo $(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p') $(dpkg --list | grep linux-headers | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p') | xargs sudo apt-get -y purge

262



Note que é um pouco perigoso igualar a versão atual do kernel como uma expressão regular como essa: Pontos correspondem a qualquer caractere e 3.1.2-23 corresponde a 3.1.2-2 (ou é diferente). Veja também meu responda. - jarno
Aqui está uma versão all-in-one sintonizada: sudo apt-get purge $(for tag in "linux-image" "linux-headers"; do dpkg-query -W -f'${Package}\n' "$tag-[0-9]*.[0-9]*.[0-9]*" | sort -V | awk 'index($0,c){exit} //' c=$(uname -r | cut -d- -f1,2); done) Veja também meu responda. - jarno
@jarno que me ajudou muito a extender ... Parabéns ao seu forro um - Clain Dsilva
Devido a dependências não atendidas, eu precisava usá-lo com dkpg -Pem vez de. Aqui está a versão completa: dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo dpkg -P - Sebastian Sastre
NÃO NÃO FAZER ISSO! "Esse oneliner parece um pouco perigoso, mas com certeza 220 upvoters não podem estar errados!" Eu pensei comigo mesma e cegamente copiada e colada. Reinicializado, direto para o GRUB. Esse comando limpou todos os meus kernels, incluindo o que eu estava usando. Talvez eu estivesse executando um kernel em tempo real, nem consigo lembrar. Atualmente olhando em volta da minha casa por um stick USB para instalar o Ubuntu Live CD em :( - Andreas Jansson


Ubuntu 16.04+:

$ sudo apt autoremove
...
The following packages will be REMOVED:
  linux-headers-4.4.0-57 linux-headers-4.4.0-57-generic linux-image-4.4.0-57-generic linux-image-extra-4.4.0-57-generic linux-tools-4.4.0-57 linux-tools-4.4.0-57-generic

Ubuntu 15.10 e abaixo:

Eu acho que este é o caminho mais fácil e rápido. Ele mantém o kernel mais recente e mais dois:

sudo apt-get install bikeshed
sudo purge-old-kernels

Para alterar o número de kernels adicionais que são mantidos:

sudo purge-old-kernels --keep 3

55



Esse comando é um script de shell, cuja localização você pode encontrar which purge-old-kernels. - jarno
Fico feliz que eles fizeram isso muito mais fácil em 16.04! Espero que esta resposta continue subindo ... - Toby J
No Ubuntu 16.04 eu tenho purge-old-kernels sem bikeshed (ferramentas úteis aleatórias que ainda não têm um lar permanentepacote ou qualquer um em particular. Evite usar apt-get -y opção, é como fechar os olhos e esperar que tudo fique bem. Além disso Aqui é assim autoremove decide quantos kernels antigos devem ser mantidos. - Pablo Bianchi
Em 16.04, os kernels antigos são fornecidos pelo pacote byobu (dica: apt-file search purge-old-kernels). Concordou em apt-get -y, Eu vou removê-lo. - bmaupin
@ Dan desde que eu não use versões não-LTS Eu não tinha certeza exatamente quando começou. Mas posso dizer com certeza que sudo apt-get autoremove não remove os kernels em 14.04. Sinta-se livre para atualizar a resposta com a versão específica, se você sabe o que é! - bmaupin


Removendo Entradas do Grub 2 As entradas devem ser removidas editando ou removendo arquivos na pasta /etc/grub.d. O arquivo /boot/grub/grub.cfg é somente leitura e normalmente não requer edição.

Muitos Kernels? 

  • Se você não tem certeza do kernel que está usando atualmente, em um tipo de terminal uname -r.

  • Kernels removidos via APT (Synaptic, "apt-get remove", etc.) atualizarão automaticamente o grub.cfg e nenhuma ação do usuário é necessária.

  • Uma ótima ferramenta para remover kernels (e entradas de menu) é o Ubuntu-Tweak, um aplicativo GUI seguro e fácil de usar.

  • Instalar o ubuntu tweak

  • O Ubuntu-Tweak estará disponível em Aplicativos> Ferramentas do Sistema.

Remover Entradas de Kernel Antigas

  • Selecione "Package Cleaner" à esquerda e "Clean Kernel" no painel direito.

  • Pressione o botão "Desbloquear" no canto inferior direito, digite sua senha.

  • Selecione na lista exibida as imagens e cabeçalhos do kernel que você deseja remover. O kernel em uso não está listado.

  • Pressione o botão "Limpeza" no canto inferior direito para remover as imagens e cabeçalhos selecionados do kernel.

Remover sistemas operacionais do menu do Grub

  • Outros sistemas operacionais que foram removidos do computador também serão removidos do menu, uma vez que "update-grub" é executado como root.

  • Itens de menu são colocados no menu do Grub2 por scripts. Se você não quiser que outros Sistemas Operacionais sejam inseridos no menu, desative /etc/grub.d/30_osprober

  • Execute este comando para impedir que o script seja executado
    sudo chmod -x /etc/grub.d/30_os-prober 

  • DISABLE_30_OS-PROBER = 'true' em / etc / default / grub

Remova o Memtest86 + do menu do Grub
sudo chmod -x /etc/grub.d/20_memtest86+

  • Execute o comando update-grub para permitir que as alterações sejam incorporadas no grub.cfg

Fonte 

Nota: Após as atualizações do kernel, uma nova entrada é adicionada ao menu GRUB. Você pode remover a mais antiga, se quiser. No entanto, a maioria dos usuários experientes recomendará que você mantenha pelo menos uma entrada sobressalente caso algo dê errado com uma atualização e você precise inicialize uma versão antiga do kernel para fins de solução de problemas.

Maneira alternativa para remover entradas do Kernel (antes de 10.04) 

para GRUB não GRUB2

gerente de startup  Install startupmanager

Você pode encontrá-lo em Sistema >> Administração >> alt text
alt text
Você vê na segunda tela que você pode selecionar quantos kernels mostrar? Eu geralmente apenas o mantenho em 1, mas quando eu obtenho uma atualização do kernel eu sempre o altero para 2 antes de reiniciar para que eu possa selecionar o kernel mais antigo se o novo kernel tiver problemas com meu hardware. Quando eu souber que o novo kernel está funcionando bem, eu mudo de volta para 1.


41



Na verdade, o startupmanager dint me deu uma janela como essa no Ubuntu 10.04, em vez disso, apenas deu uma janela com duas abas -> Opções de inicialização e Avançado .. e em avançado ele dint tem a opção de limitar o número de kernels. Então, por favor, atualize a resposta para o Ubuntu 10.04. (E é por isso que eu votei negativo nisso ...) - Sen
alguma idéia de como "número de kernels para manter" pode ser definido em uma máquina que não tem GUI instalado (servidor)? - sylvainulg
O startupmanager está desatualizado. Vejo grup-customizer - muhasturk


Puramente linha de comando, isso removerá todos, exceto o atual e o segundo mais atual (através do "-2" no comando head abaixo):

OLD=$(ls -tr /boot/vmlinuz-* | head -n -2 | cut -d- -f2- |
    awk '{print "linux-image-" $0 " linux-headers-" $0}' )
if [ -n "$OLD" ]; then
    apt-get -qy remove --purge $OLD
fi
apt-get -qy autoremove --purge

38



one-liner de há: dpkg -l linux-* | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e [0-9] | xargs sudo apt-get -y purge - Dmitry Verkhoturov
@DmitryPaskal, Você deve adicionar isso como uma nova resposta. - saji89
@DmitryPaskal Como sempre, não copie e cole esses arquivos sem compreendê-los. Na minha máquina esta one-liner também corresponde linux-libc-dev:amd64 que não deve ser removido. - jamesadney
@Kees Cook, o argumento do awk não deveria estar apenas entre aspas simples? Se a sua intenção é prefixar "linux-image-" para as linhas canalizadas, isso só parece funcionar se você usar awk '{print "linux-image-" $0}'. - Mark
isso não funciona para mim, inclui meu kernel instalado personalizado (Ubuntu 14.04 com 3.17) - Alex R


Atualizar: purge-old-kernels é descontinuada hoje em dia.

Eu fiz um script para limpar os kernels mesmo em condições complicadas. É chamado linux-purge e você pode encontrá-lo Aqui.

Se você quer apenas limpar os kernels (e os pacotes relacionados) que são mais antigos que o kernel atualmente usado, quando o sistema não está quebrado, você pode usar este roteiro.

Há também uma página de documentação do Ubuntu que eu contribuí para remover kernels antigos Aqui.


34



Parece purge-old-kernels não está na versão precisa (1.22) de bikeshed. Existe uma maneira razoável / segura de obter um mais recente bikeshed para preciso? Ou seria mais simples / seguro apenas instalar o script? Eu prefiro usar um repositório, apesar da longa lista de dependências. - drevicko
@drevicko Veja Aqui. - jarno
Mais uma questão levemente tangencial: se você vai à fonte, existe uma maneira de determinar quais comandos ficam disponíveis quando você instala o bikeshed? - drevicko
@drevicko, claro dlocate -lsbin bikeshed - jarno
@drevicko, ver também outra pergunta - jarno