SBC 當機自救!為他開啟 Watchdog 吧!

你是否有用 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

如果沒有什麼錯誤的話應該會顯示如下畫面

SBC 當機自救!為他開啟 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

Written by J
雖然大學唸的是生物,但持著興趣與熱情自學,畢業後轉戰硬體工程師,與宅宅工程師們一起過著沒日沒夜的生活,做著台灣最薄的 intel 筆電,要與 macbook air 比拼。 離開後,憑著一股傻勁與朋友創業,再度轉戰軟體工程師,一手扛起前後端、雙平台 app 開發,過程中雖跌跌撞撞,卻也累計不少經驗。 可惜不是那 1% 的成功人士,於是加入其他成功人士的新創公司,專職開發後端。沒想到卻在採前人坑的過程中,拓寬了眼界,得到了深層的領悟。