Skip to content

Instantly share code, notes, and snippets.

@vbrozik
Created October 19, 2015 20:25
Show Gist options
  • Save vbrozik/d39980a8fea0443b37bf to your computer and use it in GitHub Desktop.
Save vbrozik/d39980a8fea0443b37bf to your computer and use it in GitHub Desktop.
purge-old-kernels
#!/bin/sh
# removes old kernel packages which stays after kernel upgrades
# on Debian-based systems
# requires: POSIX shell, awk, sed (with -r), grep sort, head, uname
# printf, echo
# dpkg, apt-get
# sudo (? remove?)
# Václav Brožík, 2015, public domain
# TODO
# Notify when the running kernel is not the latest version.
curmver="$(uname -r | sed -nre 's/^([0-9]+\.[0-9]+\.[0-9]+)-[0-9]+.*$/\1/p')"
cursver="$(uname -r | sed -nre 's/^[0-9]+\.[0-9]+\.[0-9]+-([0-9]+).*$/\1/p')"
echo "Currently running kernel: major $curmver minor $cursver"
kpackages="$(dpkg -l linux-\* |
awk '$1 ~ /^.[^n]/ && $2 ~ /^linux-((signed-)?image(-extra)?|headers)-[0-9]+\.[0-9]+/ {print $2}')"
# kernel packages to consider
mversions="$(printf '%s\n' "$kpackages" |
sed -re 's/^linux-([a-z]+-)*([0-9]+\.[0-9]+\.[0-9]+)-[0-9]+.*$/\2/' |
sort -Vu)"
# awk '{print gensub(/^linux-([a-z]+-)*([0-9]+\.[0-9]+\.[0-9]+)-[0-9]+.*$/, "\\2", "")}' |
# main versions like 3.13.0, 3.16.0 etc.
if ! printf '%s\n' "$mversions" | grep -q "^$curmver" ; then
echo "Running kernel main version $curmver not found in installed packages."
exit 1
fi
# echo "$kpackages" | grep -E "^([a-z]+-)+$curmver-$cursver"
if ! printf '%s\n' "$kpackages" | grep -Eq "^([a-z]+-)+$curmver-$cursver" ; then
echo Running kernel minor version $curmver-$cursver not found in installed packages.
exit 1
fi
#unset kerfound
todel="" # about to build list of kernel versions to delete
for ver in $mversions ; do
echo === $ver ===
sversions="$(printf '%s\n' "$kpackages" |
sed -nre 's/^([a-z]+-)+'"$ver"'-([0-9]+).*$/\2/p' |
sort -u)"
if test "$ver" = "$curmver" ; then
# currently running version
printf '%s\n' "$sversions" |
sed -re 's/^'"$cursver"'$/& <--- currenttly running/'
if ! printf '%s\n' "$sversions" | grep -Eq '^'"$cursver"'$' ; then
echo Currently running kernel not found.
exit 1
fi
for sver in $(printf '%s\n' "$sversions" |
head -n -1 |
grep -Ev '^'"$cursver"'$') ; do
todel="$todel$(test -z "$todel" || echo " ")$ver-$sver"
done
else
# currently not-running versions
printf '%s\n' "$sversions"
for sver in $(echo "$sversions" | head -n -1) ; do
todel="$todel$(test -z "$todel" || echo " ")$ver-$sver"
done
fi
done
echo
if test -z "$todel" ; then
echo Nothing to purge.
exit
fi
for ver in $todel ; do
echo "=== purging $ver ==="
sudo apt-get purge $(printf '%s\n' "$kpackages" | grep -E "^([a-z]+-)+$ver")
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment