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 .