rabbit51

it's since Nov.30 2005
May.29 2014, transferred from broach

Smart UPS 500 (NEC designed by APC) でDebian10 とDS216J(Synology) に電源供給

2020-10-04 15:00:00 | UPS
バッテリー交換のアラームが鳴りはじめた

確かバッテリーは、APCの「RBC20J」だったと。販売終了品になっている。
今回交換すれば、3回目。頂き物のUPSなのだが、記憶の限り1回目のバッテリー交換が2009年11月頃。この時は、6時間毎に90秒程度鳴るアラームを無視していたら、「物凄い臭気」が発生。慌てて主電源を外し、使用停止状態にした。APCの交換バッテリーを通販で調達。
2014年12月頃に2回目のバッテリー交換。そして2020年7月頃からバッテリー交換アラームが鳴りはじめた。
1回目のバッテリー交換から11年。使用開始時期を失念したが、通算16-7年使用している事になる。幾ら何でも本体がいつ故障してもおかしくない。

UPSに接続されている機材は、ファイルサーバ、ネットワーク機材(ひかり電話HGW/ルータNVR510/スイッチGS116E/AirMac Time Capsule)とサーバ用途PC1台。

ファイルサーバは、DS216J(1TBytesミラー)とバックアップ用でUSB接続したIO DataのHDC2-U2.0(1TBytesミラー)とHDCA-U2.0。電源切断でHDD不具合が発生しても、ミラーDiskからの復旧あるいは、USBバックアップHDDからの再生で対応するため、UPSシャットダウン無しの接続で運用。

ネットワーク機材は、UPSパワーが尽きるまで頑張る。
AirMac Time Capsule(2TBytes)は、Time Machineバックアップの要であるがUPSシャットダウン無しの接続(そもそもシャットダウン制御が出来ない)。

サーバー用途PCは、当初「タワー型デスクトップ機ADX2600(マウスコンピューター)とCRTディスプレー(後にLCDディスプレー)」を接続使用していた。OSは、WindowsXP。付属のPowerChuteをシリアル接続していたが、常時稼働のサーバ機と異なり、使用中に停電自動シャットダウンに至る事は無かった。後継機材XPS8300(Dell)は、シリアルポートが無かった。今まで瞬断や非稼働中の停電だったのでUPSによるシャットダウン制御をしてこなかった。

Smart UPS 500 の交換バッテリーがバッテリーストア.comで「スーパーナットRBC20J-S」を見つけたので、後継機選出まで再稼働させ、負荷状態の把握とシャットダウン制御の確認を行う事とした。

(1)Debian10で接続するUPS用ツール
APCに特化している「APCUPSD」とDS216Jで使用されている「Nework UPS Tools(nut)」を検討してみた。
XPS8300には、シリアルポートが無い(基板上には、PS2/Serialコネクタが存在)ので、USB-RS232C([USB-CVRS9]サンワサプライ/ATEN UC232Aドライバー互換)を使用する。

「apcupsd/stable 3.14.14-2 amd64」と「nut/stable 2.7.4-8」をインストールしたが排他的にどちらか一方しかインストール出来ない。
また、nutは、シリアル接続の「Smart UPS 500」に接続するがプロトコルを認識しない。
root@debian10:/root# /usr/sbin/upsdrvctl start SU500
Network UPS Tools - UPS driver controller 2.7.4
Network UPS Tools - APC Smart protocol driver 3.1 (2.7.4)
APC command table version 3.1
[7] unrecognized
「/lib/nut」に各種ドライバーがあり「apcsmart-old」を試してみると認識した。nutは、シリアルデバイスをnutグループでアクセスするため「/etc/udev/rules.d/99_nut-serialups.rules」でアクセス権を与える。Debian10で「apt install nut」したが、「/etc/init.d/nut-server」などのinit起動ファイルがインストールされない。「service nut-server start/stop/restart」で起動停止。ただ、「upsc」で得られるups情報が少ないようなので、「apcupsd」を使う事にする。。
apcupsdのapcaccessでUPS情報を確認
root@debian10:/root# /sbin/apcaccess
APC      : 001,051,1158
DATE     : 2020-08-28 12:55:26 +0900  
HOSTNAME : debian10
VERSION  : 3.14.14 (31 May 2016) debian
UPSNAME  : UPS_IDEN
CABLE    : Custom Cable Smart
DRIVER   : APC Smart UPS (any)
UPSMODE  : Stand Alone
STARTTIME: 2020-08-28 11:44:09 +0900  
MODEL    : SMART-UPS 500
STATUS   : ONLINE LOWBATT 
LINEV    : 102.0 Volts
LOADPCT  : 44.2 Percent
BCHARGE  : 100.0 Percent
TIMELEFT : 3.0 Minutes
MBATTCHG : 5 Percent
MINTIMEL : 3 Minutes
MAXTIME  : 0 Seconds
MAXLINEV : 102.0 Volts
MINLINEV : 100.7 Volts
OUTPUTV  : 102.0 Volts
SENSE    : High
DWAKE    : 0 Seconds
DSHUTD   : 180 Seconds
DLOWBATT : 2 Minutes
LOTRANS  : 90.0 Volts
HITRANS  : 110.0 Volts
RETPCT   : 0.0 Percent
ITEMP    : 53.5 C
ALARMDEL : 5 Seconds
BATTV    : 27.9 Volts
LINEFREQ : 50.0 Hz
LASTXFER : Automatic or explicit self test
NUMXFERS : 0
TONBATT  : 0 Seconds
CUMONBATT: 0 Seconds
XOFFBATT : N/A
SELFTEST : NO
STESTI   : 336
STATFLAG : 0x05000048
DIPSW    : 0x00
REG1     : 0x00
REG2     : 0x00
REG3     : 0x00
MANDATE  : 01/30/01
SERIALNO : NS0105XXXXXX
BATTDATE : 01/30/01
NOMOUTV  : 100 Volts
NOMBATTV : 24.0 Volts
EXTBATTS : 0
FIRMWARE : 120.14S.A
END APC  : 2020-08-28 12:55:52 +0900
室内温度が約35度。
UPSの使用温度範囲が0〜40度
装置内温度が53.5度。過酷な環境。
100%充電後で負荷44.2%でSTATUSが「LOWBATT」
標準のRBC20Jは、12V5Ah(x2)だがスーバーナットRBC20J-Sは、12V9Ah(x2)で、SU700のRBC137Jの12V7.2Ah(x2)より容量が大きい。負荷50%(160W)で17分(5Ah)、26分(7.2Ah)なので「LOWBATT」にならないはず。。。
長期在庫の容量低下品を摑まされたか。。。SU500の不具合か。。。一応問い合わせてみよう。。。
負荷容量を減し「TIMELEFT>MINTIMEL」を確保して作業を進める事にした。

(2)Synology DS216JのUPS対応
DS216JのUPS接続は、「USB」。シリアル接続が出来るのか不明。
USB-Serialの接続そのものは可能のようだ。upsも「/usr/syno/etc/ups/ups.conf」を操作すれば、可能かもしれない。確認しない事にする。
NUTには、「apcupsd-nut」というモデュールがあるらしい。が、ds216jに「apcupsd-nut」ドライバーは、無さそう。
Apcupsd NUT Wrapper Script」を「ucspi-tcp」で動作させ、「apcupsd」と連携させる事が出来るようだ。これを使う事にする。
最近のAPC upsだと機種によって、ds216jをusb接続、同時にdebian10をシリアル接続が出来そうだ。

(3)Apcupsd NUT Wrapper Script
debian10で「Apcupsd NUT Wrapper Script」を動かしてみた。起動時に実行されるよう「init.d」にも登録した。
root@debian10:/root# /etc/init.d/apcupsd-nut-srv
#!/bin/sh
### BEGIN INIT INFO
# Provides:          apcupsd-nut-srv
# Required-Start:    $network $remote_fs $syslog
# Required-Stop:     $network $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       APC UPS wrapper for NUT client
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/tcpserver
DAEMON1=/usr/local/bin/usvnutwrapper.sh
CONFIG=/etc/default/apcupsd-nut-srv
dir="/root"
cmd="/usr/bin/tcpserver -q -c 10 -HR 0.0.0.0 3493 /usr/local/bin/usvnutwrapper.sh"
user="root"

name=`basename $0`
pid_file="/var/run/$name.pid"
stdout_log="/var/log/$name.log"
stderr_log="/var/log/$name.err"

test -x $DAEMON || exit 0
test -x $DAEMON1 || exit 0
test -e $CONFIG || exit 0

set -e
. $CONFIG
if [ "x$ISCONFIGURED" != "yes" ] ;
then
    echo "Please check your configuration ISCONFIGURED in /etc/default/apcupsd-nut-srv"
    exit 0
fi

get_pid() {
    cat "$pid_file"
}

is_running() {
    [ -f "$pid_file" ] && ps -p `get_pid` > /dev/null 2>&1
}

case "$1" in
    start)
    if is_running; then
        echo "Already started"
    else
        echo "Starting $name"
        cd "$dir"
        if [ -z "$user" ]; then
            $cmd &
        else
            $cmd &
        fi
        echo $! > "$pid_file"
        if ! is_running; then
            echo "Unable to start, see $stdout_log and $stderr_log"
            exit 1
        fi
    fi
    ;;
    stop)
    if is_running; then
        echo -n "Stopping $name.."
        pkill -P `get_pid`
        kill `get_pid`
        for i in 1 2 3 4 5 6 7 8 9 10
        # for i in `seq 10`
        do
            if ! is_running; then
                break
            fi

            echo -n "."
            sleep 1
        done
        echo

        if is_running; then
            echo "Not stopped; may still be shutting down or shutdown may have failed"
            exit 1
        else
            echo "Stopped"
            if [ -f "$pid_file" ]; then
                rm "$pid_file"
            fi
        fi
    else
        echo "Not running"
    fi
    ;;
    restart)
    $0 stop
    if is_running; then
        echo "Unable to stop, will not attempt to start"
        exit 1
    fi
    $0 start
    ;;
    status)
    if is_running; then
        echo "Running"
    else
        echo "Stopped"
        exit 1
    fi
    ;;
    *)
    echo "Usage: $0 {start|stop|restart|status}"
    exit 1
    ;;
esac

exit 0
「Apcupsd NUT Wrapper Script」は、「ds216j」からのUPSコマンドをポート3493で受け、「apcaccess -p status」でSTATUS情報を得て「VAR ups ups.status "OL"」など変換して応答する。
ds216j上でnutのupscコマンドでups情報を取得してみる。以下の二つのコマンドに応答する。

sh-4.3# upsc ups@192.168.1.57:3493 ups.status
OL
sh-4.3# upsc ups@192.168.1.57:3493
device.mfr: USV NUT Apcupsd Wrapper
device.model: SMART-UPS 500
device.serial: NS0105xxxxxx
device.type: ups
ups.mfr: USV NUT Apcupsd Wrapper
ups.mfr.date: 01/30/01
ups.id: APC
ups.vendorid: 051d
ups.model: SMART-UPS 500
ups.status: OL
ups.load: 39.0
ups.serial: NS0105xxxxxx
ups.firmware: 120.14S.A
ups.firmware.aux: 120.14S.A
ups.productid: 001,051,1146
ups.temperature: 48.6
ups.realpower.nominal: -1
ups.test.result: No Test in the last 5mins
ups.delay.start: 0
ups.delay.shutdown: 180
ups.timer.reboot: -1
ups.timer.start: -1
ups.timer.shutdown: -1
battery.runtime: 300
battery.runtime.low: 120
battery.charge: 100.0
battery.charge.low: 5
battery.charge.warning: 50
battery.voltage: 27.9
battery.voltage.nominal: 24.0
battery.date: 08/28/20
battery.mfr.date: 08/28/20
battery.temperature: 48.6
battery.type: PbAc
driver.name: usbhid-ups
driver.version.internal: apcupsd 3.14.14 (31 May 2016) debian
driver.version.data: APC Smart UPS (any)
driver.parameter.pollfreq: 60
driver.parameter.pollinterval: 10
input.voltage: 102.0
input.voltage.nominal: 230
input.sensitivity: High
input.transfer.high: 110.0
input.transfer.low: 90.0
input.frequency: 50.0
input.frequency.nominal: 50
input.transfer.reason: 
output.voltage: 102.0
output.voltage.nominal: 100
server.info: debian10
ups.beeper.status: enabled

「usvnutwrapper.sh」の応答箇所に日付と応答内容をファイル出力するコマンドを追加して電源喪失時の推移を記録確認した。
Wed Sep 2 14:51:16 JST 2020 VAR ups ups.status "OL"
Wed Sep 2 14:51:21 JST 2020 VAR ups ups.status "OL"
---------- ups power failur --------------
Wed Sep 2 14:51:27 JST 2020 VAR ups ups.status "OB DISCHRG"
Wed Sep 2 14:51:33 JST 2020 VAR ups ups.status "OB DISCHRG"
----------- ups on battery -------
Wed Sep 2 14:52:35 JST 2020 VAR ups ups.status "LB OB DISCHRG"
Wed Sep 2 14:52:35 JST 2020 VAR ups ups.status "LB OB DISCHRG" -- ds216j safe mode
Wed Sep 2 14:52:40 JST 2020 VAR ups ups.status "LB OB DISCHRG"
----------- debian10 shut down -------
----------- ups power off -------------------    -- ds216j power off
----------- ups power on -------------------     -- ds216j power on
----------- debian10  boot up ----------
Wed Sep 2 15:02:17 JST 2020 VAR ups ups.status "LB OL"    -- ds216j safe mode
Wed Sep 2 15:02:22 JST 2020 VAR ups ups.status "LB OL"
----------- ups  charg battery ---------
Wed Sep 2 15:10:08 JST 2020 VAR ups ups.status "LB OL"
Wed Sep 2 15:10:14 JST 2020 VAR ups ups.status "OL"    -- ds216j still safe mode
Wed Sep 2 15:10:19 JST 2020 VAR ups ups.status "OL"
UPSの入力電源消失後、電池動作に移行。
STATUSがONLINEからONBATTとなりNUTクライアントに「OL」から「OB DISCHRG」応答する。
TIMELEFT=MINTIMELになるとLOWBATTとなり「LB OB DISCHRG」応答する。
ds216jは、「LB」を受け、セーフティモードへ移行する(電源断準備)。
apcupsdは、「shutdown -h」を実行し、halt直前にUPS電源断コマンド「killpower」を実行する。
upsは、DSHUTD時間後にups出力を断する(DLOWBATT>TIMELEFTまたはMBATTCHG>BCHARGEで即時出力断)。
upsの入力復電後、DWAKE時間後にups出力を回復させる。
killpowerは、一度発行されるとキャンセルできない。DSHUTD時間中に電源回復してもキャンセルされない。apcupsdの説明に「意図しないups出力断を発生させないため、必要に応じて/etc/apcupsd/apccontrolのkillpowerコマンドをコメントアウト」するよう記載されている。ひかり電話使用中にPR-S300SEの電源断を実施してしまった。
debian10及びds216jが起動する。起動順位によってds216jは、「ups接続失敗」か「LB OL」を受ける。「ups接続失敗」時は、通常動作、「LB OL」では、セーフティモード状態となる。
upsの充電が進みTIMELEFT>MINTIMELとなると「OL」を受けるが、セーフティモードから通常状態戻らない。

「usvsnutwrapper.sh」のコードを確認するとBCHARGEが100%になるまで「CHRG OL」が出力され、100%で「OL」が出力される。
BCHARGEのチェックは、fullstatus()チェックで行われる。
ds216jは、DSMにログインされていると「LIST var ups」コマンドが1分毎に実行されるが、ログオフすると実行されない。結果、多くの場合、fullstatus()チェックが実行されず、「CHRG OL」が出力されない。sshログインでは、「LIST var ups」コマンドが発行されない。
下記の処理を加え、「CHRG OL」出力されるようにした。
usvnutwrapper.sh
getstatusdata() {
APCACCESS="$(apcaccess -h $APCUPSDSERVER -p STATUS)"
APCBCHARGE="$(apcaccess -h $APCUPSDSERVER -p BCHARGE | cut -d'.' -f1)"
VALUE="${APCACCESS%%[[:cntrl:]]}"
UPS_STATUS=""
                                if [ $APCBCHARGE = "100" ]; then BATTNOTFULL=0; else BATTNOTFULL=1; fi
                                if [[ $VALUE == *"ONLINE"* ]]; then
                                        UPS_STATUS="OL $UPS_STATUS";
                                        if [ $BATTNOTFULL = 1 ]; then UPS_STATUS="CHRG $UPS_STATUS"; fi
                                fi
                                if [[ $VALUE == *"ONBATT"* ]]; then UPS_STATUS="OB DISCHRG $UPS_STATUS";  fi
                                if [[ $VALUE == *"LOWBATT"* ]]; then UPS_STATUS="LB $UPS_STATUS"; fi
「LB CHRG OL」から「CHRG OL」「OL」の変化でもds216jのセーフモードから通常起動状態へ推移しない。
テストの結果、「ups接続失敗」から「CHRG OL」「OL」へ変化するとセーフモードから通常起動状態へ推移する。
「usvnutwrapper.sh」でONBATTの時だけLOWBATTとなるよう対応してみた。
root@debian10:~# diff /usr/local/bin/usvnutwrapper.sh.org /usr/local/bin/usvnutwrapper.sh
111,115c111,116
< 				UPS_STATUS="OL $UPS_STATUS";
< 				if [ $BATTNOTFULL = 1 ]; then UPS_STATUS="CHRG $UPS_STATUS"; fi	#if battery is not at 100%, add charging flag
<  				fi
< 				if [[ $VALUE == *"ONBATT"* ]]; then UPS_STATUS="OB DISCHRG $UPS_STATUS"; fi #onbattery with discharge flag
< 				if [[ $VALUE == *"LOWBATT"* ]]; then UPS_STATUS="LB $UPS_STATUS"; fi
---
> 				UPS_STATUS="OL $UPS_STATUS";
> 				if [ $BATTNOTFULL = 1 ]; then UPS_STATUS="CHRG $UPS_STATUS"; fi	#if battery is not at 100%, add charging flag
> 				fi
> 				if [[ $VALUE == *"ONBATT"* ]]; then UPS_STATUS="OB DISCHRG $UPS_STATUS";  #onbattery with discharge flag
> 					if [[ $VALUE == *"LOWBATT"* ]]; then UPS_STATUS="LB $UPS_STATUS"; fi
> 				fi
186a188,189
> APCBCHARGE="$(apcaccess -h $APCUPSDSERVER -p BCHARGE | cut -d'.' -f1)"
> APCTIMELEFT="$(apcaccess -h $APCUPSDSERVER -p TIMELEFT | cut -d'.' -f1)"
189c192
< 
---
> 				if [ $APCBCHARGE = "100" ]; then BATTNOTFULL=0; else BATTNOTFULL=1; fi 
191,195c194,199
< 					UPS_STATUS="OL $UPS_STATUS";
< 					if [ $BATTNOTFULL = 1 ]; then UPS_STATUS="CHRG $UPS_STATUS"; fi
< 				fi
< 				if [[ $VALUE == *"ONBATT"* ]]; then UPS_STATUS="OB DISCHRG $UPS_STATUS"; fi
< 				if [[ $VALUE == *"LOWBATT"* ]]; then UPS_STATUS="LB $UPS_STATUS"; fi
---
> 					UPS_STATUS="OL $UPS_STATUS";
> 					if [ $BATTNOTFULL = 1 ]; then UPS_STATUS="CHRG $UPS_STATUS"; fi
> 				fi
> 				if [[ $VALUE == *"ONBATT"* ]]; then UPS_STATUS="OB DISCHRG $UPS_STATUS";
> 					if [[ $VALUE == *"LOWBATT"* ]]; then UPS_STATUS="LB $UPS_STATUS"; fi
> 				fi
204d207
< 			
214a218
> APCMINTIMEL="$(apcaccess -h $APCUPSDSERVER -p MINTIMEL | cut -d' ' -f1)"
240c244
< 			echo -en "VAR ups ${COMMAND:12} \"$UPS_STATUS\"\n" 
---
> 			echo -en "VAR ups ${COMMAND:12} \"$UPS_STATUS\"\n" 
307d310
< 	
復電時に「OL」となるためds216jが稼動状態で起動する。

(4)UPS対策
Smart UPS 500(SU500)の3回目電池交換が完了したが、機材の老朽化が懸念される。後継機候補としてバッテリー容量の少ない(バッテリー稼動時間が少ない)低価格品で複数台使用するか、後継機のSmart UPS 500(SMT500)とするか検討の結果、SMT500を導入する事とした。選定理由には、スーパーナットのバッテリー容量確認も影響した。

スーパーナットのRBC20J-Sの容量確認
・後継UPSを選定(SMT500J)
・UPSバックアップするシステム機材構成
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする