FreeBSDでのKernel Crash Dump, Core Dump の取得方法についてメモ。
一次資料:
Dumpの取得方法それ自体については上記資料の他にも色々見つかりますが、実際に実験しようとすると、まずCrash自体を発生させないとDumpも生成されない。というわけで、最初にGENERICカーネルでもプログラミング不要で使えるpanic(9)発生方法をまとめて、その後、Dumpの取得方法や必要な設定についてまとめます。
FreeBSD 6.0-RELEASEで確認してます。
Crash Dumpの解析をしてみたいが、そのためにはKernel Panicが発生する必要がある。
panic(9)を使うのが素直な方法らしいが、そのためだけにわざわざカーネルモジュールを作るのは手間。
というわけで、とにかくpanic(9)を起こしたことにする方法。ざっとググッてみたところ2通りあるっぽい。
一つが sysctl の "debug.kdb.panic" オプションに1を設定する方法。
# sysctl -d debug.kdb.panic debug.kdb.panic: set to panic the kernel # sysctl debug.kdb.panic=1 →即座にpanic
出典:
もう一つが、
# sysctl -d machdep.enable_panic_key machdep.enable_panic_key: Enable panic via keypress specified in kbdmap(5) # sysctl machdep.enable_panic_key=1
としておいて、現在使っているキーマップファイルで、アクションに"panic"を設定したキーを用意し、コンソールから入力する方法。
出典:
"debug.kdb.panic"の方法については、昨日から使い始めたFreeBSD 6.0-RELEASEでは
# sysctl -d debug.kdb.panic sysctl: unknown oid 'debug.kdb.panic'
となってしまい認識されない。
"machdep.enable_panic_key"については、少なくとも2004年7月頃にパッチが投稿されているので、それ以降なら使える可能性が高い。
2005年11月リリースのFreeBSD 6.0-RELEASEで問題なく機能した。
というわけで"machdep.enable_panic_key"によりpanic発生方法についてメモ。
FreeBSD 6.0-RELEASEのGENERICカーネルでも使える。
まずこのオプションに1を設定する。
# sysctl machdep.enable_panic_key=1
以降もずっと有効にしたければ /etc/sysctl.conf に登録しておく。
次に、現在使っているコンソールのキーマップに"panic"アクション用のキーを設定する。
"/etc/rc.conf"でキーマップを確認:
# grep keymap /etc/rc.conf keymap="jp.106"
"keymap"の値に".kbd"を付ければ、キーマップのファイル名になる。この例なら:
/usr/share/syscons/keymaps/jp.106.kbd
がキーマップファイル名。キーマップファイルのフォーマットの詳細はkbdmap(5)参照。
とりあえず今回は"alt + ctrl + shift + p"をpanicに設定してみる。
025 'p' 'P' dle dle 'p' 'P' dle dle C → 025 'p' 'P' dle dle 'p' 'P' dle panic C
あとはkbdcontrol(1)でキーマップファイルをロードさせればOK.
# kbdcontrol -l /usr/share/syscons/keymaps/jp.106.kbd
これでコンソール上で"alt + ctrl + shift + p"を押せば、無事(?)Kernel Panicが発生する。GENERICカーネルならそのままCrash Dumpがswapデバイスに出力され、"options KDB" + "options DDB"付きのカーネルならDDBが起動する。
DDBが起動した場合は、
panic
コマンドでkernelのcore dump(=Crash Dump : 本当にCrashしたわけじゃないけど。)をswapデバイスに保存できる。詳細は前掲の "On-Line Kernel Debugging Using DDB" 参照。
Dumpを保存するには2stepが必要。
1. kernel panic -> swapデバイスに保存される。 : dumpon(8)コマンド
2. 再起動後 -> swapデバイスからダンプデータを取り出して、適当なファイルに保存する。 : savecore(8)コマンド
基本的に "/etc/rc" により自動的に処理されるが、手動でdumpon(8)やsavecore(8)を実行することも勿論可能。
rc.conf(5)で"/etc/rc"で処理されるときのパラメータをカスタマイズすることもできる。
出典:
まずswapinfoでswapデバイスがonになってるか確認、適当なswapデバイスを選ぶ。
# swapinfo Device 1K-blocks Used Avail Capacity /dev/ad0s1b 498504 0 498504 0%
dumpon(8)でダンプデータの保存先swapデバイスを設定する。
# dumpon /dev/ad0s1b
好みの方法でpanicを発生させ、swapデバイスにダンプデータを保存、その後 single user モードで再起動させる。
"/var/crash"などダンプファイル保存先のディレクトリをマウントし、savecore(8)でダンプファイルとして保存する。
OK>boot -s ... # fsck -p # mount -a # savecore /var/crash /dev/ad0s1b # exit
基本的に "/etc/rc" が自動的にdumpon(8), savecore(8)を処理してくれる。
dumpon(8)のswapデバイスを指定したい場合は
dumpdev="/dev/ad0s1XY"
などをrc.confに設定する。
savecore(8)のダンプファイル保存先ディレクトリを指定したい場合は
dumpdir="/my/crash/files"
などをrc.confに設定する。
FreeBSD 6.0-RELEASEでは /etc/defaults/rc.conf において
dumpdev="AUTO" # Device to crashdump to (device name, AUTO, or NO). dumpdir="/var/crash" # Directory where crash dumps are to be stored
が設定済みになっている。このため、殆どのケースではpanic発生時には自動的にswapデバイスにダンプデータが保存され、再起動後、自動的に"/var/crash"以下にダンプファイルが保存される。