Como faço para excluir graciosamente kernels desnecessários? [duplicado]

2

Estou com pouco espaço em disco e notei que tenho vários kernels que provavelmente nunca usarei ocupando espaço. Houve um programa chamado zelador de computador que limpou as coisas (e muitas coisas que você não queria limpar), mas não consigo encontrá-lo. Existe uma alternativa preferida?

Muito obrigado!

    
por SillyUncleWilly 08.04.2013 / 02:16

3 respostas

1

  1. Primeiro, você precisa ver qual kernel você usa atualmente, porque você não deve apagá-lo. Yoy pode ver isso usando o comando:

    uname -r

  2. Então, você pode ver os kernels instalados usando o comando:

    dpkg --list | grep linux-image

  3. E você pode deletar um kernel extra, usando o apt-get assim:

    sudo apt-get purgar linux-image-x.x.x-x-genérico

Onde x.x.x-x é o kernel que você deseja remover. Lembre-se, você não deve excluir aquele que está atualmente em uso (a saída do uname -r). Você deve manter um segundo kernel como backup, caso o primeiro de alguma forma falhe.

Uma alternativa seria o zelador do Ubuntu Tweak, que tem a opção de remover os kernels não usados.

    
por Elias Ps 08.04.2013 / 02:33
1

Eu escrevi uma função Bash para este propósito. Sharing is caring, então aqui vamos nós com uma função Bash que eu tenho usado com sucesso no Debian 5 e 6, assim como versões do Ubuntu entre 10.04 e 12.10. Ele evoluiu um pouco ao longo do tempo, mas nunca falhou comigo. Ele automatiza o "processo de decisão".

NB: sinta-se à vontade para apontar falhas e sugerir melhorias e vou tentar o meu melhor para incorporá-las.

function prune-kernels
{
        [[ -f "/etc/debian_version" ]] || { echo -e "3[01;32mERROR:3[00m This has only been tested on Debian/Ubuntu."; return; }
        [[ -e "/vmlinuz" ]] || { echo -e "3[01;32mERROR:3[00m Expected /vmlinuz to exist."; return; }
        [[ "$UID" -eq "0" ]] || local SUDO=sudo
        # Figure out the name of the newest and the previous kernel
        local OLDKRNL=$(readlink -f /vmlinuz.old)
        local NOWKRNL=$(readlink -f /vmlinuz)
        # If vmlinuz doesn't exist, Also prune "/vmlinuz.old"?
        [[ -e "/vmlinuz.old" ]] || OLDKRNL="$NOWKRNL"
        # Also prune "/vmlinuz.old"? If so, pretend old and new have the same name to skip only the new one
        [[ "" == "--old" ]] && local OLDKRNL="$NOWKRNL"
        # Strip path
        OLDKRNL="${OLDKRNL##*/vmlinuz-}"
        NOWKRNL="${NOWKRNL##*/vmlinuz-}"
        local VERSIONS=$(echo $(for krnl in /boot/vmlinuz-*; do echo "${krnl##*/vmlinuz-}"; done) $(for krnl in $(dpkg -l|command grep 'linux-image'|command grep '^ii'|command grep -v 'meta-package'|command grep 'linux-image-[[:digit:]]\.[[:digit:]]*\.[[:digit:]]'|awk '{print }'); do echo ${krnl##linux-image-}; done)|sort|uniq|sed -e "s:$NOWKRNL::g;s:$OLDKRNL::g;s:$(uname -r)::g")
        echo -ne "3[01;32mSkipping 3[01;33mthe following kernels:3[00m $NOWKRNL"
        [[ "$(uname -r)" == "$NOWKRNL" ]] || { echo -ne ", $(uname -r)"; }
        echo -ne " (3[0;32mcurrently running3[00m)"
        [[ "$OLDKRNL" == "$NOWKRNL" ]] || echo -ne ", $OLDKRNL (3[0;33mold kernel3[00m)"
        echo ""
        # Remove packages
        local PACKAGES=$(for i in $VERSIONS; do echo -n "linux-image-$i linux-headers-$i "; done)
        if [[ -n "$PACKAGES" ]]; then
                echo -e "3[0;32m[STEP 1] 3[01;33mRemoving packages3[00m"
                $SUDO apt-get remove $PACKAGES || { echo -e "3[01;31mSeems that apt-get was not successful, aborting.3[00m"; return; }
        else
                echo -e "3[01;32mNo packages need to be removed.3[00m"
        fi
        # Remove any remaining kernel images etc from /boot
        local FILES=$(for fname in $(for i in $VERSIONS; do echo -n "/boot/abi-$i /boot/initrd.img-$i config-$i System.map-$i vmcoreinfo-$i vmlinuz-$i "; done); do [[ -f "$fname" ]] && { echo -n "$fname "; }; done)
        if [[ -n "$FILES" ]]; then
                echo -e "3[0;32m[STEP 2] 3[01;33mNow removing remaining files:3[00m $FILES"
                $SUDO rm -f $FILES
        else
                echo -e "3[01;32mNothing else to clean up.3[00m"
        fi
}

Coloque a função em um arquivo e a fonte de seu .bashrc ou simplesmente a fonte do shell ad hoc e executá-lo em seguida. A menos que você tenha feito algo extravagante para as configurações de apt-get , isso será avisado antes de executar uma ação.

A função também usa um parâmetro --old para remover todos, menos o kernel em execução. Por padrão, ele irá pular os kernels antigos ( /vmlinuz.old ) e em execução durante a remoção.

Observe também: essa função funciona bem mesmo em cenários em que o kernel em execução é mais antigo que o atual ( /vmlinuz link) e o antigo ( /vmlinuz.old link) kernels.

Divulgação: quase 1: 1 cópia de uma resposta anterior por mim aqui .

    
por 0xC0000022L 08.04.2013 / 02:52
1

Eu tenho uma resposta antiga sobre esse tópico que é muito útil: Como encontrar kernels antigos

Ele propositalmente pára antes de remover os pacotes, porque isso é muita responsabilidade nos meus ombros. O script removerá novos kernels se você não tiver reiniciado desde que os instalou. Não vai segurar sua mão.

Eu escrevi uma variante rápida no comando que mostra tudo menos o kernel atual. Você poderia usar isso como base para remover, mas o que quer que você faça com isso, você precisa verificar se não está removendo os kernels que acabou de instalar.

dpkg -l | grep -Eo "^.i +linux-(image|headers)[^ ]+" | cut -c 5- | grep -v 'uname -r'
    
por Oli 08.04.2013 / 02:53