Por que o apt-get autoremove não remove meus kernels antigos?

53

Minha partição de inicialização está em um SSD, portanto, não há espaço para mais de 8 versões de kernel instaladas e, eventualmente, alguma atualização do kernel falhará na instalação porque minha partição de inicialização está cheia de versões antigas. Existem muitas perguntas sobre como remover versões antigas (mesmo como automatizar o processo), mas minha pergunta é simplesmente a seguinte: Por que não as apt-get autoremovedetecta e remove automaticamente, e existe uma maneira de fazê-lo ? Quero dizer, apt-geté o que os instalou de qualquer maneira, então ele sabe sobre eles, então por que ele escolhe deixar todas as versões antigas por aí?

BlueBomber
fonte
3
possível duplicata de Por que o Ubuntu não remove os kernels antigos automaticamente?
Reintegrar Monica - M. Schröder
11
Autoremove não remover kernels antigos na maioria das circunstâncias. Os kernels se acumulam porque o sistema não executa a remoção automática automaticamente por padrão. Essa é uma configuração nas atualizações autônomas e pode ser alterada. O autoremove não pode remover os kernels antigos quando as ações do apt na fila anterior (como instalar um novo kernel) falham (devido ao espaço insuficiente). Veja bugs.launchpad.net/bugs/1357093 para um patch para unattended-upgrades que vai começar a remover kernels antigos automaticamente.
user535733

Respostas:

36

Para responder ao porquê, consulte o arquivo /etc/apt/apt.conf.d/01autoremove-kernels

insira a descrição da imagem aqui

Como você pode ver, é dito ao apt para nunca remover automaticamente os kernels, como dito em outro arquivo (script) /etc/kernel/postinst.d/apt-auto-removal,. E aqui está:

insira a descrição da imagem aqui

Se você instalar manualmente 2 kernels escolhidos, ou seja, o primeiro e o atual, o apt-autoremove removerá apenas as versões mais antigas que você não instalou manualmente, então você sempre terá essas 2 opções, mais a mais recente.

Atualizar:

No /etc/kernel/postinst.d/apt-auto-removalexiste esta parte:

if [ "$latest_version" != "$installed_version" ] \
   || [ "$latest_version" != "$running_version" ] \
   || [ "$installed_version" != "$running_version" ]
then
        # We have at least two kernels that we have reason to think the
        # user wants, so don't save the second-newest version.
        previous_version=
fi

Portanto, se você comparar a saída do 01autoremove-kernelsarquivo e uname -rperceber que o kernel atualmente em execução e o mais recente antes dele, nunca serão removidos por esse script. Acontece que há outro arquivo /etc/apt/apt.conf.d/01autoremove, onde há linhas:

    APT
    {
      NeverAutoRemove
      {
            "^firmware-linux.*";
            "^linux-firmware$";
      };
  VersionedKernelPackages
  {
        # linux kernels
        "linux-image";
        "linux-headers";
        "linux-image-extra";
        "linux-signed-image";
        # kfreebsd kernels
        "kfreebsd-image";
        "kfreebsd-headers";
        # hurd kernels
        "gnumach-image";
        # (out-of-tree) modules
        ".*-modules";
        ".*-kernel";
        "linux-backports-modules-.*";
        # tools
        "linux-tools";
  };

Então você pode comentar isso, e isso permitirá que você remova automaticamente os kernels apt-autoremove, embora lembre-se - faça isso por seu próprio risco

Sergiy Kolodyazhnyy
fonte
11
Muito interessante! Meu /etc/apt/apt.conf.d/01autoremove-kernelspossui muitas linhas, mas apenas duas versões entre todas: 3.13.0. {39,43}. Mas dpkg -l linux-*lista quatro versões, 3.13.0. {39,40,41,43}, então algo diferente de /etc/apt/apt.conf.d/01autoremove-kernelsmanter essas versões intermediárias, certo?
BlueBomber
11
TL: DR: 01autoremoveé o arquivo que você deseja, 01autoremove-kernelsprovavelmente é apenas uma proteção, para que o apt não remova o kernel atualmente instalado e o mais recente (apenas no caso de novos
erros
11
A menos que eu esteja interpretando 01autoremovemal, é apenas uma proteção contra a remoção automática de pacotes de dependência linux-image-extra. Mudá-lo não deve afetar a linux-image-3.16.0-31-genericremoção automática ou não . Nenhum dos padrões nele corresponde aos nomes dos pacotes que queremos remover automaticamente.
31516 Peter
11
@PeterCordes Não remova nem faça comentários /etc/apt/apt.conf.d/01autoremove. Isso não ajuda você a remover automaticamente os pacotes do kernel com versão antiga, mas pode ter efeitos indesejados. O arquivo não protege contra a remoção automática, linux-image-extramas os pacotes que correspondem a expressões regulares na NeverAutoRemoveseção.
24315 jarno
2
@BlueBomber, a razão pela qual apt-get autoremovenão remove os kernels não listados /etc/apt/apt.conf.d/01autoremove-kernelsé que eles estão marcados como instalados manualmente; veja minha resposta .
Jarno
8

Para mim, ajudou a instalar o ubuntu (15.10) mais recente (X). Em versões anteriores, os pacotes do kernel podem ser marcados como instalados manualmente, pelo menos, se instalados usando o Software Updater, para que sudo apt-get autoremove --purgenão possam ser excluídos. Existem relatórios de erros relacionados ao problema: Bug # 1175637 , Bug # 1439769

Na versão anterior, você poderia tentar marcar os pacotes do kernel instalados automaticamente sudo apt-mark auto $(apt-mark showmanual | grep -E "^linux-([[:alpha:]]+-)+[[:digit:].]+-[^-]+(|-.+)$")e sudo apt-get autoremove --purgedepois executar para ver se isso faz diferença. O comando ainda não deve remover os pacotes do kernels mostrados em /etc/apt/apt.conf.d/01autoremove-kernels, mas é mais seguro executar primeiro apt-get autoremovecom a --dry-runopção.

jarno
fonte
Ah, o comando autoremove tende a remover muitos kernels, consulte o Bug # 1440608
jarno
11
o apt-markfez o truque para mim, gostaria de poder upvote 10 vezes: P
Mike Gleason jr Couturier