ブログ

ソフトウェアウォッチドッグタイマーの使用方法

at_ito
2015年4月6日 9時02分

製品化の際に、アプリケーションが動かなくなった場合などに再起動するためウォッチドッグタイマーを使用する場合があるかと思います。ここではウォッチドッグタイマーの使用方法について説明します。

ウォッチドッグタイマーにはハードウェアウォッチドッグタイマーと、ソフトウェアウォッチドッグタイマーがあります。

ハードウェアウォッチドッグタイマーはCPUのウォッチドッグタイマーの機能を使用しており、ブートローダー(Hermit-At)もしくは、Linuxカーネルで使用しています。そのため、ブートローダーやLinuxカーネルが正常に動作せず、ハードウェアウォッチドッグタイマーをキックできない場合にのみ自動的に再起動が行われます。そのため、アプリケーションが正常に動作しない場合等に使うことには向いていません。

ソフトウェアウォッチドッグタイマーは、Linuxカーネルが提供している機能です。アプリケーション等の死活監視を行う場合に使用することができます。製品化の際に、実装する場合はほぼソフトウェアウォッチドッグタイマーを使用する形になるかと思います。

そのため、ここではソフトウェアウォッチドッグタイマーを使用する方法を以下に紹介します。

カーネルコンフィギュレーションの変更

ソフトウェアウォッチドッグタイマーが使えるようにカーネルを 変更する必要があります。カーネルコンフィギュレーションを 以下のように変更することで、ソフトウェアウォッチドッグタイマーが 有効になります。

Linux Kernel Configuration
  Device Drivers  --->
    [*] Watchdog Timer Support  ---> #チェックを入れる
      <*>   Software watchdog        #チェックを入れる

ソフトウェアウォッチドッグタイマーの使用方法

ソフトウェアウォッチドッグタイマーの制御は、ユーザー空間で 動作するアプリケーションプログラムで行います。使用方法は以下のとおりです。

1. アプリケーションプログラムで、/dev/watchdog(※1)をopen()すると、
   ソフトウェアウォッチドッグタイマーが有効になります。
2. 以後、/dev/watchdogに任意の文字をwrite()すると、
   ソフトウェアウォッチドッグタイマーがキックされます。
3. 一定時間(標準では60秒間)ソフトウェアウォッチドッグタイマーが
   キックされず、タイムアウトした場合、システムがリブートします。

※1: 環境により/dev/watchdog1等のファイル名になることがありますので、お使いの環境により読み替えてください。

ソフトウェアウォッチドッグタイマーの無効化

以下のコマンドを実行することで、ソフトウェアウォッチドッグタイマーを無効化できます。

echo "V" > /dev/watchdog

ソフトウェアウォッチドッグタイマーのタイムアウト時間の変更

hermitプロンプトで、以下のコマンドを実行し、softdog.soft_marginの値を設定することでタイムアウト時間の設定が可能です。

hermit> setenv console=ttymxc1 softdog.soft_margin=30

ソフトウェアウォッチドッグタイマーの動作確認

ウォッチドッグタイマを使用する簡単なサンプルプログラムが、 user/busybox/*/miscutils/watchdog.c にあります。このプログラムは、 標準で有効になっていますので、標準のユーザーランドで使用可能です。

ソフトウェアウォッチドッグタイマを有効にしたカーネルで起動し、 下記のようにコマンドを実行することで、ソフトウェアウォッチドッグタイマの 動作を確認することができます。

[armadillo ~]# watchdog -t 10 /dev/watchdog       #10秒ごとにウォッチドッグタイマをキックする
[amradillo ~]#                                    #プロセスはバックグラウンドで動作しつづける
[armadillo ~]# ps                                 #プロセス一覧の確認
  PID  Uid     VmSize Stat Command
    1 root        684 S   init
    2 root            SW< [kthreadd]
(中略)
 1349 root        272 S   watchdog -t 1 /dev/watchdog                 #watchdogプロセスのPIDは1349
 1350 root        752 R   ps
[armadillo ~]# kill 1349                          #watdhdogプロセスをkill
SoftDog: Unexpected close, not stopping watchdog!
[armadillo ~]# SoftDog: Initiating system reboot. #一定時間経過するとシステムがリブートする
Hermit-At v2.1.3-1 (armadillo4x0) compiled at 16:39:56, Aug 24 2011
hermit>