Linuxのカーネルパニックのメッセージを記録したい・・・
私の仕事では、Linuxでサーバを構築したり、アプライアンスを開発したりすることが多いのですが、Linuxのカーネルは意外と簡単にパニックになります。まあ、私の仕事では高負荷ものが多いので・・・。
カーネルがパニックするとOS全体が止まりますので、実運用では基本的に自動でリブートさせることがほとんどでしょう。冗長化していることも多いので、サービス自体が完全に使えなくなるようなケースは避ける構成になっていて、リブートで良いのですが、問題はリブートしてしまうとパニックのメッセージが見られない点です。そもそもサーバ機は大抵モニターも繋げずに運用することが多いので、たまたま目の前でパニックが発生しても見られないことが多いものです。
パニック時にダンプさせて解析するのも良いのですが、なかなか実運用状態のサーバでダンプさせてそれを取得するのも難しいものです。そんなときに便利なのが、netconsoleで、パニック時のメッセージをネットワーク越しに飛ばすことができます。
modprobe netconsole netconsole=6665@169.254.70.1/bond0,6666@169.254.70.81/78:a5:04:ef:98:16
こんな感じに、netconsoleモジュールを組み込む際に、飛ばし元・飛ばし先のネットワーク情報を指定して使います。
さて、問題は飛ばし先です。実運用環境でカーネルパニックの調査用に追加でマシンを設置させてもらうのはなかなか困難で、飛ばし先がないのでこの方法は無理!と言われることが多かったのですが、冷静に考えれば立派なマシンである必要はないので・・・
Raspberry Piを使えば良いじゃない!と閃きました(大した閃きではありませんけど・・・)
とりあえず、会社でラズパイをセットアップする環境はあまり整えていなかったので(自宅には揃っているのですが)、純正のタッチパネル液晶モニターを買ってきました。
液晶モニターとラズパイを合体して・・・
純正ケースに入れると、
かわいい一体型PCみたいになります。実際に使ってみると、タッチパネルは7インチでは使いにくいですね。GUIが小さなタッチパネル用の設計ではないので仕方ありません。。
まあ、セットアップが進んで、ネットワークに繋がるようになると、PCからsshでログインして作業する方が便利になるので、実はこの状態で使う時間は余り長くないのですけど。
さて、ログを記録するときに重要なのは日時です。ラズパイは電源を切ってしまうと時刻が消えてしまうので、RTCは欲しいところです。NTPで時刻合わせをすれば?と思うかも知れませんが、ラズパイとは言え、ログを取るための機器を運用用のネットワークにつながせてもらえることはまずないので、インターネットにもつながらない状態で、サーバ機とダイレクトに接続するくらいしかできないことでしょうから、無理です。
とりあえず、DS3231とDS1307を使ったRTCモジュールを買ってみました。どちらも簡単に使えます。
DS3231の方が高精度らしいのですが、こちらの方が外部発信器が要らないためか、値段も安いのでした。
モジュールの裏にバッテリーを装着すれば、ラズパイの電源を切っても時計は維持できるのですが・・・
嫌な予感がして、電池ソケットの電圧を測ってみると、4Vくらい流れています。そう、充電電池を装着する想定なのでした。CR2032ではダメです。LIR2032でないと・・・
LIR2032は近所には売っていないので、とりあえずACアダプターで電源は供給して、ラズパイの電源を切ってもちゃんと時計が維持できることは実験しておきました。
自宅では安売りされていたHDMI液晶モニターキットや、大昔に使っていたUSBキーボード・マウスがあるので、便利に作業できます。
さて、LIR2032もネットで注文したのですが、結構時間がかかりそうなので、充電電池でないタイプのRTCモジュールも注文しておき、そちらが先に届きました。
こんな感じに、対象のサーバ機のメンテナンス用のネットワークポートにでも直結し、ラズパイの電源もサーバ機のUSBポートから取れば、実運用環境でも睨まれずに設置できそうです。
こちらもDS3231です。ラズパイのピンヘッダにそのまま装着できるのが便利ですが、これは既に製造中止になっているらしく、どこのショップでもなかなか在庫がありませんでした。
ラズパイでRTCモジュールを使う説明も書こうと思っていたのですが、力尽きたため、キーワードだけ列挙しておきます。ググればすぐに情報は出てきます。ただし、OSの微妙なバージョン違いや、スクリプトがやっつけ状態なので、全て完璧に綺麗に組み込むのは結構面倒です。動けば良いと言うくらいなら下記の感じで・・・。
apt-get install i2c-tools
/etc/modules
rtc-ds3232 or rtc-ds1307
/etc/rc.local
echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
or
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sleep 1
hwclock -s
/etc/default/hwclock
HCTOSYS_DEVICE=rtc0
$ sudo update-rc.d fake-hwclock disable
$ sudo update-rc.d ntp disable
さて、ラズパイにパニックログを飛ばすことは大体こんな感じでできますが(netconsoleはUDPで飛ばすので、それを受けてファイルに記録する仕組みは簡単に自作してください)、やっぱりリブート後にサーバ本体のログに記録したいので、ラズパイからrsyslogで本体に飛ばす仕組みも入れておきました。こうすると、ラズパイを取り外してログを見なくても、サーバ本体のログを見る仕組みで一緒にパニックのログも見られますので。
ということで、今どきは安価なLinux機が簡単に手に入るので、とても便利ですね!
おっと、明日は人生初の沖縄行き(仕事)で、4時起きなので、遅くまでブログを書いている場合ではないのでした。しかし、沖縄は初めてで右も左も分からず、ちゃんとJANOG会場にたどり着けるのか?食事にもありつけるのか?など、バンコク出張よりはるかに緊張しているのでした・・・。