パフォーマンス向上でナニに使える? OpenBlocks Aファミリによるサーバ実力診断

第4回GPIOにつないだパトランプで通知する、死活監視システム

はじめに

OpenBlocks A6(以降、A6)は本体にGPIOコネクタを持っています。GPIOの使い方は簡単ですが、馴染みの少ない方々にも興味を持っていただければと考え、今回のテーマとしました。GPIOにパトランプを接続した死活監視システムを構築して、GPIOの入出力手順を説明します。

監視アプリにはNagiosを使用し、異常を検知したときにパトランプを点灯することで異常を通知させます。システムの外観は写真1のとおりです。

写真1 外観
写真1 外観

A6のGPIOについて

GPIOとはGeneral Purpose Input/Outputの略称で、⁠汎用入出力」と訳されます。⁠汎用」と呼ばれるように、各ピンには決まった用途は割り当てられていません。1ピンずつON/OFFとして使用することも、複数をまとめてパラレルデータとして使用することもできます。今回は1ピンずつのON/OFF制御で3本使います。

次項より、A6のGPIOの概要とLinux上での操作方法を説明します。

Marvell 88F6283のGPIO

A6のCPUは、Marvellの88F6283です。このCPUはMulti Purpose Pins(MPP)というピンを50ピン持っています。このMPPはGPIOとしても使えますし、ほかにSDIO、GbE、Audioなどの機能としても使える多目的なピンです。

GPIOコネクタのピン配置

A6は背面写真2に、2mm×2mmピッチの16ピンコネクタを持っています。50ピンのMPPのうち未使用の24~31番をGPIOとして使用し、GPIOコネクタの5~12番ピンに割り当てています。表1にGPIOコネクタのピン配列を示します。

写真2 OpenBlocks A6の背面
写真2 OpenBlocks A6の背面
表1 GPIOコネクタピン配列
番号ピン名番号ピン名
1+3.3V2+3.3V
3GND4GND
5GPIO246GPIO25
7GPIO268GPIO27
9GPIO2810GPIO29
11GPIO3012GPIO31
13+3.3V14
15GND16

GPIOの操作方法

Linuxでは、sysfsを介してGPIOを操作します。sysfsからGPIOコネクタまでの経路を図1に示します。

図1 sysfsからGPIOコネクタまでの構成
図1 sysfsからGPIOコネクタまでの構成

A6におけるGPIOへの操作手順を説明しましょう。まず、GPIOは/sys/class/gpioディレクトリにエントリされます。初期構成は図2のようになっています。

図2 gpioフォルダの初期構成
# cd /sys/class/gpio/
# ls -F
export  gpiochip0@  unexport

exportファイルに、操作する24~31のGPIO番号を書き込みます。たとえば、GPIOコネクタの5番ピンのGPIO24(表1を参照)を操作する場合は、exportに24を書き込みます。すると、図3のようにgpio24というシンボリックリンクが作成されます。操作には、gpio24ディレクトリ内のdirectionとvalueを使用します。

図3 GPIOコネクタの5番ピンを操作する例
# echo 24  > export
# ls -F
export  gpio24@  gpiochip0@  unexport
# cd gpio24
# ls -F
direction  subsystem@  uevent  value

directionファイルでは入力/出力の切り替えを行います。directionファイルには、out/in/high/lowの4種類が設定できます。今回はoutとinの2つを使用します。valueファイルではデータの取得と設定を行います。valueの値は、0と1でそれぞれlowとhighを意味します。highがONとは限りません。接続する機器によってはOFFの場合もあります。directionとvalueの操作例が図4です。なお、directionをinに設定してvalueに書き込みを行うと書き込みエラーが発生するので注意してください。

図4 directionとvalueの操作例
# cd gpio24
# cat direction
in
# echo out  > direction
# cat direction
out
# cat value
1
# echo 0  > value
# cat value
0

監視システムの構築

今回の監視システムでは、HTTPサーバの死活監視を行います。HTTPサーバの構築手順については、Apacheなどの一般的なソフトウェアで/(ルート)へのアクセスができれば問題ありません。今回は本題とはそれますので、説明は割愛します。

監視システムの構成

システムの構成を図5に示します。NagiosがHTTPサーバの停止を検知した場合、パトランプ制御スクリプトを実行し、パトランプとブザーを起動します。HTTPサーバの復帰を検知した場合、パトランプとブザーを停止します。プッシュスイッチは、パトランプとブザーを停止する手動スイッチです。

図5 監視システム構成図
図5 sysfsからGPIOコネクタまでの構成監視システム構成図

パトランプ基板の説明

パトランプ基板は、パトランプとGPIOを接続するための簡単な基板です。この基板の回路図を図6に示します。J2コネクタにパトランプを接続します。BZ1がブザーで、SW1がプッシュスイッチです。A6のGPIOとパトランプ基板は表2のように接続しています。5番ピンはONをlowとして、9番ピンはONをhighとしています。

図6 パトランプ基板の回路図
図6 パトランプ基板の回路図
表2 GPIOコネクタのピン割り当てと設定値
番号ピン名機能出力方向valueファイルの値
5GPIO24パトランプ、ブザーoutON=0、OFF=1
8GPIO27パトランプの光り方out点滅=0、回転=1
9GPIO28プッシュスイッチinON=1、OFF=0

A6の設定

A6のOSはDebian 6.0です。Nagiosのインストールはaptitudeコマンドで行います。OSは256MBのRAMディスクで動作していますが、Nagios関連のパッケージサイズは依存関係を含めると167MBを超えRAMディスクのみでは導入しきれないため、SSDを接続してストレージ併用モードで使用します。

SSDをext3でフォーマットして、ボリュームラベルを⁠DEBIAN⁠に設定し、本体を再起動します図7⁠。

図7 ストレージの設定
# fdisk /dev/sda
# mke2fs -j -b 4096 -L DEBIAN /dev/sda1
# reboot

OpenBlocksシリーズは、ストレージのボリュームラベルをDEBIANに設定すると、unionfsを使用して元のRAMディスクを拡張します。図8のunionfsでマウントされている/etcから/mediaのディレクトリに追加/変更を行ったファイルは、すべてSSD(/.rw以下)に保存されます。ストレージ併用モードの準備が整ったことを確認できたら、aptitudeコマンドでNagiosをインストールします図9⁠。

図8 dfコマンドの出力
# e2label /dev/sda1
DEBIAN
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/ram0             124M   90M   29M  76% /
udev                   10M   88K   10M   1% /dev
tmpfs                  64M  4.0K   64M   1% /dev/shm
/dev/sda1              14G  455M   13G   4% /.rw
unionfs                14G  455M   13G   4% /etc
unionfs                14G  455M   13G   4% /bin
unionfs                14G  455M   13G   4% /home
unionfs                14G  455M   13G   4% /lib
unionfs                14G  455M   13G   4% /sbin
unionfs                14G  455M   13G   4% /usr
unionfs                14G  455M   13G   4% /var
unionfs                14G  455M   13G   4% /root
unionfs                14G  455M   13G   4% /opt
unionfs                14G  455M   13G   4% /srv
unionfs                14G  455M   13G   4% /media
図9 Nagiosのインストール
# aptittude install nagios3

Nagiosの設定

HTTPサーバの追加とパトランプを点灯する設定を行います。その他はデフォルトの設定を使用します。

ホストの登録

/etc/nagios3/conf.d/localhost_nagios2.cfgにリスト1の設定を追加します。デフォルトで設定されているlocalhostの設定をコピーして、host_name、alias、addressを変更します。

リスト1 ホストの追加
define host{
    use             generic-host        ; Name of host template to use
    host_name       obs600web
    alias           obs600web
    address         172.16.12.101
}

HTTPサービスの追加

/etc/nagios3/conf.d/hostgroups_nagios2.cfgをリスト2のように修正します。先ほどリスト1で追加したホストをHTTPサービスのmembersにカンマで区切って追加します。

リスト2 HTTPサービスの追加
define hostgroup {
    hostgroup_name  http-servers
        alias       HTTP servers
        members     localhost*,obs600web*
}

パトランプ制御スクリプトの登録

/etc/nagios3/command.cfgにリスト3の設定を追加します。スクリプトの内容については後述します。$SERVICESTATE$を使用してHTTPサーバの状態をスクリプトに渡しています。$SERVICESTATE$には、OK/WARNING/CRITICAL/UNKNOWNの4パターンで文字列が指定されます。

リスト3 パトランプ制御スクリプトの登録
define command{
    command_name    notify-service-by-beacon
    command_line    /usr/local/bin/obsa6_beacon.sh $SERVICESTATE$
}

通知コマンドの追加

/etc/nagios3/conf.d/contacts_nagios2.cfgをリスト4のように修正します。先ほどリスト3で追加したスクリプトを、service_notification_commandsにカンマで区切って追加します。

リスト4 通知コマンドの追加
define contact{
    contact_name                    root
    alias                           Root
    service_notification_period     24x7
    host_notification_period        24x7
    service_notification_options    w,u,c,r
    host_notification_options       d,r
    service_notification_commands   notify-service-by-email*,notify-service-by-beacon*
    host_notification_commands      notify-host-by-email
    email                           root@localhost
}

制御スクリプトの説明

制御スクリプトはNagiosから起動され、パトランプとブザーを制御するスクリプトと、メモリに常駐してプッシュスイッチを監視するスクリプトの2種類になります。2つのスクリプトは、実行属性を付加して/usr/local/binに保存します。

パトランプ制御スクリプト

引数のHTTPサーバのステータス($SERVICESTATE$)によって、パトランプとブザーのON/OFFを行いますリスト5⁠。

リスト5 obsa6_beacon.sh
#!/bin/sh

SYSFS_GPIO=/sys/class/gpio

if [ ! -f $SYSFS_GPIO/gpio27 ]; then  ……(1)
    echo 27  > $SYSFS_GPIO/export
    echo out  > $SYSFS_GPIO/gpio27/direction
fi
if [ ! -f $SYSFS_GPIO/gpio24 ]; then  ……(2)
    echo 24  > $SYSFS_GPIO/export
    echo out  > $SYSFS_GPIO/gpio24/direction
fi

# Patlamp ON
if [ "$1" = "CRITICAL" ]; then
    echo 0  > $SYSFS_GPIO/gpio27/value  ……(3)
    echo 0  > $SYSFS_GPIO/gpio24/value  ……(4)

# Patlamp OFF
elif [ "$1" = "OK" ]; then
    echo 1  > $SYSFS_GPIO/gpio24/value  ……(5)
else
    echo parameter error
fi

リスト5の(1)⁠2)は、GPIO24と27のファイルが存在しない場合に初期設定を行います。GPIO24はパトランプとブザーのON/OFF、GPIO27はパトランプの光り方を割り当てたピンです。⁠3)では、パトランプの光り方を点滅に設定します。⁠4)では、$SERVICESTATE$がCRITICALになった場合にパトランプとブザーをONにします。⁠5)では、$SERVICESTATE$がOKになった場合にパトランプとブザーをOFFにします。$SERVICESTATE$のCRITICALはHTTPサービスの停止、OKはHTTPサービスの復帰に相当します。

プッシュスイッチ検出スクリプト

1秒ごとにプッシュボタンをチェックして、押されたときにパトランプとブザーをOFFにしますリスト6⁠。

リスト6 obsa6_pushsw.sh
#! /bin/sh

SYSFS_GPIO=/sys/class/gpio

while :
do
    # initialize
    if [ ! -f $SYSFS_GPIO/gpio28 ]; then  ……(1)
        echo 28  > $SYSFS_GPIO/export
        echo in  > $SYSFS_GPIO/gpio28/direction
    fi
    var=`tr -d '\n'  < $SYSFS_GPIO/gpio28/value`  ……(2)
    if [ "$var" != "0" ]; then  ……(3)
        if [ ! -f $SYSFS_GPIO/gpio24 ]; then  ……(4)
            echo 24  > $SYSFS_GPIO/export
            echo out  > $SYSFS_GPIO/gpio24/direction
        fi
        echo 1  > $SYSFS_GPIO/gpio24/value  ……(5)
    fi
    sleep 1
done

リスト6の(1)では、GPIO28のファイルが存在しない場合の初期設定を行います。GPIO28は、プッシュスイッチのON/OFFを割り当てたピンです。⁠2)⁠3)ではvalueファイルから値を取得し、プッシュスイッチの状態を確認します。⁠4)では、GPIO24のファイルが存在しない場合に初期設定を行います。GPIO24は、パトランプとブザーのON/OFFを割り当てたピンです。⁠5)でパトランプとブザーを停止します。

動作確認

動作確認はHTTPサーバのHTTPサービスを手動で停止して確認します。HTTPサーバのマシンは起動しているが、HTTPサービスは停止しているという状況を作ります。

HTTPサーバの停止

HTTPサーバを停止する前に、A6のNagiosを再起動してプッシュスイッチ検出スクリプトを起動しておきます図10⁠。

図10 Nagiosの再起動とプッシュスイッチ検出スクリプトの起動
# /etc/init.d/nagios3 restart
# /usr/local/bin/obsa6_pushsw.sh &

そのあと、コマンドラインからHTTPサービスを停止します図11⁠。

図11 HTTPサーバの停止
# /etc/init.d/apache2 stop

HTTPサーバの異常検出

Nagiosはデフォルト設定で5分間隔で状態のチェックを行います。異常を確認すると1分間隔でチェックを行い、4回異常が続くと通知を発行します。したがって、HTTPサーバが停止してから4~9分の間に通知が発行されることになります。また、異常発生後の1分間隔の状態チェック中にHTTPサーバが復帰した場合は、1回の確認だけで元の5分間隔の状態チェックに戻ります。

図12はNagiosのログです。5行目でnotify-service-by-beaconが通知されています。パトランプが点灯した瞬間が写真3です。Nagiosのデフォルトの設定では、状態異常を検知したときに1回だけ通知し、それ以降は通知をしません。

図12 /var/log/nagios3/nagios.log(抜粋)
[1346303726] SERVICE ALERT: obs600web;HTTP;CRITICAL;SOFT;1;Connection refused
[1346303786] SERVICE ALERT: obs600web;HTTP;CRITICAL;SOFT;2;Connection refused
[1346303846] SERVICE ALERT: obs600web;HTTP;CRITICAL;SOFT;3;Connection refused
[1346303906] SERVICE ALERT: obs600web;HTTP;CRITICAL;HARD;4;Connection refused
[1346303906] SERVICE NOTIFICATION: root;obs600web;HTTP;CRITICAL;notify-service-by-beacon;Connection refused
[1346303906] SERVICE NOTIFICATION: root;obs600web;HTTP;CRITICAL;notify-service-by-email;Connection refused
写真3 パトランプ点灯
写真3 パトランプ点灯

おわりに

A6のGPIOは、今回のようなパトランプのほか、7セグLEDなどをつないで光での通知などの用途にも使用できます。GPIO自体はON/OFFの単純な操作しかできませんが、アイデア次第でさまざまな用途に活用できます。Linuxからの操作も、今回紹介したとおり非常に手軽に行えますので、ぜひ活用してください。

参考文献
Nagios 3翻訳プロジェクト
URL:http://nagios.x-trans.jp/nagios/index.php
The Linux Kernel Archives
URL:http://www.kernel.org/doc/Documentation/gpio.txt

おすすめ記事

記事・ニュース一覧