1. 程式人生 > >Linux中的SysRq魔術鍵

Linux中的SysRq魔術鍵

1. SysRq介紹
我第一次接觸到SysRq是由於硬體同事除錯時突然發現串列埠列印了HELP資訊,還以為軟體出問題了,我就去了解了一下SysRq。而我真正用上SysRq是為了破解一個禁止了所有命令的系統……(很有幫助哈哈)。

SysRq是Linux提供的一個“Magic System Request Key”,它可以在系統出現故障的時候協助恢復和除錯系統。只要你的虛擬終端或串列埠還可以接收鍵盤輸入(系統還能響應鍵盤的按鍵中斷),SysRq就可用,你可以藉助它來檢視當時的記憶體、程序狀態等資訊,而不是直接強行拔掉電源重啟系統。

SysRq能做的事情看HELP就知道了:

[16037.132214] SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) 
kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) 
show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) 
unraw(r) sync(s) show-task-states(t) unmount(u) show-blocked-tasks(w) dump-ftrace-buffer(z)
1
2
3
4
2. SysRq的用法
2.1 啟用SysRq
首先要確保核心打開了CONFIG_MAGIC_SYSRQ配置項,這樣SysRq的底層處理才可用。 
另外核心中有一個巨集定義SYSRQ_DEFAULT_ENABLE,表示系統預設情況下是否啟用SysRq功能鍵。當然,不管這個值是不是yes,你都可以通過proc檔案系統來開啟或關閉SysRq鍵: 
檢視當前SysRq是否被開啟(0表示關閉):

# cat /proc/sys/kernel/sysrq
1
1
2
開啟SysRq:

# echo 1 > /proc/sys/kernel/sysrq
1
也可以使用sysctl命令:

# sysctl -w kernel.sysrq=1
kernel.sysrq = 1
1
2
實際上sysctl這條命令就是通過修改/proc/sys/kernel/sysrq來生效的。可以把“kernel.sysrq = 1”設定到/etc/sysctl.conf中,使SysRq在下次系統重啟仍生效。

上面說0表示完全關閉SysRq,1表示使能SysRq的所有功能,還可以設定成其他數字來選擇開啟部分功能,可參考核心裡的Documentation/sysrq.txt。 
SysRq支援的所有功能列表及相應的handler見drivers/tty/sysrq.c中靜態陣列sysrq_key_table[]的定義,當然,也可以通過下面提到的SysRq的help資訊瞭解到。

2.2 使用SysRq
我們可以直接通過按鍵的方式或者通過寫/proc/sysrq-trigger的方式來觸發SysRq的操作。SysRq支援的操作可參考下面的HELP輸出:

# echo > /proc/sysrq-trigger
[16037.132214] SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) show-blocked-tasks(w) dump-ftrace-buffer(z)
1
2
即, “SysRq鍵+一個字母” 來觸發一個操作,例如 SysRq + t 列印所有任務的狀態。

那麼如何產生一個SysRq鍵呢?

在Ubuntu下,圖形介面環境不能使用SysRq,需進入文字虛擬終端環境(Ctrl+Alt+F1從圖形桌面切換到虛擬終端,Alt+F7可切回來),然後同時按下Alt和Print Screen鍵以及相應的字母鍵。
在嵌入式裝置上,通過串列埠工具也可以觸發SysRq,如果使用SecureCRT,則同時按下Alt和Print Screen鍵,會出現上述HELP,然後緊接著按下某個字母。如果使用teraTerm,則點選選單中的Control->Send Break,會出現上述HELP,然後緊接著按下某個字母。
也可以不通過按鍵,而是寫/proc/sysrq-trigger的方式,用法形如:

echo c > /proc/sysrq-trigger
1
即,向sysrq-trigger寫入相應的字母即可。並且,無論/proc/sys/kernel/sysrq是什麼值,這種方式都是可用的。

3. SysRq有什麼用
從上述HELP資訊就能看出來SysRq都能幹什麼,在Documentation/sysrq.txt中也有詳細介紹。例如,在系統卡住或出現其他異常但還沒完全死掉(沒有panic或觸發watchdog)時,可以人為地製造OOM或panic,看看當前核心在幹什麼。下面這篇文章對SysRq的使用場景有較全面的介紹和舉例,貼在這裡供參考: 
https://www.ibm.com/developerworks/cn/linux/l-cn-sysrq/

我上面提到了sysrq的handlers定義的程式碼位置,如果需要,你甚至可以新增自定義的操作。
--------------------- 
作者:落塵紛擾 
來源:CSDN 
原文:https://blog.csdn.net/jasonchen_gbd/article/details/79080576 
版權宣告:本文為博主原創文章,轉載請附上博文連結!