[Power by FreeBSD]
顏國雄 2001/10 初
UPS
2006/08/28 修改 

到底有哪一台 UPS 有支援 FreeBSD 已經是 BBS 的 FAQ ,停電了,UPS 沒有下指令關閉系統,最後, 電池電耗完造成不正常關機,損失慘重。

網路上有一群有志之士發展了一套叫 NUT (Network UPS Tools) 的程式組,它可以應用在滿多的 UPS 上,到底支援哪些廠牌的 UPS 可以到下列網址的 Compatibility List 瞧瞧

http://www.exploits.org/nut/

FreeBSD 也有 nut 的 ports 和 packages (初寫這篇時的版本是 0.45.1 ,現在已經發展到 2.0.4 )

 

1 安裝 NUT

1.利用 packages 來安裝

pkg_add -v ftp://ftp.tku.edu.tw/OS/FreeBSD/packages/packages-stable/All/nut-0.45.1.tgz

2.利用 ports 來安裝

nut 有提供 web 界面來監看 UPS 的狀態,或是下一些簡單的指令給 UPS ,想啟動這方面的功能就以 ports 的方式安裝,如果您已經有完整的 ports tree ,只要執行下面的指令:

cd /usr/ports/nut
make CGI=yes
make CGI=yes install

安裝完後

  • 設定檔會放在 /usr/local/etc/nut 的目錄中
  • 啟動檔會放在 /usr/local/etc/rc.d/nut.sh.sample
  • 說明文件會放在 /usr/local/share/doc/nut 的目錄中

 

2 修改設定

如果是當主控端的(有接 UPS 訊號線的) 需要修改:

/usr/local/etc/nut/ups.conf
/usr/local/etc/nut/upsd.conf
/usr/local/etc/nut/upsmon.conf
/usr/local/etc/nut/upssched.conf
/usr/local/etc/nut/upssched-cmd
/etc/rc.shutdown

 

主控端如果想使用 Web CGI 來監控 UPS 則另外要再修改

/usr/local/etc/nut/hosts.conf
/usr/local/etc/nut/upsset.conf
/usr/local/etc/nut/upsd.users

 

如果是當被控端(透過網路接收主控端送來的 UPS 狀態) 需要修改:

/usr/local/etc/nut/upsmon.conf

另外,

/usr/local/etc/rc.d/nut.sh.sample

需視 UPS 的廠牌、連接埠、功能而修改。

 

2.1 修改 /usr/local/etc/nut/ups.conf

這個檔主要是定義 ups 的廠牌 (driver) 和訊號線接在哪裡 (port):

  • driver : 可用的參數可以查 /usr/local/libexec/nut
  • port: /dev/cuaa0 (COM1) /dev/cuaa1 (COM2) ...... 以此類推

備註:在 FreeBSD 6.x 上 COM1 已改為 /dev/cuad0,記得依系統的版本用 cuaa 或 cuad

【範例一】

APC SmartUPS

[apc]
driver = apcsmart
port = /dev/cuaa0
sdtype = 1

說明:APC 必須是接黑色的訊號線的那個 port,灰線的無法關閉 UPS

【範例二】

PowerCom (科風) KingPro

[powercom]
driver = powercom
port = /dev/cuaa0


2.2 修改 /usr/local/etc/nut/upsd.conf

這個設定檔主要是用來控制網路連線的權限, nut 會啟動 upsd 隨時監聽 tcp/udp port 3305 來提供 UPS 的狀態, 或是下達關閉系統的指令給 upsmon , 利用 upsd.conf 可以設定哪些機器才可以連線,並且可以設定它的權限, 詳細的用法請自行參考 /usr/local/share/doc/nut/access.txt 中的說明。

這個檔主要分為兩部份:

ACL 定義機器 (IP) 所屬的 ACL 群組
ACCESS 設定群組的權限及連線密碼

下面設定一台主控端 (server1 , localhost) 及兩台被控端 ( server2 , server3 ) 的權限,設定的主要內容如下:

ACL all 0.0.0.0/0
ACL localhost 127.0.0.1/32
ACL server2 192.168.1.3/32
ACL server3 192.168.1.4/32

ACCEPT localhost
ACCEPT server2 server3
REJECT all

ACCESS grant master localhost ConnectionPassword1
ACCESS grant login server2 ConnectionPassword2
ACCESS grant login server2 ConnectionPassword3
ACCESS deny all all

語法說明:

  • ACL all 0.0.0.0/0 :定義一個叫 all 的 ACL,只要屬於 0.0.0.0/0 的網段,通通適用 all 這個 ACL。
    同理 ACL localhost 127.0.0.1/32 就是 127.0.0.1 這個 IP 屬 localhost 這個 ACL。
  • ACCEPT localhost :接受 localhost 這個 ACL 的網段的連線請求。
  • REJECT all :拒絕 all 這個 ACL 的網段的連線請求。
  • 規則的部份因為是 first match 的原則,所以,我們把放行的擺在比較前面,最後再加一條全部拒絕,這樣就可以擋掉所有的不速之客。


    語法:ACCESS []
    grant 為給予後面的權限
    deny 為拒絕連線
    master 有接訊號可將 UPS 關閉的用
    login 可連線取得狀態並在 master 關機前先下關機的指令

備註:有刪除線的部份為舊版的語法。

 

2.3 設定 /usr/local/etc/nut/upsd.users

在 NUT 舊版中的連線密碼是設定在 upsd.conf 中,現在的版本改設定在 upsd.users 裡,例如:

[apcadmin]
password = ConnectionPassword1
allowfrom = localhost
upsmon master

[powercomadmin]
password = ConnectionPassword1
allowfrom = server2
upsmon slave

前例讓在 upsd.conf 中 ACL 定義為 localhost 的網段,連線時用 apcadmin 的帳號,ConnectionPassword1 則為連線密碼。而 在 upsd.conf 中 ACL 定義為 server2 的機器要用 powercomadmin 這個帳號,密碼為 ConnectionPassword1。

 


2.4 設定 /usr/local/etc/nut/upsmon.conf

在 upsmon.conf 裡主要是告訴 upsmon 該向哪一台的 upsd 取得 UPS 的狀態, 並在必要時刻下達 shutdown 的指令,或其它關機前必須先執行的指令。所以不管是 master 或 clients 都必須要設定。

2.4.1 主控端 (master)

所謂的 master 一般指的是將 UPS 訊號線直接接在電腦上接收訊號的機器,下面這行是我們要在 master 的 upsmon.conf 中加的:

MONITOR apc@localhost 1 ConnectionPassword1 master


說明:

  • apc@localhost 是因為 ups.conf 範列一中括號的定義時是 [apc], 所以前面 ups.conf 範例二的機器應該用 powercom@localhost
  • ConnectionPassword1 是我們前面在 upsd.conf 中設定的密碼


2.4.2 被控端 (clients)

所謂的 clients 則是指本身沒有接 UPS 訊號線,但是 upsmon 透過網路向有接訊號線的 master 查詢 UPS 的狀態,再決定所應採取的動作,在 master 還沒將 UPS shutdown 前關閉系統。

下面假設:

  • 有 UPS 訊號線的主機 (master) 的網址為 server1.test.edu.tw
  • 在 server1 的 ups.conf 中有定義 [apc]
  • 在 server1 的 upsd.conf 中有將 client 放在 ACCEPT 的 ACL 中
  • 在 server1 的 upsd.users 中有
    [apcadmin]
    password = ConnectionPassword1
    allowfrom = server2
    upsmon slave

我們可以在 client 上設定 upsmon.conf 加上:

MONITOR apc@server1.test.edu.tw 1 apcadmin ConnectionPassword1 slave

這樣,upsmon 就可以用所設定的帳號 apcadmin 密碼 ConnectionPassword1 和 server1 上的 upsd 通訊。

 

2.4.3 upsmon.conf 的額外設定

主控端必須修改一下 killpower 的路徑,改成:

POWERDOWNFLAG /etc/uucp/killpower


說明:

因為 upsmon 是以 uucp 的身份在執行,而 uucp 對 /etc 沒有寫入的權限,看看用 ls -l /etc 中有下面這行:

drwxrwx--- 2 uucp uucp 512 Dec 13 2002 uucp

/etc/uucp 這個目錄擁有者本來就是 uucp:uucp ,所以修改 POWERDOWNFLAG 的路徑到 /etc/uucp 才不致發生權限上的問題,不過 FreeBSD 5.x 版以後, /etc/uucp 的目錄不見囉!只好自行建立目錄並換好權限,可以執行下面的步驟:

mkdir /etc/uucp
chown uucp:uucp /etc/uucp
chmod 770 /etc/uucp


NUT 的 upsmon 預設是在 UPS 處於 Low Battery 的狀態才會將作業系統 shutdown, 如果希望在停電 5 分鐘後就馬上開始關機,還要在 upsmon.conf 中加入下列幾行, 並配合 upssched 來達到自動關機的目的:

NOTIFYCMD /usr/local/sbin/upssched
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG ONLINE SYSLOG+EXEC


2.5 修改 /usr/local/etc/nut/upssched.conf

這個 upssched.conf 可以告訴 upssched :什麼狀況啟動/停止計時器,時間到時執行哪一個檔的命令,所以在斷電後要供電多久就由這個設定檔來控制,例如我們在裡面加入:

PIPEFN /etc/uucp/upssched.pipe
CMDSCRIPT /usr/local/etc/nut/upssched-cmd
AT ONBATT * START-TIMER shutdown 300
AT ONLINE * CANCEL-TIMER shutdown

說明:

  • 第二行 當計時的時間到了就執行 CMDSCRIPT 所指定檔案中的指令
  • 第三行 當 ONBATT (停電時)就啟動名為 shutdown 的計時器,倒數 300 秒
  • 第三行 當 ONLINE (電來了)就停止名為 shutdown 的倒數計時

其它詳細的設定可以參考 :

  • /usr/local/share/doc/nut/upssched.txt
  • /usr/local/share/doc/nut/shutdown.txt

 

2.6 修改 /usr/local/etc/nut/upssched-cmd

範例

 
             #!/bin/sh
             case $1 in
             shutdown)
             echo "Power fail , start to shutdown all server ..." \
             | /usr/local/sbin/upsmon -c fsd
             ;;
             *)
             logger -t upssched-cmd "Unrecognized command: $1"
             ;;
             esac

說明:

這個檔案必須讓所有人都有 execute 的權限,執行時是以 upsmon 執行時的身份,也就是 uucp


2.7 修改 /usr/local/etc/rc.d/nut.sh.sample

2.7.1 主控 (master)

只要修改 UPS 的 driver 名稱及連接埠 (參考 ups.conf 中的設定)

配合前面的範例一 ups.conf 中的設定: APC SmartUPS (COM1),我們修改 nut.sh

UPSTYPE="apcsmart"
UPSDEV="/dev/cuaa0"

配合前面的範例二 ups.conf 中的設定:PowerCom KingPro (COM1),我們修改 nut.sh

UPSTYPE="powercom"
UPSDEV="/dev/cuaa0"

2.7.2 被控端 (slave)

slave 的 nut.sh 我們將下面這幾行 (只留 upsmon 紅色那行) 加上井字號註解掉:

${MODELS}/$UPSTYPE $UPSFLAGS $UPSDEV
${SBIN}/upsd
${SBIN}/upsmon localhost
${BIN}/upslog localhost $UPSLOG $UPSLOGINTERVAL

變成:

# ${MODELS}/$UPSTYPE $UPSFLAGS $UPSDEV
# ${SBIN}/upsd
${SBIN}/upsmon localhost
# ${BIN}/upslog localhost $UPSLOG $UPSLOGINTERVAL

讓主控端在 shutdown 後將 UPS 關閉待機, 這個動作其實在 UPS 本身偵測到電池已經快沒電時會自己做這個動作以維持基本運作, 如果想在所有機器都已經 shutdown (Master自認為哦!!) 後順便關閉UPS(不再給電)
就修改 /etc/rc.shutdown

找到 # Insert other shutdown procedures here 這行, 在它的後面加上:

#----------------------------------------------Turn off UPS
if (test -f /etc/uucp/killpower)
then
# ups="apcsmart"
ups="powercom"
port="/dev/cuaa0"
/usr/local/libexec/nut/${ups} -d 3 -k ${port}
fi
#----------------------------------------------

說明:上面的 ups 及 port 視 ups 種類及 port 自行調整 (和 ups.conf 一樣)

 



 


 基礎: 書籤 - 簡介 - 安裝 - Slices - Unix基礎 - 基本指令 - 首次登入 - 目錄架構
 系統: 核心編譯 - 系統升級 - Packages - Ports - PicoBSD - Quota
 網路: 服務管理 - WWW - FTP - MAIL - DNS - Samba - NFS - DHCP - webmin - IMP - OpenWebmail
 其它: Backup - UPS - 系統安全 - ipfw&natd - 撥接服務 - 計時制ADSL - 雜記 - FAQ

北市文山區力行國小顏國雄