中文 UPS Howto: 自己動手指南

Next Previous Contents

## 5. 自己動手指南

這裏的討論是針對單調模式的 UPS 控制而寫就的。然而， 大部分的過程對單調的 UPS 與聰明的 UPS 幾乎是一樣的。最大的不同在於 UPS 監控程式 (基本上是 `powerd`) 如何與 UPS 溝通。

在開始之前，我建議以下的工作流程:

- 略讀這篇文件。
- 下載並審查所有看起來特別適合您的 UPS 的軟體。
- 下載並審查所有更一般化的軟體。請注意有些較一般化的軟體事實上更為強大、 有更好的說明文件、且比起那些較特殊的軟體更容易使用。
- 如果您依然無法讓 UPS 工作，或是您的方向依舊不清楚， 請您仔細閱讀本文，並試試做 hack 的工作 ....

## 5.1 您所需的工作 (總結)

- 將您的電腦接上 UPS 。
- 用特殊的訊號纜線將您的電腦的的串列阜與 UPS 連接在一起。
- 在您的電腦上跑 `powerd` (或其他類似的軟體) 。
- 設定您的 `init` 程式使它能在 powerfail 及 powerok 事件發生時做適當的處理 (例如分別啟動 `shutdown` 程序及停止正在執行的 `shutdown` 程序)。

## 5.2 這應該是做什麼工作的?

UPS 的工作

  當電力消失時， UPS 持續供應電腦所需的電力， 並以送出重置訊號或是在它的控制阜上打開連接訊號以通知電腦電力消失了。

訊號纜線的工作

  訊號纜線是設計為當 UPS 送出重置訊號時，會使得特殊的序列阜控制接腳 (基本上是 `DCD`) 出現高電位。

Powerd 的工作

  `powerd` 程式負責監視序列阜。它保持著 UPS 所需而升高 / 降低序列阜控制接腳的高 / 低電位 (基本上， `DTR` 接腳必須保持在高電位且關閉 UPS 的接腳必須保持在低電位) 。當 `powerd` 發覺控制接腳變成高電位，它會在 `/etc/powerfail` 檔中寫入 `FAIL` 這個字並送 `SIGPWR` 訊號給 `init` 行程。 當控制接腳再次變回低電位時，它會在 `/etc/powerfail` 檔中寫入 `OK` 這個字並送 `SIGPWR` 訊號給 `init` 。

Init 的工作 (除上述之外它負責所有的工作)

  當它接到了 `SIGPWR` 訊號，它會檢查 `/etc/powerfail` 檔。 如果裏頭是 `FAIL` 這個字眼它會執行 `/etc/inittab` 檔中 `powerfail` 那一行的指令。如果裏頭是 `OK` 這個字它則執行 `inittab` 檔中 `powerokwait` 那一行的指令。

## 5.3 如何設定好所有的工作

以下我們假設您有一條可以和 `powerd` 正常工作的訊號纜線。 如果您不確定您的訊號纜線是否可以工作 (或它如何工作)，請參考 訊號纜線反向分析及修改 power.c 一節，那兒有關於少見的訊號纜線處理及重新設定 `powerd.c` 的資訊。 訊號纜線反向分析及修改 power.c<@ref>serial-port序列阜接腳的指定 及 訊號纜線反向分析及修改 power.c<@ref>serial-port序列阜接腳的指定<@ref>ioctl有關讀寫 RS232 這兩節也將對您有幫助。

如果您需要製作一條訊號纜線，請見 如何製作訊號纜線 的詳細說明，以及 如何製作訊號纜線<@ref>ups-specificUPS 資料節選 一節中有關您的 UPS 的小節。 後者可能也包含了製造商所提供的訊號纜線的相關資訊。 或許您應至少將 如何製作訊號纜線<@ref>ups-specificUPS 資料節選<@ref>ups-specificUPS 資料節選 中所有的小節瀏覽過一遍，因為每一小節都會有一些額外的一般性資料能對您有幫助。

- 修改 `/etc/inittab` 檔。寫入像以下的內容:

      # What to do when power fails (Halt system & drain battery :):
      pf::powerfail:/etc/powerfailscript +5

      # If power is back before shutdown, cancel the running shutdown.
      pg:0123456:powerokwait:/etc/powerokscript

- 寫 `/etc/powerfailscript` 及 `/etc/powerokscript` 這兩個 script 檔分別在五分鐘 (或其他您喜歡的時間) 之內進行關機及停止任何存在的 `shutdown` 程序。 依您所用的 `shutdown` 程式版本的不同， 它可能會相當單簡以至於您根本不需使用 script 檔，或者是一行 `bash` 的 script 檔像是以下這一行:

          kill `ps -aux | grep "shutdown" | grep -v grep | awk '{print $2}'`

  (為了避免您弄錯，上一行中第一個單引號是反向單引號，第二及第三個是單引號， 而最後一個則為反向單引號。)
- 用以下的命令告訴 `init` 重新讀取 `inittab` 檔中的設定:

          telinit q

- 編諿 rc.local 檔在開機時執行 `powerd` 。其語法如下:

          powerd <line>

  其中，請您自行將 `<line>` 這個字替換成 modem 所連接的序列阜名，像是 `/dev/cua1`。
- 將電腦的序列阜與 UPS 的訊號纜線相連。請先不要將電腦的電源直接接到 UPS 上。
- 將一個光源 (如燈泡) 接到 UPS 上。
- 執行 `powerd`。
- 依照以下的步驟進行測試:
  - 拔掉 UPS 的插頭。
    - 檢查該燈泡是否仍然亮著。
    - 檢查 `/etc/powerfailscript` 是否已開始執行。
    - 檢查 `shutdown` 是否正在執行。
  - 接回 UPS 的插頭。
    - 檢查該燈泡是否仍然亮著。
    - 檢查 `/etc/powerokscript` 是否已開始執行。
    - 檢查 `/etc/powerfailscript` 是否已停止執行。
    - 檢查 `shutdown` 是否已停止執行。
  - 再次拔掉 UPS 的插頭。放著不去管它並確定電腦在一段時間後 可以正常關機。
  - 危險步驟。 在所有的步驟看起來都正常之後， 將電腦電源關閉並將電腦的電源接到 UPS 上。請執行一個 script 大約每秒鐘做一次 sync 硬碟資料回存的動作，同時也跑另一個 script 持續以 find 指令搜尋整顆硬碟。其中第一個 script 是為了確保安全，而第二個則是助長電力的消耗。現在，將 UPS 的插頭拔出，再次檢查 `shutdown` 是否已在運作，並等待一段時間。 確定電腦在 UPS 的電力用完前完全地關機。此一步驟是很危險的， 因為如果 UPS 的電力在電腦完成關機之前先用完了， 您的檔案系統將會受損，且您將可能丟失一些檔案。 您可能在進行這項測試之前會想要備份您所有的檔案， 並將開始關機的時間設短一點以開始這項測試。

恭喜您! 您的 Linux 系統現在已在 UPS 的保護下， 且它將會在電力耗盡之前安全地關機了。

## 5.4 進一步的改善

- 修改 `powerd.c` 使它在監視 UPS 的訊號線時能得知電池電力已弱。 當電力微弱時，馬上進行緊急關機程序。
- 修改關機程序使它在 `powerfail` 情況下關機時， 能夠在完成所有工作之後將 UPS 關掉。

Next Previous Contents