/boot空き容量不足の根本解決を行う

以前、CentOS6サーバの/bootの空き容量不足が原因でkernelのyumアップデートが正常に完了できなくなりました。保存されている古いkernelを削除することで一旦は解決しましたが、先日症状が再発してしまいました。今度は暫定対処と根本解決を行います。

1.症状の確認

ことの発端は「Anacron job ‘cron.daily’ on servername」のメールが朝に届くようになったこと。メールの内容は「/bootの空き容量が6MB足りず、yumのカーネルインストールに失敗している」とのこと。

/etc/cron.daily/0yum.cron:

Error: Transaction Check Error:
  installing package kernel-2.6.32-573.12.1.el6.i686 needs 6MB on the /boot filesystem

Error Summary
-------------
Disk Requirements:
  At least 6MB more space needed on the /boot filesystem.
2.原因と対策

この症状の原因は主に3つ。
1つめは/boot領域の容量が小さいこと。このサーバは/bootに190MB割り当てていますが、riscascape.netで使っているお名前.comVPSサーバは約480MBですので本当はこれくらいの余裕が必要なのだと思います。対策は/bootのサイズ拡張。

2つめはkernelの保存数が5世代分もあること。前回が暫定対処として3世代分に減らしましたが何も困ったことはありませんでした。ということはyumの設定を変更して保存世代数を5から減らせば再発は防げるはず。

3つめはLinuxkernelそのものが肥大化していること。ただしkernelのアップデート内容はセキュリティ修正など最低限必要なものしか行われていないはずですし、現在のセキュリティ性を維持するにはyumのkernelアップデートを止めるわけにもいかないので、対策はなさそう。

ということで、今回は難しいことをしなくてもできる対策「yumのkernel保存数変更」を試します。

3.暫定対処

まずは現在の/boot使用状況を確認。

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_server-LogVol01
                      455G  5.7G  426G   2% /
tmpfs                 1.4G     0  1.4G   0% /dev/shm
/dev/md0              190M  157M   33M  82% /boot

次に暫定対処としてkernel2つを残して古いカーネルを削除します。

# package-cleanup --oldkernels --count=2
読み込んだプラグイン:fastestmirror, priorities
--> トランザクションの確認を実行しています。
---> Package kernel.i686 0:2.6.32-504.30.3.el6 will be 削除
---> Package kernel.i686 0:2.6.32-573.1.1.el6 will be 削除
---> Package kernel.i686 0:2.6.32-573.3.1.el6 will be 削除
--> 依存性解決を終了しました。

依存性を解決しました

================================================================================
 パッケージ     アーキテクチャ
                             バージョン                  リポジトリー      容量
================================================================================
削除:
 kernel         i686         2.6.32-504.30.3.el6         @updates          91 M
 kernel         i686         2.6.32-573.1.1.el6          @updates          92 M
 kernel         i686         2.6.32-573.3.1.el6          @updates          92 M

トランザクションの要約
================================================================================
削除                 3 パッケージ

インストール済み容量: 275 M
これでいいですか? [y/N]y
パッケージをダウンロードしています:
rpm_check_debug を実行しています
トランザクションのテストを実行しています
トランザクションのテストを成功しました
トランザクションを実行しています
  削除中                  : kernel.i686                                     1/3
  削除中                  : kernel.i686                                     2/3
  削除中                  : kernel-2.6.32-573.3.1.el6.i686                  3/3
  Verifying               : kernel-2.6.32-573.1.1.el6.i686                  1/3
  Verifying               : kernel-2.6.32-504.30.3.el6.i686                 2/3
  Verifying               : kernel-2.6.32-573.3.1.el6.i686                  3/3

削除しました:
  kernel.i686 0:2.6.32-504.30.3.el6  kernel.i686 0:2.6.32-573.1.1.el6  kernel.i686 0:2.6.32-573.3.1.el6

完了しました!

削除が完了したので空き容量を確認。33MBが115MBに増えてます。

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_server-LogVol01
                      455G  5.7G  426G   2% /
tmpfs                 1.4G     0  1.4G   0% /dev/shm
/dev/md0              190M   66M  115M  37% /boot

これで足りなかった6MB以上空き容量を確保できたので、yumの処理が完了するかyum-complete-transactionで確かめます。

yum-complete-transaction
読み込んだプラグイン:fastestmirror, priorities
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * rpmforge: ftp.riken.jp
 * updates: www.ftp.ne.jp
base                                                     | 3.7 kB     00:00
epel                                                     | 4.3 kB     00:00
extras                                                   | 3.4 kB     00:00
rpmforge                                                 | 1.9 kB     00:00
updates                                                  | 3.4 kB     00:00
132 packages excluded due to repository priority protections
No unfinished transactions left.

エラーなくいけますね。ひとまず暫定対処は完了です。

4.根本解決

kernelの保存数を5から3に減らすことにします。YUMの設定ファイルであるyum.confファイルを確認してみるとそれっぽい設定がありました。

# cat /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
省略・・・

installonly_limitで調べてみるとRedhatのナレッジ6.3. Yum と Yum リポジトリの設定に詳しい解説がありました。

installonly_limit=value
value は、installonlypkgs 指示文に表示されている単一のパッケージに同時にインストール可能なバージョンの最大数を表す整数です。
installonlypkgs 指示文のデフォルトには複数の様々なカーネルパッケージが含まれているため、installonly_limit の値を変更すると、単一のカーネルパッケージのインストール済みバージョンの最大数にも影響が及ぶ点に注意して下さい。/etc/yum.conf に表示されているデフォルト値は、installonly_limit=3 です。また、この値を低く、特に 2 より下に設定することは推奨されません。

CentOS6は5がデフォルトのようですがRHELは3のようです。2より下に設定することは推奨されませんとのことなので3に変更してみます。

# vi /etc/yum.conf
installonly_limit=5
→ installonly_limit=3

YUMはサービス常駐型ではないので再起動などは不要です。あとは効果を確認したいところですが、すぐに確認できるものではないので暫くしてから追記しようと思います。