はじめに
OpenBlocks A6(以降、A6)は本体にGPIOコネクタを持っています。GPIOの使い方は簡単ですが、馴染みの少ない方々にも興味を持っていただければと考え、今回のテーマとしました。GPIOにパトランプを接続した死活監視システムを構築して、GPIOの入出力手順を説明します。
監視アプリにはNagiosを使用し、異常を検知したときにパトランプを点灯することで異常を通知させます。システムの外観は写真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コネクタのピン配列を示します。
表1 GPIOコネクタピン配列
番号 | ピン名 | 番号 | ピン名 |
1 | +3.3V | 2 | +3.3V |
3 | GND | 4 | GND |
5 | GPIO24 | 6 | GPIO25 |
7 | GPIO26 | 8 | GPIO27 |
9 | GPIO28 | 10 | GPIO29 |
11 | GPIO30 | 12 | GPIO31 |
13 | +3.3V | 14 | - |
15 | GND | 16 | - |
GPIOの操作方法
Linuxでは、sysfsを介してGPIOを操作します。sysfsからGPIOコネクタまでの経路を図1に示します。
A6におけるGPIOへの操作手順を説明しましょう。まず、GPIOは/sys/class/gpioディレクトリにエントリされます。初期構成は図2のようになっています。
exportファイルに、操作する24~31のGPIO番号を書き込みます。たとえば、GPIOコネクタの5番ピンのGPIO24(表1を参照)を操作する場合は、exportに24を書き込みます。すると、図3のようにgpio24というシンボリックリンクが作成されます。操作には、gpio24ディレクトリ内のdirectionと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に書き込みを行うと書き込みエラーが発生するので注意してください。
監視システムの構築
今回の監視システムでは、HTTPサーバの死活監視を行います。HTTPサーバの構築手順については、Apacheなどの一般的なソフトウェアで/(ルート)へのアクセスができれば問題ありません。今回は本題とはそれますので、説明は割愛します。
監視システムの構成
システムの構成を図5に示します。NagiosがHTTPサーバの停止を検知した場合、パトランプ制御スクリプトを実行し、パトランプとブザーを起動します。HTTPサーバの復帰を検知した場合、パトランプとブザーを停止します。プッシュスイッチは、パトランプとブザーを停止する手動スイッチです。
パトランプ基板の説明
パトランプ基板は、パトランプとGPIOを接続するための簡単な基板です。この基板の回路図を図6に示します。J2コネクタにパトランプを接続します。BZ1がブザーで、SW1がプッシュスイッチです。A6のGPIOとパトランプ基板は表2のように接続しています。5番ピンはONをlowとして、9番ピンはONをhighとしています。
表2 GPIOコネクタのピン割り当てと設定値
番号 | ピン名 | 機能 | 出力方向 | valueファイルの値 |
5 | GPIO24 | パトランプ、ブザー | out | ON=0、OFF=1 |
8 | GPIO27 | パトランプの光り方 | out | 点滅=0、回転=1 |
9 | GPIO28 | プッシュスイッチ | in | ON=1、OFF=0 |
A6の設定
A6のOSはDebian 6.0です。Nagiosのインストールはaptitudeコマンドで行います。OSは256MBのRAMディスクで動作していますが、Nagios関連のパッケージサイズは依存関係を含めると167MBを超えRAMディスクのみでは導入しきれないため、SSDを接続してストレージ併用モードで使用します。
SSDをext3でフォーマットして、ボリュームラベルを“DEBIAN”に設定し、本体を再起動します(図7)。
OpenBlocksシリーズは、ストレージのボリュームラベルをDEBIANに設定すると、unionfsを使用して元のRAMディスクを拡張します。図8のunionfsでマウントされている/etcから/mediaのディレクトリに追加/変更を行ったファイルは、すべてSSD(/.rw以下)に保存されます。ストレージ併用モードの準備が整ったことを確認できたら、aptitudeコマンドでNagiosをインストールします(図9)。
Nagiosの設定
HTTPサーバの追加とパトランプを点灯する設定を行います。その他はデフォルトの設定を使用します。
ホストの登録
/etc/nagios3/conf.d/localhost_nagios2.cfgにリスト1の設定を追加します。デフォルトで設定されているlocalhostの設定をコピーして、host_name、alias、addressを変更します。
HTTPサービスの追加
/etc/nagios3/conf.d/hostgroups_nagios2.cfgをリスト2のように修正します。先ほどリスト1で追加したホストをHTTPサービスのmembersにカンマで区切って追加します。
パトランプ制御スクリプトの登録
/etc/nagios3/command.cfgにリスト3の設定を追加します。スクリプトの内容については後述します。$SERVICESTATE$を使用してHTTPサーバの状態をスクリプトに渡しています。$SERVICESTATE$には、OK/WARNING/CRITICAL/UNKNOWNの4パターンで文字列が指定されます。
通知コマンドの追加
/etc/nagios3/conf.d/contacts_nagios2.cfgをリスト4のように修正します。先ほどリスト3で追加したスクリプトを、service_notification_commandsにカンマで区切って追加します。
制御スクリプトの説明
制御スクリプトはNagiosから起動され、パトランプとブザーを制御するスクリプトと、メモリに常駐してプッシュスイッチを監視するスクリプトの2種類になります。2つのスクリプトは、実行属性を付加して/usr/local/binに保存します。
パトランプ制御スクリプト
引数のHTTPサーバのステータス($SERVICESTATE$)によって、パトランプとブザーのON/OFFを行います(リスト5)。
リスト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の(1)では、GPIO28のファイルが存在しない場合の初期設定を行います。GPIO28は、プッシュスイッチのON/OFFを割り当てたピンです。(2)(3)ではvalueファイルから値を取得し、プッシュスイッチの状態を確認します。(4)では、GPIO24のファイルが存在しない場合に初期設定を行います。GPIO24は、パトランプとブザーのON/OFFを割り当てたピンです。(5)でパトランプとブザーを停止します。
動作確認
動作確認はHTTPサーバのHTTPサービスを手動で停止して確認します。HTTPサーバのマシンは起動しているが、HTTPサービスは停止しているという状況を作ります。
HTTPサーバの停止
HTTPサーバを停止する前に、A6のNagiosを再起動してプッシュスイッチ検出スクリプトを起動しておきます(図10)。
そのあと、コマンドラインからHTTPサービスを停止します(図11)。
HTTPサーバの異常検出
Nagiosはデフォルト設定で5分間隔で状態のチェックを行います。異常を確認すると1分間隔でチェックを行い、4回異常が続くと通知を発行します。したがって、HTTPサーバが停止してから4~9分の間に通知が発行されることになります。また、異常発生後の1分間隔の状態チェック中にHTTPサーバが復帰した場合は、1回の確認だけで元の5分間隔の状態チェックに戻ります。
図12はNagiosのログです。5行目でnotify-service-by-beaconが通知されています。パトランプが点灯した瞬間が写真3です。Nagiosのデフォルトの設定では、状態異常を検知したときに1回だけ通知し、それ以降は通知をしません。
おわりに
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