Linuxでウオッチドッグ機能を使用する

ALL
スポンサーリンク

システムが正常に動作しているか監視し、異常発生時にシステムのリセット等を行う「ウオッチドッグ」についてです。

ウオッチドッグでは、定期的にソフトウェアがハードウェアタイマーにアクセスします。
もし、このアクセスが途絶えると、システムに異常が発生したと判断し、リセット等が行われます。

ハードウェアタイマーが無い場合は、softdog と呼ばれるソフトウェア版を利用します。
ただし、ハードウェアタイマーがハードウェアでリセットを実施するのに対し、softdog ではソフトウェアでリセットを実施します。
softdog自体も動作できないような状況下では、リセットがされないので、ハードウェアタイマーがある場合はそちらを使用します。

タイマーの確認

マザーボードでインテル・チップセットを使っている場合、ハードウェアタイマーが利用できます。
rootで lsmod | grep iTCO_wdt を実行し、iTCO_wdt を含む行が表示されれば、ハードウェアタイマーが利用できます。

# lsmod | grep iTCO_wdt
iTCO_wdt                7115  0
iTCO_vendor_support     3056  1 iTCO_wdt

無い場合は、ソフトウェア版タイマー softdog を使用します。

root で modprobe softdog 実行後に、lsmod | grep softdog を実行します。
softdog を含む行が表示されれば使用できます。

# lsmod | grep softdog
softdog                13319  0

以上で、ハードウェアタイマー iTCO_wdt か、ソフトウェア版タイマー softdog、どちらが使用できるかを確認しておいて下さい。
後ほど、設定でどちらを使用するかを指定します。

パッケージインストール

Linuxでは「ウオッチドッグ」機能を提供するパッケージ watchdog があります。

インストールは下記で行います。

Ubuntu の場合
apt-get install watchdog
CentOS の場合
yum install watchdog

設定

タイマーの確認 の箇所で、ハードウェアタイマー iTCO_wdt か、ソフトウェア版タイマー softdog、どちらが使用できるかを確認しました。
どちらのタイマーを使用するかは、/etc/default/watchdog ファイルの watchdog_module 行で指定します。

・ハードウェアタイマーが使用できる場合

/etc/default/watchdog

watchdog_module="iTCO_wdt"

・ソフトウェア版タイマー softdog を使用する場合

/etc/default/watchdog

watchdog_module="softdog"

softdog を使用する場合は、カーネルパニックが発生すると softdog自身も動作出来ない為、softdogによるリセットも起こりません。
そこで、カーネルパニック時に自動起動する設定を行なっておきます。

/etc/sysctl.conf

kernel.panic = 60
kernel.panic_on_oops = 1

設定を反映させます。

sysctl -p

ハードウェアタイマーや、ソフトウェア版タイマーの設定で行った設定を、watchdogへ反映させます。

/etc/init.d/watchdog stop
/etc/init.d/watchdog start

なお、/etc/init.d/watchdog reload とすると、/etc/default/watchdog の watchdog_module行で指定したモジュールの反映が行われません。
必ず、上記のように stop した後に start して下さい。

設定後、システム起動時にも自動的に watchdog が起動するようになります。

動作

watchdogパッケージでは、システム起動時の出来るだけ早い時期に、プロセス wd_keepalive が起動します。
システム起動が完了すると、プロセス wd_keepalive が終了し、プロセス watchdog が起動します。

プロセス wd_keepalive , watchdog は、一定時間ごとに、ハードウェアタイマー iTCO_wdt や、ソフトウェアタイマー softdog へアクセスします。
アクセスは、/dev/watchdog を介して行われます。
デフォルトでは、60秒間 /dev/watchdog へのアクセスが滞ると、システムがリセットされます。

ちなみに、softdog で実施されるリセット処理は、下記で紹介した echo b > /proc/sysrq-trigger と同じことが実施されます。

linux強制再起動 - shutdownコマンドでもダメな時の再起動手段 パソコン鳥のブログ

システム停止時には、プロセス watchdog が終了して、代わりにプロセス wd_keepalive が起動します。

これで、ウオッチドッグ機能が動作できます。

設定その2

動作 の箇所の説明で、プロセス watchdog、wd_keepalive の2つが出てきましたが、違いは何でしょうか?

wd_keepalive は、一定時間ごとに、ハードウェアタイマー iTCO_wdt や、ソフトウェアタイマー softdog へアクセスする機能だけです。

一方、watchdog は一定時間ごとにタイマーへアクセスする機能に加えて、システムを監視して異常になったらリブートを行う機能があります。
例えば、ロードアベレージを監視して、高すぎる場合にはリブートさせることが出来ます。

ここで行われるリブートは通常のシステム再起動時と異なり、実施されるリブート手順が簡単になっています。
これは、watchdog がリブートするような、メモリ使用量異常やロードアベレージが高い状況では、通常のリブートでは失敗する可能性が高いからです。
その為、watchdog ではより確実にリブートできるようになっているようです。

以降では、watchdog で監視できる項目とその設定について説明します。
設定後は、/etc/watchdog.conf に記述し、次のコマンドで watchdogへ反映させて下さい

/etc/init.d/watchdog stop
/etc/init.d/watchdog start

・ロードアベレージ
指定したロードアベレージ以上になると、異常と判定します。
1,5,15分平均のロードアベレージを下記書式で指定します。

max-load-1 = 40
max-load-5 = 30
max-load-15 = 20

・ネットワークインタフェースでのパケット受信
指定したネットワークインタフェースでパケットを受信していないと、異常と判定します。
下記書式で指定します。指定は、複数行出来ます。

interface = eth0

パケット受信のチェックは、デフォルトでは1秒ごとに行われます。
この監視項目では、チェック間隔をデフォルトの1秒から長くした方が良いです。
チェック間隔は /etc/watchdog.conf で下記のように秒数で指定して下さい。

/etc/watchdog.conf

interval = 3

間隔が短いと、異常と判断されやすくなります。
但し、間隔が長過ぎると、異常に気付くまでに時間がかかることになりますので、バランスをとって下さい。

・ping の疎通
指定した宛先アドレスに ping が通らないと、異常と判定します。
宛先をを下記書式で指定します。指定は、複数行出来ます。

ping = 192.168.1.100

・メモリ使用量
メモリの空き容量が一定サイズ以下で、異常と判定します。
空き容量はページ数で下記書式で指定します。
1ページは 4096 Bytes なので、下記の例では 4096Bytes × 10000 = 約40MB を指定しています。

min-memory = 10000

なお、「メモリの空き容量」は、/proc/meminfo の結果の MemFree:の行と、SwapFree:の行の合計です。
watchdog の-ソース memory.c にて確認しました。

参考

ウォッチドッグタイマで自動的に再起動する – いますぐ実践! Linuxシステム管理 / Vol.198

Linux/softdog(watchdog) – PukiWiki Plus!

仙石浩明の日記: ウォッチドッグ タイマ

仙石浩明の日記: ハードウェア・ウォッチドッグ・タイマー iTCO_wdt のススメ

kernel – カーネルパニック時に自動で再起動させる – Qiita

watchdog(8): software watchdog daemon – Linux man page
Linux Watchdog

コメント