RHEL5のカーネルに追加されたkexec/kdumpについて簡単に説明します。
最初にkexecを説明します。kexecを一言で言うなら「高速なリブート機能」です。
動作原理は次のようなものです。
Linuxの再起動シーケンスを単純に表現すると、
- Linux→
- ハードウェアリセット→BIOS(もしくはEFIなど)→ハードウェア→
- ファームウェア→第1レベル・ブートローダ→
- 第2レベル・ブートローダ→
- Linux
となります。この再起動のシーケンスに必要な時間の約半分を、2.の部分、つまりハードウェアの検出、ファームウェアのロード・設定などが占めています。
しかしながらホットプラグPCIなどを考慮しても、再起動の間にハードウェアの構成が変更されることは通常考えにくく、再起動の際にハードウェアを「再検出」する必要はほとんど無いということが言えます。
そこで、kexecでは上記の2・3の部分を省略して、リブートが発行されると第2レベル・ブートローダに「ジャンプ」します。
実際の設定手順は非常に簡単です。
unamer=`uname -r`
kexec -l /boot/vmlinuz-$unamer --initrd=/boot/initrd-$unamer.img --command-line="`cat /proc/cmdline`"
この効果はPCIバスにSCSIのカードなどが追加されているようなサーバでは大きくなります。手元のPanasonicのLet’s Noteで試したところ、再起動にかかる時間は13秒(12.5%)の短縮しか出来ませんでしたが、SCSIカードが1枚PCIバスに刺さっているサーバでは、55秒(35%)も再起動にかかる時間が短縮できました。
このkexecはいわば「kernel loadable kernel」なわけですが、これをダンプに応用したものがkdumpです。
従来RHELではdiskdump/netdumpが用いられてきましたが、専用のダンプドライバが必要であるために利用可能なデバイスが限られたり、そのコードのメンテナンスも問題となってきました。また「死にゆくカーネルが最後の力を振り絞ってダンプする」機構であるため、ダンプの信頼性が低いことも問題です。
これに対し、kdumpはアップストリームカーネルにマージされた機能ですし、この後説明する実装により高い信頼性を獲得しています。
動作原理は、キャプチャ専用のカーネル(キャプチャカーネル)を起動時に特定のメモリ領域(x86では先頭から16MB以降)にロードしておき、クラッシュ時にはこの予約領域にあるキャプチャカーネルがメモリのキャプチャを行い、事前に指定された方法で保存をするというものです。
設定手順としては、system-config-kdumpコントロールパネルで設定するのみなので、非常に簡単です。
「kdumpを有効にする」チェックボックスをチェックして保存すると、grub.confのkernel行にcrashkernel=128M@16Mというパラメータが追加され、/etc/kdump.confにダンプの保存方法が設定されます。保存方法は通常のファイルとして/var/crash以下に保存する、あるいはscp/ftp/nfsなどでリモートファイルとして保存する方法などが設定可能です。
取得されたダンプはgdbなど従来用いられてきたツールでの解析が可能です。