kernel panic 時の oops メッセージを netconsole でインターネット越しに送信する
自宅サーバー (!) がちょいちょい落ちるんです。たぶんコンソールには kernal panic 時の oops メッセージが表示されてると思うんですが、モニタは繋いでないし宅内には他にサーバーもいないのでシリアル経由で送信することもできないので確認する術がなく。
で、そういえば netconsole ってのがあったなーと思い出したんで、設定してみた次第です。
ちなみに送信先は GCE の Always Free のインスタンス (ちゃんと中国とオーストラリアからのアクセスはフィルタしています) です。
疎通の確認
netconsole は UDP を使います。受信側のポート番号を決めて (6666 とします) 、まずはそれが通るようにフィルタリングの設定をします。
疎通確認はこんな感じで。
# 受信側 sudo tcpdump -i any -nlxX port 6666
# 送信側 echo konyanya-chiwa > /dev/udp/DEST_IP_ADDRESS/6666
送信側の設定
echo 'options netconsole netconsole=6665@SRC_IP_ADDRESS/eth0,6666@DEST_IP_ADDRESS/GW_MAC_ADDRESS' | sudo tee /etc/modprobe.d/netconsole.conf echo netconsole | sudo tee -a /etc/modules sudo modprobe netconsole
SRC_IP_ADDRESS
- 送信元の eth0 についてるプライベート IP アドレス
DEST_IP_ADDRESS
- 送信先のグローバル IP アドレス
GW_MAC_ADDRESS
- 送信元のデフォルトゲートウェイの MAC アドレス
- 送信先が同じサブネット内の場合は送信先の MAC アドレスを指定しますが、サブネット外の場合はデフォルトゲートウェイの MAC アドレスを指定します
00:00:5e:00:53:31
な感じで指定
試行錯誤するときはこんな感じでおk
sudo modprobe netconsole 'netconsole=6665@SRC_IP_ADDRESS/eth0,6666@DEST_IP_ADDRESS/GW_MAC_ADDRESS' sudo rmmod netconsole
受信側の設定
syslog は使わずに udplogger を使いました。
curl -L -o udplogger.c 'https://osdn.net/projects/akari/scm/svn/blobs/head/branches/udplogger/udplogger.c?export=raw' gcc -Wall -o udplogger udplogger.c mkdir /var/log/netconsole udplogger dir=/var/log/netconsole port=6666
動作確認
送信側で
echo s | sudo tee /proc/sysrq-trigger
すると、受信側で
# /var/log/netconsole/YYYY-MM-DD.log 2020-02-21 13:25:36 192.0.2.100:6665 [271267.178610] sysrq: Emergency Sync
と出力されるはずです。