Linuxで BMC Watch Dog を使う

自宅サーバーに使用している Supermicro X7SPA-HF-D525BMC (Nuvoton WPCM450) という独立した小さなコンピューターのようなものを持っており、もしカーネル・パニックなどでOSがハングしたときに、BMCが自動的にマシンを再起動してくれる Watch Dog という機能がついている。BMCはOSの管轄外なので、OSがハングしてもBMCは問題なく動くことができる。

ではBMCはどうやってマシンがハングしていると判断するのだろうか。BMCは Watch Dog Timer というものを内蔵しており、それがカウントダウンしていってゼロになるとマシンを再起動する。なのでOSは Watch Dog Timer を定期的にリセットしてゼロにならないようにすれば再起動は掛からない。つまり「Watch Dog Timer をリセットできない」=「マシンがハングしている」というわけだ。

X7SPA-HF-D525の BMC Watch Dog Timer を有効にするには、BIOSの「Advanced > IPMI Configuration > BMC Watch Dog Timer Action」を Reset System などに変更し、BMC Watch Dog TimeOut でタイマーの時間を指定する。5 min とは5分間に1度でもタイマーをリセットすればよい一方、ハングしてから再起動が掛かるまで最大5分間のラグがあるということを意味する。X7SPA-HF-D525では5分、1分、30秒、10秒から選べるが、あまり短いとOSの負荷が高いためにタイマーをリセットできなかったときにも誤って再起動を掛けてしまう可能性が高くなるため、ラグが許容できる範囲で長いほうが安心だろう。なお、これを今すぐ設定しまうと、手動でタイマーを定期的にリセットする必要に迫られるので、実際には自動でタイマーをリセットできる環境を整えてから有効にしたほうが良いかもしれない。

以下は Scientifc Linux (SL) 5.5 で設定する方法だが、Red Hat Enterprise Linux (RHEL) / CentOS / Oracle Linux でも同様だろう。

BMC Watch Dog Timer のリセットはIPMI経由で行うので、OpenIPMIとOpenIPMI-toolsをインストールする。

ipmiサービスをOS起動時に自動的に開始するようにして、サービスを開始する

BMC Watch Dog Timer の状況を見てみよう。Watchdog Timer Use がBIOS/POSTなのでBMCを使用した Watch Dog であり、タイマーの持ち時間 (Initial Countdown) は300秒(5分)で、現在 (Present Countdown) は残り257秒であることが分かる。

Resent Countdown が 0 sec になるとマシンが再起動されるはずなので試してみよう。ただし、OSが強制再起動されるため、ディスク書込みなどは控えた状態で行うほうが良いだろう。

それでは BMC Watch Dog Timer をリセットしよう。

というわけで、このリセット・コマンドを1分間隔で自動実行したいと思う。方法は2通り考えられ、一つはCronで1分間隔に実行する方法、もう一つはデーモン・プロセスが1分間隔に実行する方法だ。Cronを使用する方法は手軽だが /var/log/cron が1分に1行ずつ増えてしまって見づらくなり、デーモンを使用するとその逆となる。機能的には同じなので好みで選んでほしい。

Cronを使用する方法では以下のようなスクリプトを用意した。以下のソースコードはBSDライセンスを元としたこちらのライセンスに従って再頒布および使用ができる。最新のファイルは GitHub: rewse: bmcwatchdog にある。

/var/log/cron に以下のように出力され、ipmitool mc watchdog get すれば Present Countdown がリセットされていることを確認できるだろう。

続いてデーモン・プロセスを作成する方法について記述する。デーモン自体となるスクリプトと、OS起動時にそれを開始するスクリプトの2つを用意する。以下のソースコードはBSDライセンスを元としたこちらのライセンスに従って再頒布および使用ができる。最新のファイルは GitHub: rewse: bmcwatchdog にある。

watchdogdサービスをOS起動時に自動的に開始するようにして、サービスを開始する。

serviceコマンドを実行したシェルを閉じてもwatchdogdプロセスが存在し、Present Countdown がリセットされていることを確認しよう。

コメントを残す