Linux kernel

Linux Kernel 對於系統發生kernel panic 自動重啟之原理

一般來說, 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()

2016-05-12_202655.png

2. emergency_restart() 位於 kernel/reboot.c 中. 裡面會呼叫 machine_emergency_restart()

2016-05-12_203358.png

3. machine_emergency_restart() 位於 include/asm-generic/emergency-restart.h. 裡面會呼叫 machine_restart()

2016-05-12_203601.png

4. machine_restart 位於每個arch所屬的reboot.c 中. 以ARM為例, 位於arch/arm/kernel/reboot.c.   arm_pm_restart  function pointer 會指向 mdesc->restart 並進行重開機的動作.

2016-05-12_203802.png

此種kernel.panic reboot 方法, 對於週邊IO/, 程式死掉或許ok, 但若是 memory 或者 CPU 死掉, 則有機會扔無法執行.

個人的想法是, 最可靠的設計還是使用外部watchdog 元件. (別用 SoC 內部watchdog)

 

 

發表迴響