一般來說, Embedded device 都會內建 hardware watchdog (不管是位於 SoC 內部抑或是外部元件), 讓系統即使出現問題, 也能夠讓系統重啟而不至於整台hang住.
但其實Linux kernel 對於發生 kernel panic 這種異常現象已經有相對應的處理, 讓系統在沒有hardware watchdog的前提下, 即使發生 kernel panic , 也能夠被自動重啟.
使用方法:
方法1. 在系統中直接對 “/proc/sys/kernel/panic" 進行設定. 預設為0, 也就是不會自動重啟系統
ex: 設定 kernel panic 5 秒後重啟系統.
echo 5 > /proc/sys/kernel/panic
但此方法需每次開機後都進行設定. 我們可以寫在 rc.local 或者是 systemd 的 service中讓開機自動執行.
方法2. 編輯 /etc/sysctl.conf, 在裡面設定 kernel.panic = 5. 之後開機即自動設定完成
實作的原理如下 (以 ARM 硬體平台 & Kernel 4.1 為例) :
1. 在 kernel/panic.c 中 void panic(const char *fmt, …) 可以看到, 觸發 panic 後, 會檢查 panic_timeout 是否為 0 . panic_timeout 也就是前面輸入 /proc/sys/kernel/panic 的值. 若不會0, 則會開始計算時間. 等時間到再執行 emergency_restart()
2. emergency_restart() 位於 kernel/reboot.c 中. 裡面會呼叫 machine_emergency_restart()
3. machine_emergency_restart() 位於 include/asm-generic/emergency-restart.h. 裡面會呼叫 machine_restart()
4. machine_restart 位於每個arch所屬的reboot.c 中. 以ARM為例, 位於arch/arm/kernel/reboot.c. arm_pm_restart function pointer 會指向 mdesc->restart 並進行重開機的動作.
—
此種kernel.panic reboot 方法, 對於週邊IO/, 程式死掉或許ok, 但若是 memory 或者 CPU 死掉, 則有機會扔無法執行.
個人的想法是, 最可靠的設計還是使用外部watchdog 元件. (別用 SoC 內部watchdog)