Skip to content

Instantly share code, notes, and snippets.

@wido
Created February 8, 2017 12:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wido/5f0f17ec1c4564a20e27db6b0c63f566 to your computer and use it in GitHub Desktop.
Save wido/5f0f17ec1c4564a20e27db6b0c63f566 to your computer and use it in GitHub Desktop.
Ubuntu old kernel cleanup
#!/bin/sh
# Cleanup all old kernels and associated packages from the system
set -x
IFS='
'
# more than 1 might very well be broken!
retention=1
disablegrubhook() {
[ -d /etc/kernel.bak ] || mkdir /etc/kernel.bak
[ -f /etc/kernel/postrm.d/zz-update-grub ] && mv -f /etc/kernel/postrm.d/zz-update-grub /etc/kernel.bak/zz-update-grub-postrm
[ -f /etc/kernel/postinst.d/zz-update-grub ] && mv -f /etc/kernel/postinst.d/zz-update-grub /etc/kernel.bak/zz-update-grub-postinst
[ -f /etc/kernel-img.conf ] && mv -f /etc/kernel-img.conf /etc/kernel.bak && sed 's/^\(postrm_hook = update-grub\)$/#\1/' /etc/kernel.bak/kernel-img.conf > /etc/kernel-img.conf
}
enablegrubhook() {
[ -f /etc/kernel.bak/zz-update-grub-postrm -a ! -f /etc/kernel/postrm.d/zz-update-grub ] && mv /etc/kernel.bak/zz-update-grub-postrm /etc/kernel/postrm.d
[ -f /etc/kernel.bak/zz-update-grub-postinst -a ! -f /etc/kernel/postinst.d/zz-update-grub ] && mv /etc/kernel.bak/zz-update-grub-postinst /etc/kernel/postinst.d
[ -f /etc/kernel.bak/kernel-img.conf ] && mv -f /etc/kernel.bak/kernel-img.conf /etc/kernel-img.conf
rm -fr /etc/kernel.bak
}
# Take the list of linux* packages
# - cut out current kernel
# - cut out un installed packages
# - cut out irrelevant pkgs
# - cut out the package names
# - version sorted
pkgs=$(dpkg -l linux* | sed \
-e "/$(uname -r | cut -d- -f1,2)/d" \
-e '/^un/d' \
-e '/-\(libc\|headers\|restricted\|crash\|firm\)/d' \
-e '/^\([a-z]\{2\}[[:space:]]\+\)/!d' \
-e 's|^[a-z]\{2\}[[:space:]]\+||g;s|[[:space:]]\+.*||g' \
-e '/[0-9]\+/!d' \
| sort -Vu)
# linux-image-3.123 etc
imgs=$(echo "$pkgs" | grep '^linux-image-[0-9]' | head -n -$retention)
# all others, ordered by linux-image-generic etc.
pkgs=$(for class in $(echo "$pkgs" | grep -v '^linux-image-[0-9]' | cut -d- -f1,2,3 | sort -u)
do echo "$pkgs" | grep ^$class | head -n -$retention; done )
# Leave when nothings' to be done
[ -n "$pkgs" -o -n "$imgs" ] || exit 0
echo "Cleaning up obsolete kernel packages..."
# Disable the hooks while we're running to speed things up
disablegrubhook
echo "$pkgs\n$imgs"| xargs dpkg -P
enablegrubhook
update-grub
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment