Raspberry Pi 的應用 - 網管人神器,隨時監控電力狀況的 UPS Server

by 6月 01, 2015 4 意見                    

「啊~~~~ 怎麼突然停電了!!! 我的文件還沒存檔,天啊!」
「我的設計圖才畫到一半耶,救人哦!!!」
「報表等一下就要交給老闆了啦,死定了!!!」

不管是跳電、插頭被踢掉,或是莫名其妙的平地一聲雷,都會讓這樣子的哀嚎及慘叫聲在辦公室此起彼落。

你,也想成為他們其中的一個嗎?或是成為被炮轟的對象嗎?


為什麼要用 UPS


所有的網管人都知道,機房裡的重要設備,電源線一定連在 UPS 上面,大從 Server、Router,小到 Switch、Hub,絕對無一倖免 ... XDD

這裡指的 UPS 可不是 United Parcel Service Inc.,那個世界知名的物流運輸公司。

而是 Uninterruptible Power Supply,不斷電系統。

UPS 的功能很簡單,一方面提供品質穩定的電源輸出,另一方面處理不穩定的電源輸入;說破了,也不過就是一片電路板,一顆大電池,再用一個外殼包起來而已。

說起來當然是很簡單,做起來可是不簡單,關於 UPS 的 Q&A,請參閱 台達電 - UPS 問與答

這邊順便要釐清一個錯誤的觀念:
「讓我們在斷電時還能繼續工作,那是備用發電機組該負責的,絕對不是 UPS 的任務。」

UPS 的目的只是讓我們在斷電的時候,能依正常程序結束工作並關閉系統,不會因突然停電造成系統、資料的毀損,或是設備的故障。

而 UPS 主要分為三種運作型態:
  • 離線式 (Off-Line) - 平時為待機狀態,斷電的瞬間才供電。
  • 在線互動式 (Line Interactive) - 平時為待機狀態,但是隨時在穩壓,在斷電的瞬間才供電。
  • 在線式 (On-Line) - 全時進行穩壓再供電。
在選購時,比較重要的關鍵有:
  • 容量大小,決定供電的時間長短。
  • 運作模式,決定供電品質的好壞。
  • 監控介面,決定如何監控供電狀況。

容量跟運作模式就沒什麼好說的,容量越大越好,在線式才是王道,一切提「錢」來見。

監控介面不外乎下面幾種:
  • Serial Port,也就是 RS-232 接頭,現在比較少見了。
  • USB,目前的主流介面。
  • RJ-45,高階的 UPS 才會有。
UPS 可不是裝上去就好了,斷電的時候,我們可是要趕快去把設備關機,以測安全。

問題是,我怎麼知道停電了呢?

透過內建的網路介面加上專用軟體來監控 UPS 的供電狀況,當然是輕鬆又方便,可是只有 Serial Port 或是 USB 的話,難道就不能透過網路來管理嗎?

放心!!!
當然有辦法,Network UPS Tools 就是你的救星。

它支援了上百家個品牌的 UPS,並且支援 Windows、Mac、Linux 及 BSD 等平台,不管是 Serial Port、USB、RJ-45 也統統可以使用。

事前準備

  • Raspberry Pi Model B / B+ / 2B,Model A / A+ 須加上 USB 有線 / 無線網路卡。
  • Raspbian 作業系統。
  • UPS,監控介面最好是 USB 或 RJ-45,這次是用 APC Back-UPS ES 500VA
    如果是 Serial Port 也不是不可以,只要利用支援 Linux 的 USB to RS-232 轉接線 即可。

Server 端安裝與設定


安裝 Network UPS Tools 套件。
sudo apt-get -y install nut

先從官網的 硬體支援清單,查詢該型號使用的驅動程式及連接埠,這邊有幾個欄位可以過濾:
  • Support Level - 支援程度,一顆星到五顆星,越高越好。
  • Device Type - 設備類型,PDU (電源分配器)、SCD (太陽能控制設備)、UPS (不斷電系統)。
  • Manufacturer - 廠牌。
  • Model -型號。
  • Connection - 連線方式,Serial、USB、Network。

找到對應的 UPS 型號,右側會顯示適用的驅動程式類型,點選這個連結。

在「IMPLEMENTATION」的段落,就會有驅動程式的設定值。

編輯 UPS 設定檔。
sudo vi /etc/nut/ups.conf

將剛剛查詢到的驅動程式設定值,寫入設定檔裡,中括弧「[apc]」是自訂的 UPS 名稱,接下來的步驟會用到,desc="xxx" 只是註解可省略。
[apc]
    driver = usbhid-ups
    port = auto

啟動 UPS 設備。
sudo upsdrvctl start

編輯運作模式設定檔。
sudo vi /etc/nut/nut.conf

將「MODE=none」改成「MODE=netserver

確認本機所有的 IP 位址,這裡只加入 IPv4 的位址。
ifconfig | grep inet[^6]

編輯 UPS Daemon 設定檔。
sudo vi /etc/nut/upsd.conf

找到「# LISTEN <address> [<port>]」,在下一行加入所有 IP 位址,連接埠 3493 不用改。
LISTEN 127.0.0.1 3493
LISTEN 10.1.1.22 3493
LISTEN 172.17.42.1 3493

編輯 UPS Daemon 使用者設定檔。
sudo vi /etc/nut/upsd.users

新增一個管理者帳號,「[admin]」是自訂的帳號名稱,「password=」是自訂密碼。
[admin]
  password = admin-pw
  actions = SET
  instcmds = ALL

再新增一個 UPS 主控端,「password=」是自訂密碼。
[upsmon]
  password = upsmon-pw
  upsmon master

編輯 UPS 監控程式設定檔。
sudo vi /etc/nut/upsmon.conf

加入下列設定值,「apc」是 ups.conf 的 UPS 名稱,「localhost」是本機的 IP 位址,「upsmon」是 upsd.users 的主控端名稱,「upsmon-pw」是主控端的密碼,「master」代表這台是主控端。
MONITOR apc@localhost 1 upsmon upsmon-pw master

啟動 NUT 的 Server 端服務。
sudo service nut-server start

啟動 NUT 的 Client 端服務。
sudo service nut-client start

確認服務均已正確啟動。
ps -ef | grep ups

我們還可以用指令來確認這顆 UPS 可執行的管理命令。
upscmd -l apc

或是取得 UPS 目前的系統狀態。
upsc apc


斷電實測


我們試著將 UPS 的市電插頭拔掉,這時候在 Shell 就會跳出「UPS on battery」的訊息。

接著再把市電插頭接回去之後,就會出現「UPS on line power」的訊息。

如果我們拔掉 USB 連接線,則是出現「UPS is unavailable」的訊息。

這些服務在運作過程中的錯誤訊息,可以在 /var/log/syslog 裡面找到。
cat /var/log/syslog | grep ups | less


Windows Client 端


在 Windows 上,常見的是兩套程式:WinNUTWindows NUT Client

WinNUT

這根本就是把 NUT 原封不動的轉到 Windows 平台上,目前支援到 Windows 7。

最後的版本是在 2011/2/24 發佈的 2.0.0.4a。

安裝過程是標準的無腦安裝法,一直按「Enter」鈕就行了。

安裝完畢之後,會在程式集裡新增捷徑:
  • Start WinNUT Ups Monitor - 啟動 WinNUT
  • Stop WinNUT Ups Monitor - 停止 WinNUT
  • WinNUT Configuration Tool - 設定 WinNUT

先執行「WinNUT Configuration Tool」,點選「Configuration File Path」右側的「Edit」。

看到了吧!!! 真的就是 Linux 上面的設定檔格式。

我們一樣要加入 UPS 的 IP 位址,千萬別照抄,要改成 Server 的 IP ,而角色也不是「master」,是「slave」。
MONITOR apc@10.1.1.22 1 upsmon upsmon-pw slave

如果我們需要同時管理多台 UPS的話,在這邊加入多個 IP 位址的設定值即可。

如果我們用的是 x64 的版本,NOTIFYCMD 的路徑也要改,把「Program Files」改成「Program Files (x86)」。
NOTIFYCMD "C:\\Program Files (x86)\\WinNUT\\alertPopup.exe"

儲存設定值之後,點選「Apply and Start WinNUT」,Status 就會變成「Running as Application」。

這邊還有一些選項可以調整:
  • Event Log - 設定 Log 檔記錄的錯誤訊息等級。
  • Install As Service - 把 WinNUT 轉成背景服務的運作模式,自動執行。
  • Upsd Port - Server 端的監聽通訊埠。
  • Use Timed Shutdown - 斷電後自動關機,設定斷電幾秒之後關機,以及關機的模式。

我們一樣把市電的插頭拔掉,就會跳出一個對話框,顯示「UPS on battery」。

再把插頭接上,對話框就會顯示「UPS on line power」了。

Windows NUT Client

這一套的畫面比較漂亮,但是設定值相對少很多,安裝也沒什麼好說的,同樣是無腦 Enter 安裝法。

進到主畫面之後,先點選「Settings」。

在「Connection」頁籤,設定好 Server 端的 IP、通訊埠、名稱,「Re-establish connection」打勾。

在「Misc」頁籤,可以設定 UPS 電力剩下多少 % 就關機。

接著就可以連線到 Server 端,並且看到 UPS 的狀況了。

但是有個可能是 BUG 的小問題,不管是在插上或拔掉市電,UPS 的狀態永遠是「UPS On Battery」。


Linux Client 端


Linux 上只要安裝 nut-client 即可。
sudo apg-get -y install nut-client

同樣編輯 upsmon.conf。
sudo vi /etc/nut/upsmon.conf

而設定值比照 WinNUT 一樣就可以了。


Mac OS X Client 端


NUT 官網有提供 Binary packages for Mac,透過 Fink 或 MacPort 兩種套件管理工具來安裝。

Fink 上的才有支援到 10.10 Yosemite。

MacPort 上的只支援到 10.6 Snow Leopard。

否則就得從 Source Code 自己編譯了。

不過這個部份我目前沒有需求,所以就不實作了,或許過一陣子我想不開的時候會再試試 ...... XD


異常排除


在啟動 UPS 的過程中,出現「Can't chdir to /var/run/nut」、「writepid: fopen /var/run/nut/usbhid-ups-apc.pid: Permission denied」。


這是因為安裝套件時,系統沒有自動建立 run-time 的目錄,手動建立即可。
sudo mkdir /var/run/nut
sudo chown root:nut /var/run/nut
sudo chmod 770 /var/run/nut


在啟動 nu-server 時出現「upsd failed」的錯誤訊息。

可能是 upsd.conf 設定錯誤、UPS 的 USB 線沒接、UPS 的電源沒開 ... 等原因所致。


參考資料


圖片來源


更新紀錄

  • 2015/06/01 撰文。

Heracles Jam,江湖人稱「海公公」

IT 技術家 - 創站部落客

一個常用 Windows、慣用 macOS、愛用 Linux 的 3C 阿宅
現職 MIS / 業界講師 / 資訊顧問 / 部落客

4 則留言 :

  1. 安安你好
    我想找會根據 UPS 使用電池時自動命令 Windows shutdown -h 讓他休眠(不是睡眠)的方法,
    不知道大大有沒有什麼建議?
    我常是上面的相關 win 軟體好像沒找到這方面的支援。

    一般關機還是會有些還沒存的檔案,無人操作的時候他不會存檔。
    想要休眠是為了要更降低檔案未儲存的損失率。

    回覆刪除
    回覆
    1. WinNUT 就可以辦得到了,可以參考蘇老這篇文下去修改。
      http://www.askasu.idv.tw/index.php/2017/09/19/3629/

      刪除
  2. 請教 USBtoRs232要如何做呢? 我的UPS是RS232接口

    回覆刪除
  3. 請問,pi 4B會建議安裝哪一套os來建立ups (SNMP) Server呢?

    回覆刪除