這裡介紹如何使用鍵盤上的 SysRq
鍵,讓當機的 Linux 重新開機安全地重新開機。
Linux 系統雖然穩定性高,但是難免還是會有當機的狀況,如果遇到系統整個當掉,不論是從本機或是從遠端 SSH 都無法登入,但是鍵盤上的數字鍵盤鎖還有反應,這樣的狀況除了按電腦的 reset 按鈕強制重新開機之外,其實還可以使用 SysRq 鍵來挽救或是正常重新開機,這種方式可以確保硬碟上的資料不會因為不正常斷電而損毀。
SysRq
鍵是什麼?
一般的鍵盤上面都有一個 SysRq
(system request)鍵,這個按鍵的位置就在 F12
的右邊,跟 PrtSc
(print screen)鍵合在一起。
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 |
允許對行程送出訊號,如 term 、kill 與 oom_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 官方網站的文件。
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 系統,而在依照順序按下這些指令鍵時,每按完一個按鍵請等待幾秒鐘後,再繼續按下一個,讓電腦有時間處理每個動作。
參考資料:HTG、IBM Developer Works、The Geek Stuff