Linux Magic System Request Key Hacks¶
sysrq.c 文件
什麼是 magic SysRq 鍵?¶
這是一個“神奇”的組合鍵,你可以按下它,核心會對它做出響應,而不管它正在做什麼,除非它完全鎖死了。
如何啟用 magic SysRq 鍵?¶
在配置核心時,你需要對 'Magic SysRq key (CONFIG_MAGIC_SYSRQ)' 說“yes”。當執行一個編譯了 SysRq 的核心時,/proc/sys/kernel/sysrq 控制著允許透過 SysRq 鍵呼叫的功能。該檔案中的預設值由 CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE 配置符號設定,該符號本身預設為 1。以下是 /proc/sys/kernel/sysrq 中可能的值:
0 - 完全停用 sysrq
1 - 啟用 sysrq 的所有功能
>1 - 允許的 sysrq 功能的位掩碼(有關詳細的功能說明,請參見下文)
2 = 0x2 - enable control of console logging level 4 = 0x4 - enable control of keyboard (SAK, unraw) 8 = 0x8 - enable debugging dumps of processes etc. 16 = 0x10 - enable sync command 32 = 0x20 - enable remount read-only 64 = 0x40 - enable signalling of processes (term, kill, oom-kill) 128 = 0x80 - allow reboot/poweroff 256 = 0x100 - allow nicing of all RT tasks
你可以使用以下命令設定檔案中的值
echo "number" >/proc/sys/kernel/sysrq
該數字可以以十進位制或帶有 0x 字首的十六進位制形式寫入。CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE 必須始終以十六進位制形式寫入。
請注意,/proc/sys/kernel/sysrq 的值僅影響透過鍵盤的呼叫。始終允許透過 /proc/sysrq-trigger 呼叫任何操作(由具有管理員許可權的使用者)。
如何使用 magic SysRq 鍵?¶
- 在 x86 上
你按下組合鍵 ALT-SysRq-<命令鍵>。
注意
某些鍵盤可能沒有標有“SysRq”的鍵。“SysRq”鍵也稱為“Print Screen”鍵。此外,某些鍵盤無法處理同時按下的這麼多鍵,因此您可能會更好地按下 Alt,按下 SysRq,釋放 SysRq,按下 <命令鍵>,釋放所有鍵。
- 在 SPARC 上
我相信,你按下 ALT-STOP-<命令鍵>。
- 在序列控制檯上(僅限 PC 風格的標準序列埠)
你傳送一個
BREAK,然後在 5 秒內傳送一個命令鍵。傳送兩次BREAK被解釋為正常的 BREAK。- 在 PowerPC 上
按下 ALT - Print Screen(或 F13)- <命令鍵>。Print Screen(或 F13)- <命令鍵> 可能就足夠了。
- 在其他
如果你知道其他架構的組合鍵,請提交補丁以包含在本節中。
- 在所有
向 /proc/sysrq-trigger 寫入單個字元。只處理第一個字元,字串的其餘部分將被忽略。但是,不建議寫入任何額外的字元,因為該行為未定義,並且可能會在將來的版本中發生更改。例如:
echo t > /proc/sysrq-trigger
或者,寫入以 underscore 開頭的多個字元。這樣,所有字元都將被處理。例如:
echo _reisub > /proc/sysrq-trigger
<命令鍵> 區分大小寫。
什麼是“命令”鍵?¶
命令 |
功能 |
|---|---|
|
將立即重啟系統,而無需同步或解除安裝你的磁碟。 |
|
將執行系統崩潰,如果已配置,則會進行崩潰轉儲。 |
|
顯示所有持有的鎖。 |
|
向所有程序傳送 SIGTERM,除了 init。 |
|
將呼叫 oom killer 來殺死一個記憶體佔用程序,但如果無法殺死任何東西,則不要 panic。 |
|
由 kgdb(核心偵錯程式)使用 |
|
將顯示幫助(實際上,除了此處列出的鍵之外的任何其他鍵都將顯示幫助。但 |
|
向所有程序傳送 SIGKILL,除了 init。 |
|
強制 “Just thaw it” - 透過 FIFREEZE ioctl 凍結的檔案系統。 |
|
安全訪問鍵 (SAK) 殺死當前虛擬控制檯上的所有程式。注意:請參閱下面 SAK 部分中的重要評論。 |
|
顯示所有活動 CPU 的堆疊回溯。 |
|
將當前記憶體資訊轉儲到你的控制檯。 |
|
用於使 RT 任務可以 nice |
|
將關閉你的系統(如果已配置並支援)。 |
|
將當前暫存器和標誌轉儲到你的控制檯。 |
|
將轉儲每個 CPU 的所有已啟用的 hrtimer 列表(但不是常規的 timer_list 定時器)以及有關所有 clockevent 裝置的詳細資訊。 |
|
關閉鍵盤原始模式,並將其設定為 XLATE。 |
|
將嘗試同步所有已掛載的檔案系統。 |
|
將當前任務列表及其資訊轉儲到你的控制檯。 |
|
將嘗試以只讀方式重新掛載所有已掛載的檔案系統。 |
|
強制恢復幀緩衝控制檯 |
|
導致 ETM 緩衝區轉儲 [ARM 特定] |
|
轉儲處於不可中斷(阻塞)狀態的任務。 |
|
由 ppc/powerpc 平臺上的 xmon 介面使用。在 sparc64 上顯示全域性 PMU 暫存器。在 MIPS 上轉儲所有 TLB 條目。 |
|
顯示全域性 CPU 暫存器 [SPARC-64 特定] |
|
轉儲 ftrace 緩衝區 |
|
設定控制檯日誌級別,控制哪些核心訊息將列印到你的控制檯。(例如, |
|
在控制檯上重放核心日誌訊息。 |
好的,那麼我可以用它們做什麼?¶
當你的 X 伺服器或 svgalib 程式崩潰時,unraw(r) 非常方便。
當你想要確保在控制檯上沒有木馬程式執行時,sak(k)(安全訪問鍵)非常有用,該木馬程式可能會在你嘗試登入時獲取你的密碼。它將殺死給定控制檯上的所有程式,從而讓你確保你看到的登入提示實際上是來自 init 的,而不是某些木馬程式。
重要提示
以其真實形式,它不是真正的 SAK,就像 c2 相容系統中的那樣,並且不應將其誤認為如此。
似乎其他人發現它作為(系統注意鍵)很有用,當你想要退出一個不允許你切換控制檯的程式時,它很有用。(例如,X 或 svgalib 程式。)
當你無法關閉時,reboot(b) 很好,它相當於按下“reset”按鈕。
當系統掛起時,crash(c) 可用於手動觸發崩潰轉儲。請注意,如果沒有任何可用的轉儲機制,這隻會觸發崩潰。
sync(s) 在拔出可移動介質之前或在使用不提供正常關機的救援 shell 之後很方便 - 它將確保你的資料安全地寫入磁碟。請注意,直到你在螢幕上看到 “OK” 和 “Done” 出現,同步才完成。
umount(u) 可用於將檔案系統標記為已正確解除安裝。從執行系統的角度來看,它們將以只讀方式重新掛載。直到你在螢幕上看到 “OK” 和 “Done” 訊息出現,重新掛載才完成。
當你的控制檯被你不希望看到的核心訊息淹沒時,日誌級別 0-9 很有用。選擇 0 將阻止除最緊急的核心訊息之外的所有訊息到達你的控制檯。(如果 syslogd/klogd 處於活動狀態,它們仍然會被記錄。)
如果你有一些你無法以任何其他方式殺死的失控程序,特別是如果它正在生成其他程序,則 term(e) 和 kill(i) 很有用。
如果你的系統由於透過 FIFREEZE ioctl 凍結(可能是根)檔案系統而變得無響應,“just thaw it(j)” 很有用。
當系統掛起或者你無法使用 dmesg 命令檢視 printk 緩衝區中的訊息時,Replay logs(R) 可用於檢視核心日誌訊息。如果控制檯系統繁忙,使用者可能需要多次按下組合鍵。如果它完全鎖死,則不會列印訊息。輸出訊息取決於當前的控制檯日誌級別,可以使用 sysrq[0-9] 修改(參見上文)。
有時在使用 SysRq 後它似乎會“卡住”,我該怎麼辦?¶
發生這種情況時,嘗試在鍵盤的兩側輕敲 shift、alt 和 control,然後再次按下無效的 sysrq 序列。(即,類似於 alt-sysrq-z)。
切換到另一個虛擬控制檯 (ALT+Fn) 然後再切換回來也應該有所幫助。
我按下了 SysRq,但似乎沒有任何反應,怎麼回事?¶
有些鍵盤為 SysRq 生成的鍵碼與預定義的值 99 不同(請參閱 include/uapi/linux/input-event-codes.h 中的 KEY_SYSRQ),或者根本沒有 SysRq 鍵。在這些情況下,執行 showkey -s 以找到適當的掃描碼序列,並使用 setkeycodes <sequence> 99 將此序列對映到通常的 SysRq 程式碼(例如,setkeycodes e05b 99)。最好將此命令放在啟動指令碼中。順便說一句,你不輸入任何內容十秒鐘即可退出 showkey。
我想向模組新增 SysRQ 鍵事件,它是如何工作的?¶
為了在表中註冊一個基本函式,你必須首先包含標頭檔案 include/linux/sysrq.h,這將定義你需要的其他一切。接下來,你必須建立一個 sysrq_key_op 結構,並填充 A) 你將使用的鍵處理程式函式,B) 一個 help_msg 字串,當 SysRQ 列印幫助時將列印該字串,以及 C) 一個 action_msg 字串,將在呼叫你的處理程式之前立即列印該字串。你的處理程式必須符合“sysrq.h”中的原型。
建立 sysrq_key_op 之後,你可以呼叫核心函式 register_sysrq_key(int key, const struct sysrq_key_op *op_p);,如果表鍵“key”中的該槽位為空白,這將註冊由 op_p 指向的操作。在模組解除安裝時,你必須呼叫函式 unregister_sysrq_key(int key, const struct sysrq_key_op *op_p),這將從鍵“key”中刪除由 “op_p” 指向的鍵操作,僅當它當前已在該槽位中註冊時。這是為了防止自你註冊以來該槽位已被覆蓋。
Magic SysRQ 系統透過針對鍵操作查詢表註冊鍵操作來工作,該表在 “drivers/tty/sysrq.c” 中定義。此鍵表在編譯時已註冊了許多操作,但它是可變的,並且匯出了 2 個函式用於與其互動。
register_sysrq_key and unregister_sysrq_key.
當然,永遠不要在表中留下無效的指標。也就是說,當呼叫 register_sysrq_key() 的模組退出時,它必須呼叫 unregister_sysrq_key() 來清理它使用的 sysrq 鍵表條目。表中的空指標始終是安全的。 :)
如果由於某種原因,你覺得需要從 handle_sysrq 呼叫的函式中呼叫 handle_sysrq 函式,你必須意識到你處於鎖中(你也在中斷處理程式中,這意味著不要睡眠!),因此你必須呼叫 __handle_sysrq_nolock 代替。
當我按下 SysRq 鍵組合時,控制檯上只出現標題?¶
Sysrq 輸出受到與所有其他控制檯輸出相同的控制檯日誌級別控制。這意味著,如果核心像發行版核心上常見的那樣“quiet”啟動,即使它將出現在 dmesg 緩衝區中,並且可以透過 dmesg 命令訪問以及 /proc/kmsg 的消費者訪問,輸出也可能不會出現在實際控制檯上。作為一個特定的例外,來自 sysrq 命令的標題行會像當前日誌級別最高一樣傳遞給所有控制檯消費者。如果僅發出標題,則幾乎可以肯定核心日誌級別太低。如果你需要在控制檯通道上輸出,那麼你需要使用 alt-sysrq-8 暫時提高控制檯日誌級別或
echo 8 > /proc/sysrq-trigger
請記住在觸發你感興趣的 sysrq 命令後將日誌級別恢復正常。
我有更多問題,我可以問誰?¶
- 只需在 linux-kernel 郵件列表中提問
致謝¶
由 Mydraal <vulpyne@vulpyne.net> 編寫
由 Adam Sulmicki <adam@cfar.umd.edu> 更新
由 Jeremy M. Dolan <jmd@turbogeek.org> 於 2001/01/28 10:15:59 新增
由 Crutcher Dunnavant <crutcher+kernel@datastacks.com> 新增到