home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

技術/BSD/FreeBSDでのKernel Core or Crash Dumpの取得方法メモ

技術/BSD/FreeBSDでのKernel Core or Crash Dumpの取得方法メモ

技術 / BSD / FreeBSDでのKernel Core or Crash Dumpの取得方法メモ
id: 891 所有者: msakamoto-sf    作成日: 2011-01-07 21:22:22
カテゴリ: BSD 

FreeBSDでのKernel Crash Dump, Core Dump の取得方法についてメモ。

一次資料:

Dumpの取得方法それ自体については上記資料の他にも色々見つかりますが、実際に実験しようとすると、まずCrash自体を発生させないとDumpも生成されない。というわけで、最初にGENERICカーネルでもプログラミング不要で使えるpanic(9)発生方法をまとめて、その後、Dumpの取得方法や必要な設定についてまとめます。
FreeBSD 6.0-RELEASEで確認してます。

Kernel Panic の起こし方

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" 参照。

Kernel Core Dump (Crash Dump) を保存するには

Dumpを保存するには2stepが必要。
1. kernel panic -> swapデバイスに保存される。 : dumpon(8)コマンド
2. 再起動後 -> swapデバイスからダンプデータを取り出して、適当なファイルに保存する。 : savecore(8)コマンド

基本的に "/etc/rc" により自動的に処理されるが、手動でdumpon(8)やsavecore(8)を実行することも勿論可能。
rc.conf(5)で"/etc/rc"で処理されるときのパラメータをカスタマイズすることもできる。

出典:

手動でdumpon(8), savecore(8)を実行する

まず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

自動でdumpon(8), savecore(8)実行

基本的に "/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"以下にダンプファイルが保存される。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2011-01-07 21:25:53
md5:c41acb71878dca938860a53dfbf6d09b
sha1:000f3b0a844bcde19f0f921247a31ab313399056
コメント
コメントを投稿するにはログインして下さい。