1. 程式人生 > >每日一小時linux(1)--sysRq

每日一小時linux(1)--sysRq

tps 如何 發揮 lan pin 只需要 存在 一次 無需

參考https://www.ibm.com/developerworks/cn/linux/l-cn-sysrq/index.html

SysRq 是什麽

你是否遇到服務器不能通過 SSH 登錄,也不能通過本地終端登錄,但是卻能 ping 通,數字鍵盤鎖還可以響應擊鍵操作的情況?在這種情況下,你除了按下電源或復位鍵之外,還做過什麽嗎?你是否想過這種情況是可能恢復的呢?你是否想過收集更多的信息來定位這次系統掛起的原因呢?上述情況,可稱之為“可中斷的系統掛起”。換句話來講,系統因為某種原因已經停止對大部分正常服務的響應,但是系統仍然可以響應鍵盤的按鍵中斷請求。在這種情況下,一組稱為 SysRq 的按鍵組合將發揮它的神奇作用。

SysRq 經常被稱為 Magic System Request,它被定義為一系列按鍵組合。之所以說它神奇,是因為它在系統掛起,大多數服務已無法響應的情況下,還能通過按鍵組合來完成一系列預先定義的系統操作。通過它,不但可以在保證磁盤數據安全的情況下重啟一臺掛起的服務器,避免數據丟失和重啟後長時間的文件系統檢查,還可以收集包括系統內存使用,CPU 任務處理,進程運行狀態等系統運行信息,甚至還可能在無需重啟的情況下挽回一臺已經停止響應的服務器。

啟用 SysRq

要啟用 SysRq 功能,首先必須確保內核已經加入 CONFIG_MAGIC_SYSRQ 支持。在現今 Linux 發行版中,無一例外的均已加入該功能的支持,驗證如下:

linux-yloiDX:/var/run # grep "SYSRQ" /boot/config-3.10.0-514.44.5.10_33.x86_64
CONFIG_MAGIC_SYSRQ=y
linux-yloiDX:/var/run # grep "SYSRQ" /boot/config-`uname -r`
CONFIG_MAGIC_SYSRQ=y

通過 sysctl 啟用

SysRq 功能默認在 RHEL5u2 上是禁用的。可以通過 proc 文件系統來啟用它。使用 sysctl 命令啟用它,並通過 /proc 來檢查其可用性。

linux-yloiDX:/var/run # cat /proc/sys/kernel/sysrq
0 linux-yloiDX:/var/run # sysctl -w kernel.sysrq=1 kernel.sysrq = 1 linux-yloiDX:/var/run # cat /proc/sys/kernel/sysrq 1

kernel.sysrq 還可接受除 0 和 1 以外的啟用參數,詳情請參考 sysrq 內核文檔。

保持重啟後生效

通過把” kernel.sysrq = 1 ”設置到 /etc/sysctl.conf 中,可以使 SysRq 在下次系統重啟後仍然生效。請註意,在非 RHEL 系統中,也許需要通過其它的配置文件來使之重啟後生效,如/usr/lib/sysctl.d/50-default.conf

使用 SysRq

網上有道題,問在只有 shell,init、halt、shutdown 等命令都不工作的情況下如何重啟系統。答案就是 SysRq,通過 SysRq – B 來完成系統的重啟。

早期的 SysRq 只支持鍵盤操作。要使用 SysRq,必須直接對主機進行鍵盤操作。要想執行 SysRq-B 來重啟系統,只能通過直接鍵盤操作 Alt – SysRq – B 來完成(這裏的 B 僅指 B 按鍵,不區分大小寫)。 kernel 2.5.64 上的一個 patch 增加了 /proc/sysrq-trigger 接口,使得用戶可能通過 /proc 接口來進行 SysRq 操作,換而言之,在現今大部分構建在 2.6 內核上的發行版,對主機鍵盤的物理接觸已經不再是 SysRq 的必要條件。用戶只需要登錄到系統上,就可以直接使用 echo “ b ” > /proc/sysrq-trigger 來重啟系統。在下文中,為描述的簡潔,SysRq-<?> 均代表 Alt-SysRq-<?> 或者 echo “ ? ” > /proc/sysrq-trigger 。

眾所周知,系統掛起的很多時候 ssh 登錄也未必響應,在缺乏對主機物理操作條件下,/proc/sysrq-trigger 也因為無法獲取登錄 shell 而無法操作。於是出現了一個名為 sysrqd 的開源項目,它允許通過網絡來直接來觸發 SysRq 。該程序只有 300 行左右代碼,監聽 TCP 端口 4094,通過自定義密碼驗證過後,即可對 /proc/sysrq-trigger 進行操作。但是由於此程序在用戶空間實現,在系統掛起時該程序的可用性,以及其安全性均受到廣泛質疑。其實如果這個服務做到內核空間,以類似響應 ARP 形式進行處理,再加上合理的認證方式,或許在大多數系統掛起的時候可以起到更加實際的作用。當然,在現代服務器的遠程管理模塊日趨先進的前提下,是否能通過網絡來觸發 SysRq 好像並不是那麽重要。

SysRq 功能鍵組合

安全重啟系統

到目前為止,我們可見到的大多數 SysRq 推薦用法都是系統掛起後的安全重啟,用此方法來避免數據丟失。這個 SysRq 序列是 R-E-I-S-U-B 。要知道,該序列早在 SysRq 首次於 Linux 實現的 2.1.43 內核中就存在了。它基本等價於 reboot 命令,會依次停止系統上運行的進程,回寫磁盤緩沖區,再安全的重啟系統。需要註意的是,E 會向除 init 以外所有進程發送可捕獲的 SIGTERM 信號,這就意味著程序可能需要一定時間來進行結束進程前的善後處理,視系統負載和任務數量,這個時間可能會達到幾十秒。 I 發送的是不可捕獲的 SIGKILL 信號,相對而言沒有更多的延遲。同時,S 和 U 這兩個動作均與磁盤相關。當系統具有一定負載時,這兩個動作均不會立即完成,而是需要一定的時間,通常為幾秒鐘。所以,R-E-I-S-U-B 這個序列的推薦使用方式是:R – 1 秒 – E – 30 秒 – I – 10 秒 – S – 5 秒 – U – 5 秒 – B,而不是一氣呵成地按下這六個鍵,試想一次正常的 reboot 命令也不是在一瞬間完成的吧。

echo c > /proc/sysrq-trigger

‘c‘ 是預定義的SysRq功能之一,觸發Crashdump,產生kernel panic

每日一小時linux(1)--sysRq