你是否有用 Raspberry pi 在家架設伺服器,但常常當機需要手動重開時,偏偏人都是在外面呢?這邊分享如何使用硬體的 Watchdog 來幫你監控 Raspberry pi 的狀態,如果當機就可以從硬體層面觸發重開機!
自建伺服器並不像託管在雲端,如果機器當掉只要簡單在 web console 點一下重啟即可,必需親自到機器前面拔掉電源重啟。如果無法立刻回家重啟,就會有很長的停機時間!這邊以手上 banana pi m2 的 H3 SoC 有內建硬體 Watchdog 為例,Raspberry pi 也可以用一樣的方法開啟。
原理解釋
Watchdog 概念其實很簡單,想像地上有一個水桶正在接水,旁邊有一隻狗幫你盯著看,只要一分鐘就會把水裝滿。如果水滿了你沒有幫忙倒掉,狗就會狂吠,直接暴力的把水桶踢倒,讓水全部流出,必須重新放置水桶,讓他繼續接水。為了避免每次都要重新放置,所以你也在旁邊看著,定時每三十秒打開水桶旁的小孔讓水流出,這樣就可以避免水滿的現象發生。
換作是 SoC 的概念也是一樣,他有一個倒數計時器,所以必須要有程式定期去清計時器,只要一分鐘後發現還是沒人來清,他就認為 SoC 當掉了,強制硬體重開機以恢復正常。原理就這麼簡單!
安裝 Watchdog
只需要在 console 下這個指令即可
sudo apt install watchdog
設定 Watchdog
編輯 watchdog.conf 如下
sudo nano /etc/watchdog.conf
max-load-5 = 18
max-load-15 = 12
watchdog-device = /dev/watchdog
realtime = no
watchdog-timeout = 15
參數解釋
max-load-xxx
根據官方文件,這兩個是在設定 每五分鐘 和 每十五分鐘 允許的最大平均 loading,超過就重啟。主要是避免程式掛掉一直吃 CPU 時使用。這兩個參數可以依需求決定是否要開啟,這是屬於軟體層面的 watchdog。
watchdog-device
告訴 watchdog 程式,watchdog 硬體掛載的路徑
watchdog-timeout
這個在官方文件上沒有寫得很清楚,會設定這個參數是因為一開始遇到這個問題
cannot set timeout 60 (errno = 22 = 'Invalid argument')
估狗後發現這裡說加上 watchdog-timeout = 15 即可解。
realtime
文件上是說,如果設定為 yes,會把 watchdog lock into memory。在預設是 yes 的時候會發現這個問題
cannot set scheduler (errno = 1 = 'Operation not permitted')
後來在這裡找到,看起來和 realtime 相關設定有關,於是把它設定為 no 即可解。
啟動 Watchdog
sudo systemctl start watchdog
查看 watchdog 狀態
sudo systemctl status watchdog
如果沒有什麼錯誤的話應該會顯示如下畫面
測試 Watchdog 是否有效
在 console 輸入這道指令,沒多久後就會當機,測試我們的 watchdog 是否有正常運作
:(){ :|:& };:
按下 enter 會立刻當掉,等候六十秒,如果能自動重開,表示設定完成!不用再擔心人不在的時候當機該怎麼辦了!
延伸閱讀:
十分鐘架設自己的 VPN server
0元用 Raspberry pi 架設自己的 WordPress 網站 #1 Armbian Docker
參考資料
watchdog error: cannot set timeout 60 (errno = 22 = ‘Invalid argument’)
Bug 805397 – watchdog cann’t set the realtime scheduler