#!/bin/sh # Purges all kernels and headers except for the newest ones for each # kernel variant, and except for the active one. # Copyright (C) 2012 Alkis Georgopoulos # License GNU GPL version 3 or newer # Sets keep_kernels, purge_kernels, keep_headers, purge_headers. purgeable_kernels() { local current installed kernel version_variant variants current=$(uname -r) installed=$(dpkg -l 'linux-image-*' | awk '/^ii/ { print $2; }' | sort -frV) for kernel in $installed; do version_variant=${kernel#linux-image-} variant=$(echo "$version_variant" | sed "s/[.0-9-]*//") version=${version_variant%$variant} version=${version%-} # echo "version=$version, variant=$variant" test "$version" = "" && continue test "$variant" = "" && continue case " $variants " in *" $variant "*) # We already have the newest kernel for this variant. # But do check if it's the active one. if [ "$current" != "$version_variant" ]; then purge_kernels="$purge_kernels $version_variant" continue fi ;; esac variants="$variants $variant" keep_kernels="$keep_kernels $version_variant" # Maintain a $keep_versions list to help $purge_headers case " $keep_versions " in *" $version ") ;; *) keep_versions="$keep_versions $version" ;; esac done keep_kernels=$(echo "$keep_kernels" | sed "s/ / linux-image-/g") keep_kernels=${keep_kernels# } if [ -n "$purge_kernels" ]; then purge_kernels=$(echo "$purge_kernels" | sed "s/ / linux-image-/g") purge_kernels=${purge_kernels# } fi installed=$(dpkg -l 'linux-headers-*' | awk '/^ii/ { print $2; }' | sort -frV) for header in $installed; do version_variant=${header#linux-headers-} variant=$(echo "$version_variant" | sed "s/[.0-9-]*//") version=${version_variant%$variant} version=${version%-} # echo "version=$version, variant=$variant" test "$version" = "" && continue # test "$variant" = "" && continue case " $keep_versions " in *" $version "*) keep_headers="$keep_headers $version_variant" ;; *) purge_headers="$purge_headers $version_variant" ;; esac done keep_headers=$(echo "$keep_headers" | sed "s/ / linux-headers-/g") keep_headers=${keep_headers# } if [ -n "$purge_headers" ]; then purge_headers=$(echo "$purge_headers" | sed "s/ / linux-headers-/g") purge_headers=${purge_headers# } fi } purgeable_kernels if [ -n "$purge_kernels" ] || [ -n "$purge_headers" ]; then echo "Θα διατηρηθούν οι παρακάτω kernels/headers: $keep_kernels $keep_headers" echo "Θα διαγραφούν οι παρακάτω kernels/headers: $purge_kernels $purge_headers" echo "Πατήστε [Enter] για να συνεχίσετε ή Ctrl+C για να διακόψετε." echo apt-get purge $purge_kernels $purge_headers else echo "Δεν υπάρχουν παλιοί kernels ή headers για διαγραφή." fi