Created
October 19, 2015 20:25
-
-
Save vbrozik/d39980a8fea0443b37bf to your computer and use it in GitHub Desktop.
purge-old-kernels
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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