[FreeBSD] 飛瑞 C-1000S UPS 用 nut 監控

O.S.:FreeBSD 7.1-RELEASE amd64
Version:nut 2.4.1_6

因為買了一個飛瑞 C-1000S 的 on-line UPS,就想說用來裝在 FreeBSD 的伺服器上。可是飛瑞附的 WinPower 只有 for 4.x 版,又是 i386 的,所以只好自己弄囉。不過 nut 的說明文件其實省略很多地方(比較偏理論,有些細節也沒有說明),而且飛瑞的 driver 其實是另外用別人的,所以設定上複雜了點。

  1. 安裝 nut(如果沒有安裝 snmp,還會順便幫你安裝)
  2. #cd /usr/ports/sysutils/nut
    #make install clean
  3. 設定 nut(範例檔官方說明文件
    • rc.conf
    • nut_enable="YES"
      nut_upslog_enable="YES"
      nut_upsmon_enable="YES"
    • ups.conf (先設定 UPS 的相關資訊)
    • [C1000S]               // snmp 用來辨識 UPS 的名稱
      driver = blazer_ser    // UPS Driver(如果沒選好,就有很多功能不能用)
      port = /dev/cuad0      // RS-232 COM-port 1
      desc = "Phoenixtec C-1000S"   //就只是描述
    • upsd.conf (設定 upsd 服務)
    • LISTEN 127.0.0.1 3493  // 基本上不用什麼設定,預設就只有這一行開啟的 port(因為 acl 那些設定都不能用了)
    • upsd.user (設定可以存取的使用者)
    • 	# Supervision user
      	[admin]       // 使用者名稱
      		password = mypass       // 使用者密碼
      		allowfrom = localhost   // 允許存取的來源
      		actions = SET           // SET:可以更改 UPS 的參數。FSD:可以讓 UPS 強制關機
      		instcmds = ALL          // 可以執行:面板測試、電池測試、校正
      
      	# Protection user
      	[monuser]
      		password  = mypass
      		allowfrom = localhost
      		upsmon master           // UPS 模式為 Master
    • upsmon.conf (UPS 的動作)
    • MONITOR C1000S@localhost 1 monuser mypass master  // 先設定控制所需要的 UPS 名稱、使用者資訊
      SHUTDOWNCMD "/sbin/shutdown -h +0"                // 關機的命令
      NOTIFYCMD "/usr/local/etc/nut/upssched-cmd"       // 通知的命令(這個設定很複雜,下面會再介紹)
      NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC                // UPS on battery 時,要執行的動作(寫入紀錄檔、通知系統內的所有使用者、執行通知命令)
      NOTIFYFLAG ONLINE SYSLOG+EXEC                     // UPS 回覆 on line 時,執行寫入紀錄檔和執行通知命令
    • 系統關機順序
    • 1. The UPS goes on battery                          // 由 UPS 電池供電
      2. The UPS reaches low battery (a "critical" UPS)   // UPS 變成低電位
      3. The upsmon master notices and sets "FSD" - the "forced shutdown" flag to tell all slave systems that it will soon power down the load. // upsmon 會送出 "FSD" 標籤給所有的 UPS (在 upsmon 設定)
      4. generates a NOTIFY_SHUTDOWN event                // 產生 NOTIFY_SHUTDOWN 的事件
      5. waits FINALDELAY seconds - typically 5           // 等待一定的秒數(在 FINALDELAY 設定)
      6. creates the POWERDOWNFLAG file - usually /etc/killpower    // 產生 POWERDOWNFLAG 的檔案,準備將 UPS 關機
      7. calls the SHUTDOWNCMD                            // 執行 SHUTDOWNCMD
      
    • NOTIFYCMD (upsmon.conf 內通知的命令)
    • NOTIFYCMD 會在系統需要通知的時候,依照 upsmon.conf 的設定進行通知:
      <notify type>:通知模式的設定(詳細的在 upsmon.conf 有)
      NOTIFYMSG <notify type> "message":設定什麼 notify type 要送出什麼訊息,通知的訊息會變成 NOTIFYCMD 執行時候的參數。
      NOTIFYFLAG <notify type> <flag>[+<flag>]:設定 notify flag 的警示方式。(可以設定系統紀錄+全系統通知+執行 NOTIFYCMD)
      
      所以 NOTIFYCMD 可以直接設定執行檔,但是這樣就不能有計時器的設定了(upssched.conf)。
      計時器的設定可以讓你在市電中斷的時候,開始計時,一段時間後就執行某些命令。
      如果要有計時器的設定的話,NOTIFYCMD 要設定成:
      NOTIFYCMD /usr/local/sbin/upssched
      
    • upssched.conf(計時器設定)
    • CMDSCRIPT /usr/local/etc/nut/upssched-cmd   //事件的計時器完成時,要執行的命令(會以計時器的名稱當成參數)
      PIPEFN /etc/uucp/upssched.pipe              //幫助計時的檔案
      LOCKFN /etc/uucp/upssched.lock              //幫助計時的檔案
      上面這三行一定要在設定計時器的語法之上,幫助計時的檔案一定要在同一個目錄內,也要讓 nut 的使用者可以寫入(不過不要讓別的使用者可以存取)
      AT <notifytype> <upsname> <command>         //計時器的標準語法。 upsname 為 * 就是代表所有的 ups。
      # 當 ONBATT (停電時)就啟動名為 shutdown 的計時器,倒數 180 秒
      AT ONBATT * START-TIMER shutdown 180
      # 當 ONLINE (電來了)就停止名為 shutdown 的倒數計時
      AT ONLINE * CANCEL-TIMER shutdown
      # 其他設定 (依照 notifytype 執行 CMDCRIPT)
      AT ONBATT * EXECUTE ups-ob                  //因為我怎麼試,upsmon 都沒辦法把通知的訊息直接當參數送給 CMDSCRIPT,所以只好土法煉鋼直接靠這邊送了
      AT ONLINE * EXECUTE ups-ol
      AT LOWBATT * EXECUTE lowbatt
      AT REPLBATT * EXECUTE replacebatt
      
    • upssched-cmd
    • #!/bin/sh
      case $1 in
      
      shutdown)
       /bin/echo "`date "+%Y-%m-%d %H:%M:%S"` 市電異常超過三分鐘,強迫關機" > /tmp/sms_ups.txt
       /usr/local/etc/nut/sms_alarm.php            //這個是簡訊通知的程式
       /usr/local/libexec/nut/upsdrvctl shutdown   //將 UPS 關機(因為我的 UPS 有設定延遲 30 秒關機)
       /bin/echo "`date "+%Y-%m-%d %H:%M:%S"` UPS 關機指令已下達,主機開始關機" > /tmp/sms_ups.txt
       /usr/local/etc/nut/sms_alarm.php
       /usr/local/sbin/upsmon -c fsd               //這個指令下完,主機就會關機了
       ;;
      
      "ups-ob")
       /bin/echo "`date "+%Y-%m-%d %H:%M:%S"` 市電異常,由 UPS 電池供電中" > /tmp/sms_ups.txt
       /usr/local/etc/nut/sms_alarm.php
       ;;
      
      "ups-ol")
       /bin/echo "`date "+%Y-%m-%d %H:%M:%S"` 市電恢復, UPS 正常運作" > /tmp/sms_ups.txt
       /usr/local/etc/nut/sms_alarm.php
       ;;
      
      *)
             logger -t upssched-cmd "Unrecognized command: $1"
             ;;
      
      esac
    • MRTG 設定
    • Target 設定:
      Target[ups]: `/usr/local/bin/upsc C1000S@localhost battery.voltage | /usr/bin/awk '{print $1*10}' && /usr/local/bin/upsc C1000S@localhost input.voltage | /usr/bin/awk '{print $1*10}'`
  4. 啟動 nut
  5. #/usr/local/etc/rc.d/nut start
  6. 相關命令
    • 紀錄檔: /var/log/ups.log
    • UPS 資訊:
    • #/usr/local/bin/upsc C1000S@localhost
      battery.voltage: 2.26    //電壓偵測怪怪的,應該是 driver 的關係
      beeper.status: disabled
      driver.name: blazer_ser
      driver.parameter.pollinterval: 2
      driver.parameter.port: /dev/cuad0
      driver.version: 2.4.1
      driver.version.internal: 1.51
      input.frequency: 60.0
      input.voltage: 116.7
      input.voltage.fault: 116.7
      output.voltage: 110.9
      ups.delay.shutdown: 30   //延遲關機
      ups.delay.start: 180     //市電回覆後,延遲開機
      ups.load: 0
      ups.status: OL
      ups.temperature: 40.0
      ups.type: online
    • UPS 可用命令:
    • #/usr/local/bin/upscmd -l C1000S@localhost
      Instant commands supported on UPS [C1000S]:
      
      beeper.toggle - Toggle the UPS beeper
      load.off - Turn off the load immediately
      load.on - Turn on the load immediately
      shutdown.return - Turn off the load and return when power is back
      shutdown.stayoff - Turn off the load and remain off
      shutdown.stop - Stop a shutdown in progress
      test.battery.start - Start a battery test
      test.battery.start.deep - Start a deep battery test
      test.battery.start.quick - Start a quick battery test
      test.battery.stop - Stop the battery test
    • 更改 UPS 參數:
    • #upsrw -u monuser -p mypass C1000S@localhost
      如果可以更改的話,會有一些參數出現(不能更改或是 Driver 錯誤的話,就不會有訊息出現)
      [ups.test.interval]
      Interval between self tests
      Type: ENUM
      Option: "1209600"
      Option: "604800" SELECTED
      Option: "0"
      

[FreeBSD] 飛瑞 C-1000S UPS 用 nut 監控 有 “ 3,546 則迴響 ”

發表迴響