●UPSが壊れました。
チャンと100Vが供給されているにもかかわらずにバッテリーに切り替わるというものです。金曜日、修理に出したら今日(火曜)発送したとのメールが入りました。
送るときに佐川急便にフロントパネルを破壊されてようです。でも、保険で直るという事なので、別に良しとしましょう。でも、3ヶ月で壊れるとはちょっと問題だぞ。停電の確率よりUPSの故障確率が高くてどうすんじゃい。。

いきさつ
 ここ最近、雷が多く発生しそのたびに fsck をかけることが多いのでこの際 UPSを導入することにしました。

●SoundHouse のUPS を使う
UPSは soundhouse UPS500II
http://www.soundhouse.co.jp/material/ups/cp_ups_all.asp
を使用する。あまり評判は良くないけど安い。

参考ページ
http://sheltie.ddo.jp/~kojima/ups/genpower.html
http://www.ups-sol.com/s-fbsd.html

 1.ソフトのダウンロード
http://www.ups-sol.com/pdf/yec_bsd.tgz から yec_bsd.tgz をダウンロードして普通に展開する。

2.ソースの修正
  UPS500IIにあうようにソースを自分で修正する。シャットダウンまでの時間は1分に設定してあります。

(1)usvd.c の修正
--- usvd.c.org Thu Aug 17 18:07:17 2006
+++ usvd.c Thu Aug 17 18:09:26 2006
@@ -109,20 +109,40 @@
exit(3);
}

+/* test
+ fprintf(stderr, "dcd is %d !n",get_dcd(fd));
+ syslog(LOG_WARNING,"dcd is %d !n",get_dcd(fd));
+ fprintf(stderr, "ri is %d !n",get_ri(fd));
+ syslog(LOG_WARNING,"ri is %d !n",get_ri(fd));
+ fprintf(stderr, "dsr is %d !n",get_dsr(fd));
+ syslog(LOG_WARNING,"dsr is %d !n",get_dsr(fd));
+ fprintf(stderr, "cts is %d !n",get_cts(fd));
+ syslog(LOG_WARNING,"cts is %d !n",get_cts(fd));
+test */
+
+ if(get_dcd(fd)==0)
+ {
+ fprintf(stderr, "%s: Cable is disconnced. DCD -> %d !n",argv[0],get_dcd(fd));
+ syslog(LOG_WARNING,"Cable is disconnced. %d !n",get_dcd(fd));
+ close(fd);
+ exit(3);
+ }
+
fprintf(stderr,"%s: USV daemon version %s starting...n",argv[0],VERSION);
syslog(LOG_WARNING,"USV daemon version %s starting...n",VERSION);
set_dtr(0,fd);
set_rts(1,fd);
sleep(2);
+
/*
- if(get_dsr(fd)==0&&get_dcd(fd)==0)
+ if(get_dsr(fd)==0&&get_dcd(fd)==0)
{ fprintf(stderr,"%s: usv not connected on startup!7n",argv[0]);
syslog(LOG_WARNING,"usv not connected on startup!n");
dummy=3;
}
else dummy=0;
*/
-
+
/* go into background */
i=fork();
if(i<0)

@@ -161,14 +181,14 @@
noconnect=0;
}
*/
- if(get_cts(fd)!=0&&linefail==0)
+ if(get_cts(fd)!=1&&linefail==0) /* changed mack */
{ linefail=1;
syslog(LOG_WARNING,"line failuren");
fprintf(stderr,"%s: line failure...n",argv[0]);

/*####################################################*/
/*backuptime set. 1count is 1sec.*/
- sleep(300);
+ sleep(3);
/*####################################################*/

system("/etc/usvd/linefail");


(2)usv_back.c の修正
--- usv_back.c.org Thu Aug 17 18:07:30 2006
+++ usv_back.c Thu Aug 17 18:09:49 2006
@@ -109,6 +109,14 @@
exit(3);
}

+ if(get_dcd(fd)==0)
+ {
+ fprintf(stderr, "%s: Cable is disconnced. DCD -> %d !n",argv[0],get_dcd(fd));
+ syslog(LOG_WARNING,"Cable is disconnced. %d !n",get_dcd(fd));
+ close(fd);
+ exit(3);
+ }
+
fprintf(stderr,"%s: USV_back daemon version %s starting...n",argv[0],VERSION);
syslog(LOG_WARNING,"USV_back daemon version %s starting...n",VERSION);
set_dtr(0,fd);
@@ -122,7 +130,7 @@
}
else dummy=0;
*/
-
+
/* go into background */
i=fork();
if(i<0)

@@ -161,17 +169,17 @@
noconnect=0;
}
*/
- if(get_cts(fd)!=0&&linefail==0)
+ if(get_cts(fd)!=1&&linefail==0) /* changed by mack */
{ linefail=1;
}

- if(get_cts(fd)==0&&linefail!=0)
+ if(get_cts(fd)==1&&linefail!=0) /* changed by mack */
{ linefail=0;battlow=0;
syslog(LOG_WARNING,"line is backn");
system("/etc/usvd/lineback");
}
-
- if(get_dcd(fd)!=0&&battlow==0)
+/* changed by mack */
+ if(get_dcd(fd)!=1&&battlow==0)
{ battlow=1;
syslog(LOG_WARNING,"battery lown");
system("/etc/usvd/battlow");



(3)インストール
   http://www.ups-sol.com/s-fbsd.html
   に書いてあるようにインストールすれば良いです。

(4)その他のファイルの修正
 このままだと、停電のときに一発でUPSの機能が停止します。
 それに対応するために以下の修正をします。
 /etc/usvd/linefail と /etc/usvd/battlow の中の /sbin/usv_off をコメントアウトします。

 オリジナルのファイルでは電源を切ってくださいというところで止まります。
 このままだと、ピーピーうるさいので、
 実際に電源を自動できってしまいたい場合には
 /etc/usvd/linefail と /etc/usvd/battlow の中の 
 shutdown -h now

shutdown -p now
 に書き換えてください。
 実際はそんなに長く停電することもないと思うので大丈夫かもしれません。

 このUPSは無負荷2分で電源が切れるといっていますが、無負荷で即落ちです。
 
 (5)その他
 オリジナルのソースではUPSと接続されていないとOSが起動後そのままshutdownになります。
 これだと、UPSがない時にデーモンを起動しないようにするなど不便なので、DCD信号を見て、
 UPSが接続されていないかいるかを判断して、UPSが接続されているときだけ、デーモンを
 起動するように修正してあります。
 ちなみに、そのとき確認した結果は

 ケーブル有り
  DCD HIGH
  RI LOW
  DCR LOW
  CTS HIGH
 ケーブル無し
  DCD LOW
  RI LOW
  DCR LOW
  CTS LOW

 ソースの中にこのチェックコードをコメントして残してあります。動作確認が必要な場合は
 適当な場所にいれて確認してみると良いでしょう。