「キーボード、マウス、CRT無しPC、でも小さな LCD 表示器が付いて、 電源ボタンでシャットダウン」の試作

はじめに

Linux マシンをサーバー用途に使っている人なら、ディスプレイ、キーボード無しで、 利用されている方も、多いのではないでしょうか。ネットワーク経由(神経質な人 は、Serial Port 経由?)で、大抵の管理作業が出来る、UNIX 系 OS の便利な所 です。でも、運用状態によっては、色々と問題が出ることもあります。今回試作 したマシンは、次の様な問題を解決する目的で製作しました。

「親切な人が、使っていないと思って電源を切ってくれる。」

で、今回対象にしたのは、ATX タイプのマザーボードですので、ちょっと工作すると 電源スイッチを押しても、電源が切れなくすることが出来ます。 しかも、BIOS で、APM を有効にして、Linux kernel で、

Advanced Power Management BIOS support
Power off on shutdown

を有効にして再構築しておくと、リモートでログインして、su して、 シャットダウンをかければ、halt した後電源が落ちるので便利です。

今回は、このような工作をして、ちゃんと動くか試してみるのが目的でしたが、 ついでだから、

動作中に、電源ボタンを押されたかどうか監視して、押されたら shutdown を する。( UPSを使って、shutdown するのと似ていますね。監視するのが、 UPS のステータスラインか、電源ボタンかの違いです。)

ちゃんと動いているのだろうか?勝手にフリーズしてたりして。。。という 不安を取り除くために、また、ステータス(誰がログインしてるか? 現在の マシンの負荷は?)を表示をしたくなるかも知れないということで、16桁×2行 表示できる、小型の LCD 表示器を付けてみました(本当は、電源ボタンのチェック にパラレルポートの1ビットを使って、残りのビットがもったいなかったから)。

と言うことになりました。

つくってみる

通常の PC/AT 互換機を作成するのに必要な部品に加えて、 こんな部品を使いました。

そして、出来上がったマシンを正面から見たのが、これです。



今回の電源ボタン回りの改造と、LCD 取付回りの回路図の様なものは、 次の通りです。



回路図を見れば一目瞭然と言う気もしますが、簡単に解説します。

AT の電源は、通常押すと ON もう一度押すと OFF と言う風に、押す度に on/off を繰り返すタイプですが、ATX の場合、押している間だけ ON という タイプのスイッチが付いています。このスイッチは、電源でなく、ATX マザー ボードに接続されていてます。で、考えたのは、電源が ON になったら、 電源スイッチを切り離す様な回路を作ればいいじゃないか。そこで、回路図の 上のあたりの回路になったわけです。電源の切れている状態では、電源ボタンは、 マザーボード上の電源スイッチ端子につながっているので、電源ボタンで、 電源を入れることが出来ます。電源が入ると、リレーが作動して、電源ボタン は、マザーボードの電源スイッチ端子から切り離されてしまうため、いくら電源 ボタンを押しても、何も起こりません。電源を落したければ、shutdown を かければ良いのです。カーネルパニックな時は?コンセントを抜いて下さい( これはちょっと間抜けかな?)。これで、当初の目的は達成されました。

で、このままでは、マシンが動作中は、電源ボタンが遊んでいてもったい無いので、 これを別の目的、例えば shutdown ボタンとして、使えるように、パラレルポート、 の入力端子(今回使用したのは ACK)、に繋ぎました。また、ボタンが押されたか どうか監視するプログラムは、マシンの負荷を増やさないよう、低周期で、所定 のビットを監視します。そのために、途中に RS-FF を入れて、一回ボタンを 押すと、監視用ビットが ON になりっぱなしになるようにしています。ON に、 なりっぱなしも困るので、パラレルポートの出力端子( STROBE を使いました)に、 1 を出力すると、リセットできるようにしています。 電源ボタンを押すと shutdown するプログラムを走らせておくと、電源ボタンを 押すことで、shutdown して、電源が切れるので、某社のワークステーション みたいでかっこいいです。でもこれだと、親切な人が、知らない間にシャットダウン してくれそうなので、今回試作した電源ボタン監視プログラムでは、一度ボタンを 押した後、一定時間内にもう一度ボタンを押さないと、shutdown に行かないように しています。

おまけは、LCD module ですが、これは、回路図の下の方の通り、パラレルポート と繋ぐだけですので、問題は無いです。問題は、まともな資料が無かったこと。 大阪日本橋の共立「デジット」で、購入したのですが、資料は無し。LCD module で使用されている LCD コントローラ LSI HD44780 の資料は、お店にあったよう ですが、感熱紙に印刷されているもので、文字が読めない!!まあ、何とかなるかぁ、 で、ネットサーフィンするわけですが、アメリカの日立のサイトで、検索かけると 英文ではありますが、データシートの PDF ファイルを無事ゲット。いやぁ便利な 世の中になりましたねぇ(ちなみにこのデータシート200ページ以上ありました)。

ソフトウェア回り

最後は、作成したプログラムについて。

Linux だと、root ならば、ユーザープログラムで直接 I/O port の読み書きが 出来てしまうようですが、気持悪いので、一応デバイスドライバのようなもの を作って使用しています。 おかげで、LCD への文字の表示は、

    echo -n "Hello, world." >/dev/lcd0

てな具合だし、私は、Slack な人なので、 /etc/rc.d/rc.6 の中に
  # Now halt or reboot.
  echo "$message"
  echo -en "\f" >/dev/lcd0             # 追加   LCD の表示クリア 
  echo -n "$message" >/dev/lcd0        # 追加   LCD へ表示
  [ ! -f /etc/fastboot ] && echo "On the next boot fsck will be FORCED."
  $command -f

と書いて、shutdown 後に、LCD に、"The system is halted." とか "Rebooting." とか表示させるのもOKです。

あと、電源ボタンを監視して、shutdown させるプログラムの中で、 システムの状態を監視して、LCD に表示させるとかすると、良いかも 知れません。今のところ適当なものが思い浮かばなかったので、



という事になっています。でも、このマシンが、NTP で、標準時に同期 させられているならば、標準時を表示する時計になってちょっと便利かな。 何はともあれ、この時計が更新されている限り、カーネルは動いている 事にはなるよね?

おまけ

今回作成したプログラムも、置いておきます。今のところ、 一応動いている程度の状態のものです。しかも、ハードがないと 意味がないし、これをダウンロードしても、使い道はないわけですが、 ソースコードを見てみたいという 人は、どうぞ持っていってください。
もし、似たようなハードウェアを作ったよと言う人が出てくるようなら、 簡単なドキュメントとか、コメントがまともに入ったソースを提供できる よう努力したいと思います。

lcd.tar.gz 6773 byte

まとめ

そろそろまとめなければならないけど、まとまらない。そもそも、LCD 表示器が、出て来たからまとまらないのですよね。いったい何で LCD 表示器なのかと言いますと、コバルトキューブにLCD 表示器が 付いていた!何かかっこ良かった! というだけの話だったりして・・・・・・

なにはともあれ、動作中に、電源ボタンを押されても、いきなり、電源が 切れたりしないマシンにはなりました。

電源ボタン監視プログラムを作成して、それを走らせていると、電源ボタン の操作で、shutdown/電源OFF が出来るようななりました。

表示領域は 16x2 文字と、狭いながらも、LCD 表示が出来ますので、別な 端末を繋げたりしなくても、簡単なステータスチェックが出来るように なりました。でも、今のところソフトウェアの点は未整備ですね。

実物は、lilo のミーティングとか、LC98 とかに参加すると見ることが 出来るかも知れません(未定, Linux Conferrence '98 (12/18) では、 netfort のブースで、展示する事がほぼ決定)。

liloのまいぱぱさんに「おばQ」という愛称を頂きました。 さすがに、こばきゅう(コバルトキューブ)に対抗するところ までは行けませんが、今後の課題というか、目標に、 めざせ「こばきゅう」っていいですね。ただ、ゴールが遠くて見えないよぉ。


このページに関する、ご意見、感想、苦情はこちらまで 松本 徳真 / matsu@netfort.gr.jp