CentOSやUbuntuを使ってたサーバである程度運用を続けていると、updateの都度過去のkernelが溜まっていってしまい「/boot」配下の空き容量が無くなってしまう事がある。 そのまま放置して100%になるとyumやapt実行時にエラーになってしまうので、本来はちゃんと定期的に整理する必要があるのだけど、結構うっかりして放置してしまうことがある。で、今回はそんな/boot配下の不要なカーネル等の一括削除を行っていく。

1. CentOSの場合

CentOSの場合、yum-utilsパッケージのpackage-cleanupコマンドが入っているかどうかで対応が異なってくる。 package-cleanupコマンドがインストールされているようであれば、以下のコマンドで自動的に古いカーネル等を削除してくれる(countで残す世代数を定義している)。

sudo package-cleanup --oldkernels --count=2

もしくは、以下のようにrpmコマンドを実行してやることで、現在利用しているカーネル以外を削除する事ができる。

rpm -q kernel | grep -v $(uname -r) | xargs rpm -e

上記でうまくいかない場合(考えられる原因として/boot配下の使用量が100%になっている等)、少々乱暴なのだが以下のコマンドで使用中のカーネル以外のファイルを強制的に削除して、その後パッケージを削除してやればうまくいく。 ※環境によってはうまくいかない場合もあるかもなので注意。事前にちゃんとバックアップを取得し、正規表現でのgrepの出力結果を確認しておくこと。

rpm -q kernel | grep -v $(uname -r) | grep -oE '[0-9]\.[0-9]{1,2}.[0-9]-[0-9]{2,3}.[0-9]{1,2}.[0-9]{1,3}' | xargs -I@ -n1 bash -c 'echo sudo rm -rf /boot/*@*'
rpm -q kernel | grep -v $(uname -r) | xargs rpm -e

2. Ubuntuの場合

aptでautoremoveを使うことで、使っていないパッケージを自動的に削除させる事ができる。

sudo apt autoremove

なお、こちらも/boot配下の使用量が100%になっている場合、autoremoveでは削除できない。 この場合は、乱暴なのだけど以下のようにコマンドを実行して現在使用していないカーネルイメージ等を無理やり削除してやればいい。 ※当たり前の話として、現在使っているカーネルを含みで全部消さないように注意。事前にちゃんとバックアップを取得し、全カーネルを削除するような事が無いよう事前に確認すること。

sudo dpkg --list 'linux-image*'|awk '{ if ($1=="ii") print $2}'|grep -v `uname -r` | grep -oE '[0-9]\.[0-9]{1,2}.[0-9]-[0-9]{2,3}' | xargs -I@ -n1 bash -c 'sudo rm -rf /boot/*@*'
sudo apt autoremove

そもそも、/bootがいっぱいになる前に削除しておけよという話なのだけど…。