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の書式とオプション [画像のクリックで拡大表示] |
と発行する。--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プログラムを動作可能にする設定 /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プログラムを格納するディレクトリの設定 |
この2つの設定を行ったら,
によりディレクトリを作成し,作成したディレクトリ以下に図6のdisk_status.cgiスクリプトを格納する。disk_status.cgiスクリプトは簡単なプログラムで,dfコマンドによりディスク容量を取得しているだけだ。最後にこのスクリプトが実行できるように実行権限を与えておく。
図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) [画像のクリックで拡大表示] |
このスクリプトにも実行権限を付加する。
これで,
と実行すると,液晶モジュールに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) [画像のクリックで拡大表示] |
続けて,/etc/cron.dディレクトリ以下に図9のxen_statusファイルを作成する。これで,1分ごとにwrite_statusスクリプトを実行し,最新のディスク容量を書き込んだdisk_statusファイルが/opt/xen/statusディレクトリ以下に作成されるようになった*6。
図9●write_statusスクリプトを定期実行する設定(xen_status) [画像のクリックで拡大表示] |
現状のSambaの設定では,Domain-0からdisk_statusファイルにアクセスできない。それを回避するために,図10の設定を/etc/samba/smb.confファイルに追記し,
図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) [画像のクリックで拡大表示] |
これで,
と実行すると,Xen-lanのディスク容量が液晶モジュールに表示される。
ボタンの制御
簡易表示装置には上下に並んだ押しボタンを付けた。さらに,この押しボタンを活用し,ボタン操作で,表示内容を変えたり,特定のコマンドを実行したりしてみよう。
上ボタンが押されたときに希望するコマンドを実行するには,シェルのwhileコマンドで,
を常に実行させた状態にする。これで上ボタンが監視され,上ボタンが押されるとコマンドが実行される。下のボタンで同じ動作をさせるには,「--sw1」を「--sw2」に変更する。
図12のlcd_switchスクリプトは,上下のボタンを押すことで液晶モジュールの表示を切り替えるスクリプトである。このスクリプトを/usr/local/binディレクトリ内に作成して実行権限を付与し,
図12●上下のボタンを押すことで液晶モジュールの表示を切り替えるスクリプト(lcd_switch) [画像のクリックで拡大表示] |
次のように実行すれば,
上ボタンを押すとXen-inetのディスク容量を,下ボタンを押すとXen-lanのディスク容量を表示する*8。
* * *
ttylcdコマンドの機能を応用すれば,メモリー消費や日付などさまざまな表示が可能だ。日経LinuxのWebサイト上で応用したスクリプトを紹介しているので,ご覧いただきたい。