目的
Ubuntuカーネルを自動で最新バージョン以外をアンインストールしたい。
検証環境
Ubuntu 16.04.2
手順
インストールされているカーネルを調べる
dpkg --list | grep -E -o "linux-image-[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-generic"
これにより、以下のような結果が得られる。
$ dpkg --list | grep -E -o "linux-image-[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-generic"
linux-image-4.8.0-36-generic
linux-image-4.8.0-51-generic
バージョンのみを抽出する
dpkg --list | grep -E -o "linux-image-[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-generic" | grep -o -E "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+" | uniq
$ dpkg --list | grep -E -o "linux-image-[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-generic" | grep -o -E "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+" | uniq
4.8.0-36
4.8.0-51
最新のバージョンを抽出する
自然数化して降順ソートした結果の先頭を取得する。
dpkg --list | grep -E -o "linux-image-[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-generic" | grep -o -E "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+" | uniq | sort -n -r | head -1
以下のような結果となる。
$ dpkg --list | grep -E -o "linux-image-[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-generic" | grep -o -E "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+" | uniq | sort -n -r | head -1
4.8.0-51
最新以外のカーネルバージョンを抽出する
grep
の -v
オプションに最新のバージョンを指定して除外する。
dpkg --list | grep -E -o "linux-image-[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-generic" | grep -o -E "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+" | uniq |
$(dpkg --list | grep -E -o "linux-image-[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-generic" | grep -o -E "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+" | uniq | sort -n -r | head -1)
抽出した最新以外のカーネルバージョンに関連するパッケージを削除する
linux-headers-
と linux-image-
から始まるパッケージを autoremove --purge
オプションを付けて apt
(apt-getでもaptitudeでも可) コマンドで削除する
apt autoremove --purge -y linux-headers-<上記までで抽出した最新以外のバージョン>*
apt autoremove --purge -y linux-image-<上記までで抽出した最新以外のバージョン>*
シェルスクリプト化してみる
USER=$(whoami)
if [ ! ${USER} = "root" ]
then
echo "Please use with sudo"
exit 1
fi
LATEST=$(dpkg --list | grep -E -o "linux-image-[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-generic" | grep -o -E "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+" | uniq | sort -n -r | head -1)
TARGETS=$(dpkg --list | grep -E -o "linux-image-[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-generic" | grep -o -E "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+" | uniq | grep -E -v ${LATEST})
for pkg_ver in ${TARGETS}
do
for pkg_prefix in linux-headers- linux-image-
do
apt autoremove --purge -y ${pkg_prefix}${pkg_ver}*
done
done
update-grub
dpkg --list | grep -E -o "linux-image-[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-generic" | grep -o -E "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+" | uniq
を先に実行して共通化したい。。。