Já vi muitos tópicos sobre como liberar espaço na partição / boot e esse é meu objetivo também. No entanto, só estou interessado em excluir kernels antigos e não cada um deles, mas o atual.
Preciso que a solução seja de uma linha, pois executarei o script do Puppet e não quero ter arquivos extras por aí. Até agora, consegui o seguinte:
dpkg -l linux-* | awk '/^ii/{print $2}' | egrep [0-9] | sort -t- -k3,4 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"` | xargs sudo apt-get -y purge
Para ser mais preciso, o que faz no momento é o seguinte:
- Liste todos os pacotes linux- * e imprima seus nomes.
- Liste apenas os que têm números e os ordene, retornando o resultado inverso. Dessa forma, os kernels mais antigos são listados por último.
- Imprima apenas os resultados que seguem o kernel atual
- Como existem alguns resultados de linux- {image, headers}, certifique-se de que eu não limpe nada relacionado ao meu kernel atual
- Ligue para o apt para limpar
Isso funciona, mas tenho certeza de que a solução pode ser mais elegante e segura para um ambiente de produção, pois pelo menos 20 de nossos servidores executam o Ubuntu.
Obrigado pelo seu tempo, Alejandro.
kernel
bash
boot-partition
Alejandro
fonte
fonte
Respostas:
Parece bom o suficiente, apenas alguns comentários. Os dois primeiros comentários tornam o comando mais seguro, enquanto o terceiro e o quarto o tornam um pouco mais curto. Sinta-se livre para seguir ou ignorar qualquer um deles. Embora eu recomendo fortemente seguir os dois primeiros. Você quer ter certeza de que é o mais seguro possível. Quero dizer a sério. Você está lançando uma
sudo apt-get -y purge
em alguma lista de pacotes gerada automaticamente. Isso é tão mau ! :)A listagem de todos
linux-*
fornece muitos falsos positivos, como (exemplo da minha saída)linux-sound-base
. Mesmo que estes possam ser filtrados posteriormente pelo resto do seu comando, eu me sentiria mais seguro em não listá-los em primeiro lugar. Controle melhor quais pacotes você deseja remover. Não faça coisas que possam ter resultados inesperados. Então eu começaria comSeu regex para "listar apenas os que têm números" é um pouco simples demais na minha opinião. Por exemplo, existe o pacote
linux-libc-dev:amd64
quando você está em um sistema de 64 bits. Seu regex corresponderá. Você não quer que isso corresponda. É certo que, se você seguiu meu primeiro conselho,linux-libc-dev:amd64
não será listado de qualquer maneira, mas ainda assim. Sabemos mais sobre a estrutura de um número de versão do que o simples fato de que "há um número". Além disso, geralmente é uma boa idéia citar regexes, apenas para evitar possíveis interpretações erradas pelo shell. Então eu faria esse comando egrepDepois, há essa coisa de classificação. Por que você classifica? Como você removerá todos os núcleos (exceto o atual), é importante remover os mais antigos antes dos mais novos? Eu não acho que isso faça alguma diferença. Ou você está apenas fazendo isso para poder usar
sed
"Imprimir apenas os resultados que seguem o kernel atual"? Mas na IMO isso parece muito complicado. Por que não simplesmente filtrar os resultados correspondentes ao seu kernel atual, como você já está fazendo degrep -v
qualquer maneira, e pronto? Honestamente, se eu pegar a primeira parte do seu comando (com minhas duas sugestões anteriores integradas), na minha máquina eu receboRemovendo essas coisas de classificação / sed, eu recebo
Portanto, seu comando mais complicado realmente perderia dois pacotes na minha máquina, que eu gostaria de remover (agora é possível que essas
linux-image-extra-*
coisas dependam daslinux-image-*
coisas e, portanto, sejam removidas de qualquer maneira, mas não custa nada explicá-las). De qualquer forma, não vejo o objetivo da sua classificação; um simplesgrep -v
sem pré-processamento sofisticado deve ser bom, presumivelmente ainda melhor. Eu sou um defensor do princípio do KISS. Isso facilitará a compreensão ou a depuração posteriormente. Além disso, sem a classificação, é um pouco mais eficiente;)Isso é puramente estético, mas você obterá a mesma saída com essa variante um pouco mais curta. :-)
Consequentemente, acabo com o comando mais simples e seguro
Como você realmente deseja limpar sua
/boot
partição, uma abordagem completamente diferente seria listar o conteúdo/boot
, usardpkg -S
para determinar os pacotes aos quais os arquivos individuais pertencem, filtrar os que pertencem ao kernel atual e remover os pacotes resultantes. Mas eu gosto mais da sua abordagem, porque ela também encontrará pacotes desatualizados, como oslinux-headers-*
quais não são instalados/boot
, mas sim/usr/src
.fonte
uname -r
. Para mim, funciona bem. Seria interessante ver por que isso não funciona no seu caso.uname -r
produz4.8.0-36-generic
, que falha ao excluirlinux-headers-4.8.0-36
da lista.Eu escrevi este script que remove os pacotes "linux- *" que possuem uma versão menor do que a atualmente inicializada. Eu acho que não é necessário testar o status do pacote. O comando pede confirmação antes de limpar os pacotes. Se você não quer isso, adicione a opção -y ao comando apt-get.
No entanto, para poder deixar uma quantidade configurável de kernels sobressalentes, recomendo usar meu
linux-purge
script com a--keep
opção Veja aqui para mais informações sobre o script.fonte
TL; DR: pule para o fundo.
É um pouco mais longo. Vou dividir para você:
dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}'
Assim como Malte sugeriu. Lista os arquivos relevantes do kernel.egrep '[0-9]+\.[0-9]+\.[0-9]+'
Também sugerido por Malte como a maneira mais segura de escolher apenas os arquivos do kernel, procurando por um número de versão.Como agora estamos possivelmente listando os pacotes de imagem e de cabeçalho, a nomeação dos pacotes pode variar, de modo que temos essa solução alternativa do awk necessária para a classificação
awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}'
O resultado é uma nova coluna com o número da versão antes do nome do pacote original, como abaixo:Agora devemos classificar a lista para impedir a desinstalação de imagens mais recentes que a que está sendo executada no momento.
sort -k1,1 --version-sort -r
nos dando o seguinte:Agora retire os arquivos atuais e mais recentes do kernel,
sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"`
fornecendo-nos o seguinte:Agora retire a primeira coluna que adicionamos
awk '{print $2}'
para obter exatamente o que queremos:Agora podemos fornecer isso ao gerenciador de pacotes para remover tudo automaticamente e reconfigurar o grub:
Eu recomendo fazer uma execução a seco primeiro (embora, para seus fins de script, isso possa não ser prático se você tiver um ambiente grande)
Agora, se tudo estiver bem, vá em frente e remova-o com:
Mais uma vez, o objetivo deste "one-liner" é remover apenas os kernels MAIS ANTIGOS do que o kernel atualmente em execução (o que deixa os kernels recém-instalados ainda disponíveis)
Obrigado, deixe-me saber como isso funciona para você e se você pode melhorá-lo!
fonte
Você pode simplesmente listar o diretório / boot para ver as versões do kernel que você possui usando o comando 'ls'. Em seguida, use 'sudo apt-get -y purge "xxx"', onde "xxx" é substituído pelo número da versão que você deseja remover. Cuidado para que não seja a versão que você está executando no momento !!.
fonte
Instale
bikeshed
(apt install bikeshed
) e chamepurge-old-kernels
como root.fonte
Uma resposta rápida, explicação mediante solicitação:
fonte
sed '$d'
comando. O script não remove nenhum pacote de cabeçalho linux ou outros pacotes relacionados aos pacotes do kernel a serem removidos, além de não excluir os arquivos de configuração dos pacotes. Eu recomendaria usar minha resposta.echo
) oapt-get
comando que você pode executar.Eu me cansei muito de toda essa complexidade desnecessária e criei um pacote Python que torna o one-liner trivial:
Instale-o com
Veja mais em https://github.com/mrts/ubuntu-old-kernel-cleanup .
Espero que isso ajude outras pessoas também.
fonte
sudo pip install ...
como descrito acima?sudo
é realmente importante; caso contráriopip
, ele será instalado em algum diretório do usuário e o shell poderá não procurar neste arquivo arquivos executáveis.Funciona o tempo todo, e até o ubuntu 17.10
fonte
linux-libc-dev:amd64
, o que é indesejável.