2006.02.05 三菱電機製 FREQUPS FW-F series について 個人レベルでも買えなくも無い値段て, 入手性もよく, UPS マ ネージメントのサポート - 特に制御系の仕様が公開されてるた め, ひじょーにお勧めな UPS(無停電電源装置) である FREQUPS の FW-F シリーズについてモノ申すとまぁ…。。 他のシリーズはまったく触ったことがないのでノーコメント。 本質的には変わらないと思いますが。 http://www.mitsubishielectric.co.jp/frequps/ 不思議と APC 社製の UPS のマネージメント daemon は ports になっているが(実は APC も触ったことがない:-), FREQUPS の FREQSHIP-mini (UPS マネージャ) は FreeBSD 対応を謳って いるわりには ports になっていないのでこの度 ports 化して みました。 >> ports/sysutils/freqsdwn README と Makefile とソースを読みながら, 自動化するための 手順を ports 化していくわけですが…。。 1. まぁ README に書いてある手順は, あぁ書くしか無いでしょ う。ええ。適度に良く書いてあると思います。どうして, 動 作環境を現実的なところで仮定して書けないのか, 書けない ので README の中で提示している「こうだ」という環境が, 今時無茶な前提(フロッピーディスクがどうのこうの)で書か れているのか, 謎としか言いようが無いですが。そこはそれ, 自分の環境に読み変えて読むってことで。。 2. configure スクリプトを読む。まぁ…ん〜。頑張ってるんじゃ ない。ええ。 3. configure で設定(?)される Makefile を読む。「…………」。 まぁスタンドアローンな Makefile ならあんなものかな。。 とまぁ BSD チックに置き換えてみる(ports 参照)。FreeBSD 2.x からサポートしてるみたいだしすごいなぁ〜と(ry。 4. Makefile を見て, ソースの確認をしてみる。「……………… ……………………………………………………………………」。 ちょっと確認しただけでバッファオーバーフローなコードが 散逸(w。なんじゃこりゃなコードが盛り沢山。 例: ■argv[1][0]ってナニよ。argv++ してるからってそういう 書き方は無いんでない? あと引数が 128 個越えたあたり からバッファオーバーフローな気がす。バッファクリア するのにバッファの先頭に \0 埋めだけってナニよとか。 char arg_buf_wo[256]; : strcpy(arg_buf_wo, "\0"); : while (argc > 1) { : strcat(arg_buf_wo_p, &argv[1][0]); strcat(arg_buf_wo_p, " "); : argv++; argc--; } ■普通 sync(2) 呼ぶから。ポータビリティ? Version 6 AT&T UNIX からあるから。Windows? そんな環境に /bin/sync なんてありませんって。 system("/bin/sync"); ■どことは言わないけど, OS シャットダウンプロセスで /sbin/halt を実行する奴とか。。 まぁ他にあるけど, 全部直すと最低でも 1/3 くらいはリテイクに なりそうだから見なかったことにする。目的は ports 化だもんね。 5. なかなか難しいシャットダウンメカニズム 1/2 README では /etc/rc.shutdown に直書きで…とあるけど, ports 的には美しくないので, rcNG スクリプトを書いてみる。これが また難題で, UPS のシャットダウンプロセスを加味するともーダ メポって気分。 とりあえずタイムテーブルをば参考までに。なお時間は状況に よってずれます(1〜数十秒程度)。 経過時間[s] 処理 ------------+-------------------------------------------- 0 電源断(UPS給電へ) 1 FREQSHIP-mini 電源断を検知 61 FREQSHIP-mini OSシャットダウン開始 63 rc.shutdown シャットダウンプロセス開始 83 FREQSHIP-mini UPSシャットダウン信号送信(rcNG script) 90 FreeBSD OS停止(halt -h) 143 FREQUPS UPS停止 さて。0s〜61s の間に復電した場合は, 何事もなかったように 振る舞うわけで, このあたりの動作は問題無い。仕組み的に。 61s〜83s が恐怖。OS のシャットダウン開始, シャットダウン を止めることはできないにも関わらず UPS シャットダウン信号 を UPS が受け付ける前に復電してしまうと UPS 的には何事も なかったように振る舞うのでアウチ。 何がアウチって, 電源が供給されている状態での, UPS シャット ダウン信号は無視されるので, OS が停止したまま UPS は何事も なかったように電源を供給し続けるので手動で復旧させるしかな いです。 これが 83s〜 であれば, UPS が停止するまでの間に復電した 場合, ちゃんと 10 秒間 UPS が停止して, 復電するというプ ロセスになる。 もちろん 143s〜 の UPS 停止後は復電すると立ち上がるので 問題無し。 ※あぁ BIOS の設定で Power なんちゃらの Last-State の設 定にしておかないと機能しないっすよ。 > 復電後再起動 - - - - - - - - - - - - - - - - - - - - - - - - - - - - このあたり, FREQSHIP-mini でやってることの手順そのまま なので, 例えば, shutdown 開始直前に UPS シャットダウン 信号を送るようにするという解決策は悪くないです。 このソリューションがダメな理由は, UPS シャットダウン信 号を受けた場合, 1 分ないしは 5 分後(UPS の DIP スイッチ の選択による), かならず UPS が停止する。という点にあり ます。 つまり /sbin/shutdown 実行後 OS が正常にシャットダウン できる時間が 1 分または 5 分なわけです。 1 分の場合正常に OS シャットダウンできるか怪しいという 問題と, 5 分の場合, そこまで給電が持つかという問題があ ります。まぁ 5 分にして, 5 分間で給電切れてもいいよね〜 という開きなおりはありでしょうが。 なんか書いてるうちにそういう改造がいいような気がして きた。 orz 一応推奨では 1 分で停止。だったりする:-)。 > ports 5. なかなか難しいシャットダウンメカニズム 2/2 OS シャットダウンプロセス(rc.shutdown) では rcNG スクリ プトのウォッチドックタイマー(rcshutdown_timeout: ディフ ォルト 30 秒)が働く。UPS シャットダウン信号を送る rcNG スクリプトは, 全てのスクリプトの極力最後で実行されるよ う調整しているわけだが, その前に実行される rcNG スクリ プト, 例えば, squid.sh とか squid.sh とか squid.sh が デーモン停止に手間取ると, UPS シャットダウン信号を送れ なくなるという罠が付きまとっている。 この問題はなかなか侮れなくて, README に書いてあるよう に /etc/rc.shutdown に書くのが間違い無いです。まぁさっ きも書いたようなソリューションであれば考えること無いけ どね。。 なんにせようまくシャットダウンしてるうちは問題なく動き ます(60数秒で復電するとか)。 そんな FREQUPS ですが, ports ともども使ってやってください。 BIOS 設定と合わせて, テスト及び問題点の洗い出しをやりこん であるので, 安心して使えるでしょう(たぶん)。 Written by 重村法克