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

47

Minha partição de inicialização está em um SSD, portanto não há espaço para mais de 8 versões do kernel instaladas e, eventualmente, algumas atualizações do kernel não serão instaladas porque minha partição de inicialização está cheia de versões antigas. Há muitas perguntas sobre como remover versões antigas (até mesmo como automatizar o processo), mas a minha pergunta é simplesmente: Por que o apt-get autoremove não detecta e remove-as automaticamente? pode fazer isso ? Quero dizer, apt-get é o que os instalou de qualquer maneira, então ele sabe sobre eles, então por que escolher deixar todas as versões antigas por aí?

    
por BlueBomber 20.12.2014 / 00:51

4 respostas

29

Para responder por que, consulte o arquivo /etc/apt/apt.conf.d/01autoremove-kernels

Como você pode ver, o apt é instruído a nunca remover automaticamente os kernels, conforme informado por outro arquivo (script), /etc/kernel/postinst.d/apt-auto-removal . E aqui está:

Se o seu script-fu for bom o suficiente, você poderia editá-lo para salvar apenas alguns kernels, embora eu não possa ajudá-lo, já que o meu script fu não é tão bom

Atualização:

No /etc/kernel/postinst.d/apt-auto-removal , há 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 de 01autoremove-kernels file e uname -r , perceberá que o kernel em execução no momento e o mais recente antes dele são mantidos para nunca serem 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 comentá-los, e isso permitirá que você remova automaticamente os kernels com apt-autoremove , embora lembre-se - faça isso por sua própria conta e risco

    
por Sergiy Kolodyazhnyy 20.12.2014 / 01:23
7

Para mim, ajudou a instalar o ubuntu mais recente (X) (15.10). 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 --purge não possa excluí-los. Há relatos de erros referentes ao problema: Bug # 1175637 , Bug # 1439769

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

    
por jarno 23.12.2015 / 20:56
-1

Atualização: o link mencionado não parece mais estar funcionando.

Aqui está um link para um script de remoção de kernel com segurança de falhas que Dustin Kirkland escreveu alguns anos atrás. Ele ainda deve funcionar em 12.04.

[link não funcional removido]

Eu ia testá-lo na minha máquina 14.04, mas parece que não estou mais com o problema (finalmente consertado através do canal de atualização regular?). Então, se alguém com muitos kernels antigos em sua máquina quiser testá-lo, faça e compartilhe suas descobertas.

    
por iGadget 06.05.2015 / 12:29
-4
KERNELS1=$(uname -r|cut -d - -f1-2); KERNELS2=$(for i in $(ls -l /vmlinuz*|awk '{print $(NF-0)}'); do echo $i |xargs basename|cut -d - -f2-3; done); dpkg -l|egrep 'linux-headers-[0-9]\.[0-9]\.[0-9]-[0-9]|linux-image-[0-9]\.[0-9]\.[0-9]-[0-9]'|egrep -v ''"${KERNELS1}"'|'"${KERNELS2}"''|awk '{print }'|xargs apt-get purge -y

Eu uso isso no Ubuntu 12.04!

Isso manterá o kernel atual em execução, bem como o kernel instalado mais recente (vmlinuz) e o anterior (vmlinuz.old). Todos os outros kernels e cabeçalhos serão removidos.

    
por Sam 10.09.2015 / 05:59

Tags