何らかの原因によって Linux カーネルが判断のできない状況に陥ると panic() 関数を実行します。この状態がカーネルパニックです。この時点での Linux サーバーのメモリにある内容は、調査解析し原因を特定した上で対策を講じるために重要な情報です。これをカーネルダンプといいます。カーネルダンプの解析には高度な知識が必要となるため、通常はサポートエンジニアへ依頼することになります。システム管理者は、この出力結果を保存しサポートエンジニアに渡すための手段を理解しておく必要があります。Turbolinux 11 Server では、カーネルダンプを採取するためのツールとして非常に柔軟で信頼性の高い kexec-tools パッケージの kdump を採用しています。kdump を使用することでカーネルパニック発生時点のメモリ内容をファイルとして出力することが可能になります。
必要なパッケージは、kexec-tools です。インストールされていない環境では、turbo+ などを使用してあらかじめインストールを行ってください。ここでは、ローカルディスクにカーネルダンプを出力するための基本的な手順とテスト方法を解説します。kdump の関連ファイルは以下の通りです。
カーネルパニック時にダンプを採取するためには、Kernel の boot オプションに crashkernel を指定し起動します。以下のように、/boot/grub/grub.conf を編集します。例は、物理メモリの先頭 16Mbyte から 128Mbyte 分の領域を kdump で使用するという意味です。
root=0802 quiet crashkernel=128M@16M |
システムを起動します。起動後にメモリの確保を確認するには /proc/iomem の Crash kernel を参照します。
# cat /proc/iomem 01000000-08ffffff : Crash kernel |
kdump サービスを起動します。
# /etc/init.d/kdump start No kdump initial ramdisk found. Rebuilding /boot/initrd-2.6.23-2kdump.img Starting kdump: OK |
起動時に、kdump 用の initrd が /boot 以下に initrd-`uname -r`kdump.img として作成されます。その後 kdump 用の vmlinuz(カーネル)と initrd がメモリ上にロードされます。
![]() | kdump 起動後に /etc/kdump.conf を変更した場合には、サービスを再起動をして kdump 用の initrd を作成し直す必要があります。
|
![]() | メモリにロードした kdump 用の vmlinuz と initrd をアンロードするには次のように実行します。
|
次のように実行をして 1 と表示されれば正常にロードされています。
# cat /sys/kernel/kexec_crash_loaded 1 |
再起動後に kdump を有効にするために以下のように実行しておきます。
# chkconfig kdump on # chkconfig --list kdump kdump 0:off 1:off 2:on 3:on 4:on 5:on 6:off |
/etc/kdump.conf ファイルにカーネルダンプの出力先に関する指定を記述します。ローカルディスクに出力する場合には特に変更は必要ありません。設定を変更した場合は、次のように実行し initrd の再作成を行います。
# /etc/init.d/kdump restart |
以上で設定は完了です。テスト的に panic をおこし確認をするには次のように実行します。
# echo 1 > /proc/sys/kernel/sysrq # echo c > /proc/sysrq-trigger |
デフォルトの状態では、ロードしている kdump 用のカーネルが init3 に移行し kdump が /proc/vmcore を採取します。正常に採取が行われると kdump は reboot コマンドを実行し、システムは再起動されます。
採取されたダンプファイルは、/var/crash/年-月-日-時:分ディレクトリ以下の vmcore ファイルとして出力されています。
![]() | /etc/kdump.conf を編集し出力先の指定を scp や nfs などに変更した場合には、initrd の中で処理が行われるため init3 へは移行されません。 |