SOHOや自宅で,Red Hat Enterprise Linux(RHEL)を導入したサーバーを2台使う。ぜいたくな使い方だが,これに近いことは簡単に実現できる。RHELのクローンOSで無償で入手できる「CentOS」と仮想化技術「Xen」を組み合わせる手法だ。今回は制御用ソフトを作成してPCに導入しよう。

ソフトウエアを作成する

 ハードウエアが完成したので,次に制御用ソフトを作成し,PCに導入する。制御用ソフト「ttylcd」を日経Linux2005年10月号の付録DVD-ROMに収録したので,それを使ってほしい。なお,この制御用ソフトは2003年6月特集2で紹介したプログラム「ttylcd」にバグ修正*4を加えたものだ。

 付録DVD-ROMには「Makefile」とttylcdコマンドのソース・コード「ttylcd.c」を収録しているため,コンパイルが必要である。この2つのファイルを,制御用ゲストOS(Domain-0)の任意の場所にコピーし,

を実行してコンパイル,導入しよう。ttylcdコマンドは/usr/local/binディレクトリにインストールされる。

画面に文字列表示

 では,実際にttylcdコマンドを使ってみよう。ttylcdコマンドの書式と指定できるオプションは表2の通りだ。まずは最も基本的な操作である,液晶モジュールに任意の文字列を表示させてみる。例えば,「Nikkei Linux」を表示する場合,

表2●ttylcdの書式とオプション
表2●ttylcdの書式とオプション
[画像のクリックで拡大表示]

と発行する。--deviceオプションは,簡易表示装置が接続されているシリアル・ポートを指定するオプションだ。本記事で用いたキューブ型PCではCOM1に簡易表示装置を接続している。その場合は「--device=/dev/ttyS0」を指定する。もしCOM3に接続しているなら「--device=/dev/ttyS2」を指定する*5

画面を消去する

 前述したコマンドで続けて文字列を表示させた場合,すべての文字がつながってしまう。これでは読みづらい。液晶モジュール上の文字を消してから新しく文字列を表示するようにしたい。

 それには,画面をクリアする--clearオプションを用いる。希望する文字列を表示したのちに,

を発行する。すると,画面の文字がすべて消去される。この状態で新しい文字列を表示させよう。

監視情報をゲストOS内から取得

 簡易表示装置の基本動作が確認できたので,本記事の目的である,ゲストOSの各種情報を表示させる。

 ゲストOSの状態を取得するコマンドとして「xm list」が用意されているものの,これではゲストOSに割り当てられたメモリー容量や稼働状態,CPUの利用時間だけしか取得できない。ゲストOSが実際に利用しているディスク容量といった,サーバー管理に不可欠な情報は得られない。

 そこで,サーバー用ゲストOS(Xen-inetとXen-lan)からDomain-0にサーバー管理に必要な情報(サーバー・ステータス)を引き渡す仕組みを作り,それを用いて簡易表示装置にサーバー・ステータスを表示させる。

Apache経由でステータスを取得

 Xen-inetでは,Webサーバー・ソフト「Apache HTTP Server」(以下,Apache)が稼働している。このApacheを用いれば,Domain-0にサーバー・ステータスを受け渡せる。Domain-0側でスクリプトを実行すると,Apache側でCGI(Common Gateway Interface)スクリプトが起動され,その実行結果をDomain-0側で受け取るという仕組みだ。

 では,その設定を施そう。まず,Xen-inetのコンソールに切り替える。

 Xen-inetのコンソールが表示されたら,Apacheの設定ファイル(/etc/httpd/conf/httpd.conf)を図4のように,CGIスクリプト(プログラム)が動作するように書き換える。

図4●CGIプログラムを動作可能にする設定
図4●CGIプログラムを動作可能にする設定
/etc/httpd/conf/httpd.confファイルの807行目の先頭にある「#」を取り除く。

 さらに,図5の/etc/httpd/conf.d/status.confファイルを新規に作成する。このstatus.confファイルには,192.168.1.0から192.168.1.255までのIPアドレスを持つマシンからアクセスしたときにのみ,/var/www/statusディレクトリ以下のCGIスクリプトが実行できるような設定が書き込まれている。

図5●サーバー・ステータスを取得するCGIプログラムを格納するディレクトリの設定
図5●サーバー・ステータスを取得するCGIプログラムを格納するディレクトリの設定

 この2つの設定を行ったら,

によりディレクトリを作成し,作成したディレクトリ以下に図6のdisk_status.cgiスクリプトを格納する。disk_status.cgiスクリプトは簡単なプログラムで,dfコマンドによりディスク容量を取得しているだけだ。最後にこのスクリプトが実行できるように実行権限を与えておく。

図6●ファイル・システムの状態を所得するCGIプログラム(disk_status.cgi)
図6●ファイル・システムの状態を所得するCGIプログラム(disk_status.cgi)

 ここまで完了したら,Apacheを再起動し,先ほどの2つの設定を反映させる。

 また〔Ctrl〕キーと〔]〕キーを同時に押して,Domain-0のコンソールに戻る。戻ったら,図7のinet_diskinfo.plスクリプトを/usr/local/binディレクトリ以下に作成する。inet_diskinfo.plスクリプトには,先ほど作成したCGIスクリプトをApache経由で実行し,取得したディスク容量を加工して液晶モジュールに表示する処理が記述されている。前述のttylcdコマンドもinet_diskinfo.plスクリプトの中から呼び出される。

図7●Apacheからサーバー・ステータスを取得して液晶モジュールに表示するスクリプト(inet_diskinfo.pl)
図7●Apacheからサーバー・ステータスを取得して液晶モジュールに表示するスクリプト(inet_diskinfo.pl)
[画像のクリックで拡大表示]

 このスクリプトにも実行権限を付加する。

 これで,

と実行すると,液晶モジュールにXen-inetのディスク容量が表示される。

Samba経由でステータスを取得

 Xen-lanでは,ファイル共有ソフト「Samba」が稼働している。前述のApacheと同様にSambaをうまく利用すれば,Domain-0にサーバー・ステータスを受け渡せる。しかし,SambaではDomain-0側からXen-lan側のCGIプログラムを実行するような操作はできない。

 そこで「Cron」という定期ジョブを実行する仕組みを利用して定期的にサーバー・ステータスをファイルに保存し,保存したファイルをSamba経由でDomain-0側のスクリプトが処理して液晶モジュールに表示させるようにする。

 では,早速この仕組みを作ってみよう。まずXen-lanのコンソールに切り替える。

 最初にサーバー・ステータスを保存するディレクトリを作成する。

 次に,サーバー・ステータス(ディスク容量など)をファイル(disk_status)に保存するwrite_statusスクリプト(図8)を,/usr/local/sbinディレクトリ以下に作成する。このスクリプトが実行できるように実行権限を付加する。

図8●ファイル・システムの状態をファイルに保存するスクリプト(write_status)
図8●ファイル・システムの状態をファイルに保存するスクリプト(write_status)
[画像のクリックで拡大表示]

 続けて,/etc/cron.dディレクトリ以下に図9のxen_statusファイルを作成する。これで,1分ごとにwrite_statusスクリプトを実行し,最新のディスク容量を書き込んだdisk_statusファイルが/opt/xen/statusディレクトリ以下に作成されるようになった*6

図9●write_statusスクリプトを定期実行する設定(xen_status)
図9●write_statusスクリプトを定期実行する設定(xen_status)
[画像のクリックで拡大表示]

 現状のSambaの設定では,Domain-0からdisk_statusファイルにアクセスできない。それを回避するために,図10の設定を/etc/samba/smb.confファイルに追記し,

図10●共有フォルダ(status)の設定追加
図10●共有フォルダ(status)の設定追加

のようにしてSambaを再起動し,設定を反映させる。これで,/opt/xen/statusディレクトリが共有フォルダ「status」に割り当てられ,Domain-0からアクセス可能になる。

 最後に,/opt/xen/statusディレクトリにアクセスできるユーザーとして「status」を登録する。

 〔Ctrl〕キーと〔]〕キーを同時に押し,Domain-0のコンソールに戻る。Domain-0側では,disk_statusファイルにアクセスできるように共有フォルダをマウントし,disk_statusファイルから必要な部分を切り出して液晶モジュールに表示するスクリプトを作成する。

 まず,Domain-0からXen-lanの共有フォルダにアクセスするためのソフトウエア・パッケージ「samba-client」を導入する。

 次に,

のように共有フォルダのマウント先になる/mnt/lan-statusディレクトリを作成し,共有フォルダ「status」をそこにマウントをする*7

 ここまで完了したら,ファイルから取得したサーバー・ステータスを加工して液晶モジュールに表示するスクリプトを作成する。図11のlan_diskinfo.plスクリプトがそのスクリプトだ。/usr/local/binディレクトリ以下に作成し,実行権限を与えておく。

図11●ファイルから取得したサーバー・ステータスを加工して液晶モジュールに表示するスクリプト(lan_diskinfo.pl)
図11●ファイルから取得したサーバー・ステータスを加工して液晶モジュールに表示するスクリプト(lan_diskinfo.pl)
[画像のクリックで拡大表示]

 これで,

と実行すると,Xen-lanのディスク容量が液晶モジュールに表示される。

ボタンの制御

 簡易表示装置には上下に並んだ押しボタンを付けた。さらに,この押しボタンを活用し,ボタン操作で,表示内容を変えたり,特定のコマンドを実行したりしてみよう。

 上ボタンが押されたときに希望するコマンドを実行するには,シェルのwhileコマンドで,

を常に実行させた状態にする。これで上ボタンが監視され,上ボタンが押されるとコマンドが実行される。下のボタンで同じ動作をさせるには,「--sw1」を「--sw2」に変更する。

 図12のlcd_switchスクリプトは,上下のボタンを押すことで液晶モジュールの表示を切り替えるスクリプトである。このスクリプトを/usr/local/binディレクトリ内に作成して実行権限を付与し,

図12●上下のボタンを押すことで液晶モジュールの表示を切り替えるスクリプト(lcd_switch)
図12●上下のボタンを押すことで液晶モジュールの表示を切り替えるスクリプト(lcd_switch)
[画像のクリックで拡大表示]

次のように実行すれば,

上ボタンを押すとXen-inetのディスク容量を,下ボタンを押すとXen-lanのディスク容量を表示する*8

*  *  *

 ttylcdコマンドの機能を応用すれば,メモリー消費や日付などさまざまな表示が可能だ。日経LinuxのWebサイト上で応用したスクリプトを紹介しているので,ご覧いただきたい。