Como o 'apt' decide quantos kernels antigos manter?

23

Estou gerenciando alguns servidores para serviços principais (NTP, DNS, etc.) e ocorreu-me que um dos servidores parece manter os 3 kernels mais recentes, em vez de 2 nos outros:

nul@quark:~$ sudo apt-get autoremove --purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
nul@quark:~$ dpkg -l |grep linux-image
ii  linux-image-3.13.0-51-generic       3.13.0-51.84                     amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-3.13.0-52-generic       3.13.0-52.85                     amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-3.16.0-37-generic       3.16.0-37.49~14.04.1             amd64        Linux kernel image for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-51-generic 3.13.0-51.84                     amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-52-generic 3.13.0-52.85                     amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.16.0-37-generic 3.16.0-37.49~14.04.1             amd64        Linux kernel extra modules for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-generic                 3.13.0.52.59                     amd64        Generic Linux kernel image
ii  linux-image-generic-lts-utopic      3.16.0.37.29                     amd64        Generic Linux kernel image

...

nul@dwarf:~$ sudo apt-get autoremove --purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
nul@dwarf:~$ dpkg -l |grep linux-image
ii  linux-image-3.13.0-52-generic       3.13.0-52.85                     amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-3.16.0-37-generic       3.16.0-37.49~14.04.1             amd64        Linux kernel image for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-52-generic 3.13.0-52.85                     amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.16.0-37-generic 3.16.0-37.49~14.04.1             amd64        Linux kernel extra modules for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-generic                 3.13.0.52.59                     amd64        Generic Linux kernel image
ii  linux-image-generic-lts-utopic      3.16.0.37.29                     amd64        Generic Linux kernel image

Todos os servidores são mantidos de forma idêntica, não sabem o que eu poderia ter feito, devem ser um parâmetro em algum lugar, mas não o encontramos!

Por favor, alimente minha curiosidade! Obrigado

ionreflex
fonte

Respostas:

32

Há um arquivo gerado automaticamente que informa apt-getquais kernels devem ser removidos automaticamente e quais manter.
O arquivo que informa de apt-getquais kernels eles são é de /etc/apt/apt.conf.d/01autoremove-kernelsonde é gerado /etc/kernel/postinst.d/apt-auto-removal.

Normalmente, o que acontece é que, quando você recebe atualizações do kernel, quando a versão do kernel muda, digamos de 3.13para 3.16, /etc/apt/apt.conf.d/01autoremove-kernelsé atualizada para manter os 3.16*kernels e configurada para remover todos os 3.13kernels, a menos que especificado pelo script de geração para não ser removido.

Do apt-auto-removalscript:

# Autor: Steve Langasek 
#
# Marque como não autoremoval os pacotes de kernel que são:
# - a versão atualmente inicializada
# - a versão do kernel que fomos chamados
# - a versão mais recente do kernel (determinada usando regras copiadas do grub
# pacote para decidir qual kernel inicializar)
# - a segunda versão mais recente do kernel, se a versão inicializada do kernel for
# já é o mais recente e esse script é chamado para a mesma versão,
# para garantir que um fallback permaneça disponível caso o recém-instalado
# kernel nesta ABI falha ao inicializar
# No caso comum, isso resulta em exatamente dois kernels salvos, mas pode
# resultam em três kernels sendo salvos. É melhor errar do lado de
# salvar muitos núcleos do que poupar poucos.
#
# Geramos esta lista e a salvamos em /etc/apt/apt.conf.d em vez de marcar
# pacotes no banco de dados porque isso é executado a partir de um script postinst e apt
# substituirá o banco de dados quando ele sair.

No entanto, isso às vezes não os marca para remoção automática, pois parte da codificação foi alterada nas versões para impedir que isso aconteça.

Se você deseja marcar os kernels anteriores, autoremoveexceto os necessários, com base nos scripts, execute o seguinte comando em uma janela do terminal:

sudo apt-mark auto ^linux-image-

Em seguida, quando você executa o apt-get autoremovecomando, apenas os antigos e que não são mais necessários podem ser removidos. Eu coloquei exemplos abaixo:

Este primeiro mostra todos os kernels no sistema menos o kernel atual em execução.

root @ terrance-Linux: / home / compartilhamento # dpkg -l 'linux- *' | sed '/ ^ ii /! d; /' "$ (uname -r | sed" s /\(.*\)-\([^ 0-9] \ + \) / \ 1 / ")" '/ d; s / ^ [^] * [^] * \ ([^] * \). * / \ 1 /; / [0-9] /! d '
linux-headers-3.16.0-34
linux-headers-3.16.0-34-generic
linux-headers-3.16.0-36
linux-headers-3.16.0-36-generic
linux-headers-3.16.0-37
linux-headers-3.16.0-37-generic
linux-headers-4.0.0-040000
linux-headers-4.0.0-040000-generic
linux-image-3.16.0-34-genérico
linux-image-3.16.0-36-genérico
linux-image-3.16.0-37-generic
linux-image-4.0.0-040000-generic
linux-image-extra-3.16.0-34-genérico
linux-image-extra-3.16.0-36-genérico
linux-image-extra-3.16.0-37-genérico

Este mostra o kernel atual em execução.

terrance @ terrance-Linux: ~ $ uname -r
4.0.1-040001-generic
terrance @ terrance-Linux: ~ $ sudo apt-get autoremove
[sudo] senha para terrance: 
Lendo listas de pacotes ... Concluído
Construindo árvore de dependência       
Lendo informações do estado ... Concluído
0 atualizado, 0 recém-instalado, 0 a remover e 0 não atualizado.
terrance @ terrance-Linux: ~ $ sudo apt-mark auto ^ linux-image-
O linux-image-extra-3.16.0-33-generic não pode ser marcado porque não está instalado.
linux-image-extra-3.13.0-27-generic não pode ser marcado porque não está instalado.
linux-image-3.13.0-44-lowlatency não pode ser marcado porque não está instalado.
O linux-image-3.13.0-27-generic não pode ser marcado porque não está instalado.
linux-image-3.16.0-31-lowlatency não pode ser marcado porque não está instalado.
linux-image-3.16.0-36-generic configurado para instalado automaticamente.
linux-image-lowlatency-lts-utopic não pode ser marcado porque não está instalado.
O linux-image-extra-3.13.0-36-generic não pode ser marcado porque não está instalado.
O linux-image-3.13.0-36-generic não pode ser marcado porque não está instalado.
linux-image-4.0.0-040000-generic definido como instalado automaticamente.
linux-image-extra-3.13.0-45-generic não pode ser marcado porque não está instalado.
linux-image-3.16.0-25-generic não pode ser marcado porque não está instalado.

NOTA: A lista acima era muito longa para listar, então eu truncei um pouco.

terrance @ terrance-Linux: ~ $ sudo apt-get autoremove
Lendo listas de pacotes ... Concluído
Construindo árvore de dependência       
Lendo informações do estado ... Concluído
Os seguintes pacotes serão REMOVIDOS:
  linux-image-3.16.0-34-generic linux-image-3.16.0-36-genérico
  linux-image-4.0.0-040000-generic linux-image-extra-3.16.0-34-generic
  linux-image-extra-3.16.0-36-genérico
0 atualizado, 0 recém-instalado, 5 para remover e 0 não atualizado.
Após esta operação, 613 MB de espaço em disco serão liberados.
Você quer continuar? [S / n]

Portanto, depois de executar esses comandos, você pode ver que agora eu posso remover automaticamente todo o kernel antigo, exceto o atual (4.0.1-040001-generic) e o próximo mais novo (3.16.0-37-generic).

Espero que isso ajude.

Terrance
fonte
O Ubuntu não remove automaticamente por padrão, faz? Nós temos a opção, mas foi (ainda) considerado impossível decidir o que é um kernel "indesejado" (em outro sistema operacional "indesejável" é igual a "não utilizado").
Rinzwind
Está bem. Eu descaracterizou o seu post em que pouco ;-)
Rinzwind
1
@Terrance Tentei passar sudo apt-mark auto ^linux-image-seguido por sudo apt-get autoremove --purgemas sem sucesso; no entanto, um pouco dist-upgrademodificado 2 kernels (3.13.0-52 e 3.16.0.37) e as seguintes autoremovese livrou de 3.13.0-51 ...
ionreflex
1
@ionreflex Fico feliz que você encontrou isso. Nem toda resposta é perfeita e pode não funcionar para todos. Mas acho legal que pessoas como você possam solucionar um pouco e descobrir uma maneira de removê-las. Eu estou pensando que dist-upgradevocê correu o /etc/kernel/postinst.d/apt-auto-removalque então modificou o /etc/apt/apt.conf.d/01autoremove-kernelsentão dizendo quais quais manter.
Terrance
1
@ Terrance Tenho certeza de que já fiz isso dist-upgradeantes, mas talvez o fato de os kernels terem sido atualizados hoje de manhã tenha funcionado ... de qualquer maneira, aplausos, e obrigado por sua resposta, eu aprendi muito com isso!
Ionreflex