2006年07月07日

Linuxでクラッシュダンプを採取(2) 〜 カーネルパニックを起こしてみる 〜

はてなブックマークに登録

前回は、カーネルパニック時にkexecでセカンドカーネルを起動できる仕組みまで整えてみました。
今回は、実際にセカンドカーネルを読み込ませてみて動作確認をしてみたいと思います。

実行すべきコマンドはこんな感じになります。

kexec -p --args-linux --elf32-core-headers --append="文字列" ファイル名



オプションの意味は以下の通り。

-p パニックが起きたらセカンドカーネルを起動する
--args-linux Linuxカーネルスタイルのオプションを使用する
--elf32-core-headers elf32形式でコアヘッダを用意する
--append=STRING カーネルに渡すコマンドラインオプションを指定する



ということで、こんなコマンドを組み立ててみました。

kexec -p \
--args-linux \
--elf32-core-headers \
--append="root=/dev/sda3" \
/boot/vmlinuz-second



でもちょっとまってください、
このままだとセカンドカーネルが起動すると、/dev/sda3 をルートマウントした後 init を起動してしまいます。ダンプを採取したいだけなのに通常の起動処理も走ってしまうわけです。
「起動スクリプトの中で分岐して・・・・」と一瞬頭をよぎりましたが、それもちょっと面倒なので、こんな感じにしてみました。


kexec -p \
--args-linux \
--elf32-core-headers \
--append="root=/dev/sda3 init=/sbin/init.crash" \
/boot/vmlinuz-second



/sbin/init.crashの中身はこんな感じ

#!/bin/sh
/bin/mount -t proc proc /proc
/bin/cp /proc/vmcore /tmp/
echo s > /proc/sysrq-trigger
echo u > /proc/sysrq-trigger
echo b > /proc/sysrq-trigger



起動時に init を呼び出す代わりに /sbin/init.crash というシェルスクリプトを呼び出すようにしてみました。内容は見ての通りで /proc/vmcore/tmp にコピーして再起動するだけのものです。

では早速パニックさせてみます。

echo c > /proc/sysrq-trigger



なにやらブートメッセージが流れ出したかと思うと自動で再起動がかかるではありませんか!(笑)
少し感動しながら元のカーネルで起動してみると、ちゃんと /tmp/vmcore ができているようです。

とりあえずの動作確認は完了しましたが、この方法には問題があります。
それは、init の代わりにシェルスクリプトを使ってしまっている点です。

もし、ディスクが壊れて必要なライブラリが読めなくなってしまったり、そもそもディスクやコントローラが応答不能になってしまった場合はどうなるでしょうか。なんらかの障害発生時において、シェルスクリプトが正常に動作できる保証はどこにもないわけです。この方法は kexec の動作確認程度には利用できますが、実際の運用には耐えられないと思います。

それじゃあどうすればいいの? というのはまた次回までに考えてみたいと思います。

klab_gijutsu2 at 17:21│Comments(0)TrackBack(0)

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント