|
到底有哪一台 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
語法說明:
備註:有刪除線的部份為舊版的語法。
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 一樣)
北市文山區力行國小顏國雄
|