這裡介紹如何使用鍵盤上的 SysRq 鍵,讓當機的 Linux 重新開機安全地重新開機。

Linux 系統雖然穩定性高,但是難免還是會有當機的狀況,如果遇到系統整個當掉,不論是從本機或是從遠端 SSH 都無法登入,但是鍵盤上的數字鍵盤鎖還有反應,這樣的狀況除了按電腦的 reset 按鈕強制重新開機之外,其實還可以使用 SysRq 鍵來挽救或是正常重新開機,這種方式可以確保硬碟上的資料不會因為不正常斷電而損毀。

SysRq 鍵是什麼?

一般的鍵盤上面都有一個 SysRq(system request)鍵,這個按鍵的位置就在 F12 的右邊,跟 PrtSc(print screen)鍵合在一起。

sysrq-keyboard-1

SysRq 鍵

SysRq 鍵俗稱 magic SysRq key,使用者可以靠這個鍵送出一些指令給 Linux 核心,除非整個系統完全當機,否則不管當時系統正在處理麼工作,藉由這樣的管道送出指令都可以讓 Linux 系統馬上回應,對於系統的救援相當有幫助。

啟用 SysRq

若要在 Linux 系統上使用 SysRq 鍵,前提是在 Linux 核心編譯時必須啟用 CONFIG_MAGIC_SYSRQ 選項。

在使用有支援 SysRq 鍵的 Linux 核心時,系統對於 SysRq 鍵的啟用狀態是紀錄在 /proc/sys/kernel/sysrq 中,以下是一些可能的數值與其意義。

數值 說明
0 完全停用 SysRq 鍵的所有功能。
1 啟用 SysRq 鍵的所有功能。
大於 1 的數值 以位元遮罩(bit mask)設定個別的功能,請參考下表。

下表是各個位元所代表的意義:

十進位數值 十六進位數值 說明
2 0x2 允許控制 console logging level。
4 0x4 允許鍵盤控制(SAK、unraw)。
8 0x8 允許行程的 debugging dumps。
16 0x10 允許同步(sync)所有掛載磁碟的寫入。
32 0x20 允許以唯讀(read-only)方式重新掛載所有磁碟。
64 0x40 允許對行程送出訊號,如 termkilloom_kill
128 0x80 允許重新開機或關機。
256 0x100 允許重設所有高優先順序(real-time)行程的 nice 設定值。

使用者可以使用 cat 來查看目前系統的設定:

cat /proc/sys/kernel/sysrq
176

這個值是十進位的數字,我們必須先將這個數字轉為二進位的表示法,才能看出目前的設定值:

echo "obase=2; 176" | bc
10110000

這樣就可以看出來 176 = 0x10 + 0x20 + 0x80,所以目前的設定是允許同步磁碟寫入、唯讀重新掛載磁碟與重新開機或關機。

若要更改設定,則可以使用 echo 直接更改 /proc/sys/kernel/sysrq 的數值,例如若要啟用 SysRq 鍵所有的功能,則執行:

sudo echo "1" >/proc/sys/kernel/sysrq

在指定數值時,也可以使用十六進位的形式指定,例如 0x10

/proc/sys/kernel/sysrq 的數值只會控制鍵盤上 SysRq 鍵的作用,另外還有一種方式是透過 /proc/sysrq-trigger 來啟動,而這種方式則是在任何情況都可以使用,不受 /proc/sys/kernel/sysrq 數值的影響。例如強制關機可以使用:

sudo echo o > /proc/sysrq-trigger

使用 SysRq

大部分鍵盤的 SysRq 鍵跟 PrtSc(print screen)鍵是同一個,而 SysRq 鍵的使用方式為:Alt + SysRq + 指令鍵,不同的指令鍵有不同的作用,下表是幾個比較常用的指令鍵。

指令鍵 說明
r 將鍵盤解除 raw 模式(unraw)。
e 送出 SIGTERM 訊號至系統上所有的行程,讓所有正在執行中的程式正常關閉。
i 送出 SIGKILL 訊號至系統上所有的行程,強制所有正在執行中的程式立即關閉。
s 同步(sync)所有掛載磁碟的寫入,讓資料實際寫入實體磁碟。
u 以唯讀(read-only)方式重新掛載所有磁碟。
b 立即重新啟動系統(此動作並不會將資料同步寫入至硬碟,也不會讓硬碟卸載)。
n 重設所有高優先順序(real-time)行程的 nice 設定值。
f 呼叫 oom_kill 中止使用大量記憶體的行程。
o 將電腦直接關機。
k 中止目前 virtual console 下的所有程式(Secure Access Key,SAK)。

完整的指令鍵說明請參考 Linux Kernel 官方網站的文件

在系統安全性上,Secure Access Key(SAK)是一項很好用的功能,它可以在登入系統之前將所有目前終端機下的所有程式清除,確保登入的程式是直接從 init 衍生出來的,沒有任何的特洛伊木馬程式在終端機上執行,避免在登入時帳號與密碼被特洛伊木馬程式竊取。

X Window 當機處理

如果 Linux 的桌面當機時,可以嘗試以下兩個方式來處理:

Alt + SysRq + r
讓鍵盤解除 raw 模式,從 X server 取回鍵盤掌控權,接著就可以使用 Ctrl + Alt + F1 的方式切換到其他的 console 下,然後使用指令重新啟動 X Window。
Alt + SysRq + k
中止目前 virtual console 下的所有程式,包含整個 X Window。另外也可以嘗試使用 Ctrl + Alt + Backspace 來關閉 X Window(但這個方式不見得在每一個 X server 都可以使用)。

安全重新開機

在一般 Linux 當機的狀況下,若要重新啟動系統,可以按住 Alt + SysRq 兩個鍵,然後依序按下以下幾個指令鍵:

r e i s u b

這些按鍵的意義都整理在上面的指令鍵表格中,依照這樣的順序可以盡可能促使所有的程式正常關閉、資料同步寫入磁碟之後,再重新啟動 Linux 系統,而在依照順序按下這些指令鍵時,每按完一個按鍵請等待幾秒鐘後,再繼續按下一個,讓電腦有時間處理每個動作。

參考資料:HTGIBM Developer WorksThe Geek Stuff