~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_TW/admin-guide/sysrq.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 .. include:: ../disclaimer-zh_TW.rst
  2 
  3 :Original: Documentation/admin-guide/sysrq.rst
  4 
  5 :翻譯:
  6 
  7  黃軍華 Junhua Huang <huang.junhua@zte.com.cn>
  8 
  9 :校譯:
 10 
 11  司延騰 Yanteng Si <siyanteng@loongson.cn>
 12 
 13 .. _tw_admin-guide_sysrq:
 14 
 15 Linux 魔法系統請求鍵駭客
 16 ========================
 17 
 18 針對 sysrq.c 的文檔說明
 19 
 20 什麼是魔法 SysRq 鍵?
 21 ~~~~~~~~~~~~~~~~~~~~~
 22 
 23 它是一個你可以輸入的具有魔法般的組合鍵。
 24 無論內核在做什麼,內核都會響應 SysRq 鍵的輸入,除非內核完全卡死。
 25 
 26 如何使能魔法 SysRq 鍵?
 27 ~~~~~~~~~~~~~~~~~~~~~~~
 28 
 29 在配置內核時,我們需要設置 'Magic SysRq key (CONFIG_MAGIC_SYSRQ)' 爲 'Y'。
 30 當運行一個編譯進 sysrq 功能的內核時,/proc/sys/kernel/sysrq 控制着被
 31 SysRq 鍵調用的功能許可。這個文件的默認值由 CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE
 32 配置符號設定,文件本身默認設置爲 1。以下是 /proc/sys/kernel/sysrq 中可能的
 33 值列表:
 34 
 35    -  0 - 完全不使能 SysRq 鍵
 36    -  1 - 使能 SysRq 鍵的全部功能
 37    - >1 - 對於允許的 SysRq 鍵功能的比特掩碼(參見下面更詳細的功能描述)::
 38 
 39           2 =   0x2 - 使能對控制檯日誌記錄級別的控制
 40           4 =   0x4 - 使能對鍵盤的控制 (SAK, unraw)
 41           8 =   0x8 - 使能對進程的調試導出等
 42          16 =  0x10 - 使能同步命令
 43          32 =  0x20 - 使能重新掛載只讀
 44          64 =  0x40 - 使能對進程的信號操作 (term, kill, oom-kill)
 45         128 =  0x80 - 允許重啓、斷電
 46         256 = 0x100 - 允許讓所有實時任務變普通任務
 47 
 48 你可以通過如下命令把值設置到這個文件中::
 49 
 50     echo "number" >/proc/sys/kernel/sysrq
 51 
 52 這裏被寫入的 number 可以是 10 進制數,或者是帶着 0x 前綴的 16 進制數。
 53 CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE 必須是以 16 進制數寫入。
 54 
 55 注意,``/proc/sys/kernel/sysrq`` 的值隻影響通過鍵盤觸發 SySRq 的調用,對於
 56 通過 ``/proc/sysrq-trigger`` 的任何操作調用都是允許的
 57 (通過具有系統權限的用戶)。
 58 
 59 如何使用魔法 SysRq 鍵?
 60 ~~~~~~~~~~~~~~~~~~~~~~~
 61 
 62 在 x86 架構上
 63         你可以按下鍵盤組合鍵 :kbd:`ALT-SysRq-<command key>`。
 64 
 65         .. note::
 66            一些鍵盤可能沒有標識 'SySRq' 鍵。'SySRq' 鍵也被當做 'Print Screen'鍵。
 67            同時有些鍵盤無法處理同時按下這麼多鍵,因此你可以先按下鍵盤 :kbd:`Alt` 鍵,
 68            然後按下鍵盤 :kbd:`SysRq` 鍵,再釋放鍵盤 :kbd:`SysRq` 鍵,之後按下鍵盤上命令鍵
 69            :kbd:`<command key>`,最後釋放所有鍵。
 70 
 71 在 SPARC 架構上
 72         你可以按下鍵盤組合鍵 :kbd:`ALT-STOP-<command key>` 。
 73 
 74 在串行控制檯(只針對 PC 類型的標準串口)
 75         你可以發一個 ``BREAK`` ,然後在 5 秒內發送一個命令鍵,
 76         發送 ``BREAK`` 兩次將被翻譯爲一個正常的 BREAK 操作。
 77 
 78 在 PowerPC 架構上
 79         按下鍵盤組合鍵 :kbd:`ALT - Print Screen` (或者 :kbd:`F13`) - :kbd:`<命令鍵>` 。
 80         :kbd:`Print Screen` (或者 :kbd:`F13`) - :kbd:`<命令鍵>` 或許也能實現。
 81 
 82 在其他架構上
 83         如果你知道其他架構的組合鍵,請告訴我,我可以把它們添加到這部分。
 84 
 85 在所有架構上
 86         寫一個字符到 /proc/sysrq-trigger 文件,例如::
 87 
 88                 echo t > /proc/sysrq-trigger
 89 
 90 這個命令鍵 :kbd:`<command key>` 是區分大小寫的。
 91 
 92 什麼是命令鍵?
 93 ~~~~~~~~~~~~~~
 94 
 95 =========== ================================================================
 96 命令鍵           功能
 97 =========== ================================================================
 98 ``b``       將立即重啓系統,不會同步或者卸載磁盤。
 99 
100 ``c``       將執行系統 crash,如果配置了系統 crashdump,將執行 crashdump。
101 
102 ``d``       顯示所有持有的鎖。
103 
104 ``e``       發送 SIGTERM 信號給所有進程,除了 init 進程。
105 
106 ``f``       將調用 oom killer 殺掉一個過度佔用內存的進程,如果什麼任務都沒殺,
107             也不會 panic。
108 
109 ``g``       kgdb 使用(內核調試器)。
110 
111 ``h``       將會顯示幫助。(實際上除了這裏列舉的鍵,其他的都將顯示幫助,
112             但是 ``h`` 容易記住):-)
113 
114 ``i``       發送 SIGKILL 給所有進程,除了 init 進程。
115 
116 ``j``       強制性的 “解凍它” - 用於被 FIFREEZE ioctl 操作凍住的文件系統。
117 
118 ``k``       安全訪問祕鑰(SAK)殺掉在當前虛擬控制檯的所有程序,注意:參考
119             下面 SAK 節重要論述。
120 
121 ``l``       顯示所有活動 cpu 的棧回溯。
122 
123 ``m``       將導出當前內存信息到你的控制檯。
124 
125 ``n``       用於使所有實時任務變成普通任務。
126 
127 ``o``       將關閉系統(如果配置和支持的話)。
128 
129 ``p``       將導出當前寄存器和標誌位到控制檯。
130 
131 ``q``       將導出每個 cpu 上所有已裝備的高精度定時器(不是完整的
132             time_list 文件顯示的 timers)和所有時鐘事件設備的詳細信息。
133 
134 ``r``       關閉鍵盤的原始模式,設置爲轉換模式。
135 
136 ``s``       將嘗試同步所有的已掛載文件系統。
137 
138 ``t``       將導出當前所有任務列表和它們的信息到控制檯。
139 
140 ``u``       將嘗試重新掛載已掛載文件系統爲只讀。
141 
142 ``v``       強制恢復幀緩存控制檯。
143 ``v``       觸發 ETM 緩存導出 [ARM 架構特有]
144 
145 ``w``       導出處於不可中斷狀態(阻塞)的任務。
146 
147 ``x``       在 ppc/powerpc 架構上用於 xmon 接口。
148             在 sparc64 架構上用於顯示全局的 PMU(性能監控單元)寄存器。
149             在 MIPS 架構上導出所有的 tlb 條目。
150 
151 ``y``       顯示全局 cpu 寄存器 [SPARC-64 架構特有]
152 
153 ``z``       導出 ftrace 緩存信息
154 
155 ``0``-``9`` 設置控制檯日誌級別,該級別控制什麼樣的內核信息將被打印到你的
156             控制檯。(比如 ``0`` ,將使得只有緊急信息,像 PANICs or OOPSes
157             才能到你的控制檯。)
158 =========== ================================================================
159 
160 好了,我能用他們做什麼呢?
161 ~~~~~~~~~~~~~~~~~~~~~~~~~~
162 
163 嗯,當你的 X 服務端或者 svgalib 程序崩潰,unraw(r) 非原始模式命令鍵是非常
164 方便的。
165 
166 sak(k)(安全訪問祕鑰)在你嘗試登陸的同時,又想確保當前控制檯沒有可以獲取你的
167 密碼的特洛伊木馬程序運行時是有用的。它會殺掉給定控制檯的所有程序,這樣你
168 就可以確認當前的登陸提示程序是實際來自 init 進程的程序,而不是某些特洛伊
169 木馬程序。
170 
171 .. important::
172 
173    在其實際的形式中,在兼容 C2 安全標準的系統上,它不是一個真正的 SAK,
174    它也不應該誤認爲此。
175 
176 似乎其他人發現其可以作爲(系統終端聯機鍵)當你想退出一個程序,
177 同時不會讓你切換控制檯的方法。(比如,X 服務端或者 svgalib 程序)
178 
179 ``reboot(b)`` 是個好方法,當你不能關閉機器時,它等同於按下"復位"按鈕。
180 
181 ``crash(c)`` 可以用於手動觸發一個 crashdump,當系統卡住時。
182 注意當 crashdump 機制不可用時,這個只是觸發一個內核 crash。
183 
184 ``sync(s)`` 在拔掉可移動介質之前,或者在使用不提供優雅關機的
185 救援 shell 之後很方便 -- 它將確保你的數據被安全地寫入磁盤。注意,在你看到
186 屏幕上出現 "OK" 和 "Done" 之前,同步還沒有發生。
187 
188 ``umount(u)`` 可以用來標記文件系統正常卸載,從正在運行的系統角度來看,它們將
189 被重新掛載爲只讀。這個重新掛載動作直到你看到 "OK" 和 "Done" 信息出現在屏幕上
190 纔算完成。
191 
192 日誌級別 ``0`` - ``9`` 用於當你的控制檯被大量的內核信息衝擊,你不想看見的時候。
193 選擇 ``0`` 將禁止除了最緊急的內核信息外的所有的內核信息輸出到控制檯。(但是如果
194 syslogd/klogd 進程是運行的,它們仍將被記錄。)
195 
196 ``term(e)`` 和 ``kill(i)`` 用於當你有些有點失控的進程,你無法通過其他方式殺掉
197 它們的時候,特別是它正在創建其他進程。
198 
199 "just thaw ``it(j)`` " 用於當你的系統由於一個 FIFREEZE ioctl 調用而產生的文件
200 系統凍結,而導致的不響應時。
201 
202 有的時候 SysRq 鍵在使用它之後,看起來像是“卡住”了,我能做些什麼?
203 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
204 
205 這也會發生在我這,我發現輕敲鍵盤兩側的 shift、alt 和 control 鍵,然後再次敲擊
206 一個無效的 SysRq 鍵序列可以解決問題。(比如,像鍵盤組合鍵 :kbd:`alt-sysrq-z` )
207 切換到另一個虛擬控制檯(鍵盤操作 :kbd:`ALT+Fn` ),然後再切回來應該也有幫助。
208 
209 我敲擊了 SysRq 鍵,但像是什麼都沒發生,發生了什麼錯誤?
210 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
211 
212 有一些鍵盤對於 SysRq 鍵設置了不同的鍵值,而不是提前定義的 99
213 (查看在 ``include/uapi/linux/input-event-codes.h`` 文件中 ``KEY_SYSRQ`` 的定義)
214 或者就根本沒有 SysRq 鍵。在這些場景下,執行 ``showkey -s`` 命令來找到一個合適
215 的掃描碼序列,然後使用 ``setkeycodes <sequence> 99`` 命令映射這個序列值到通用
216 的 SysRq 鍵編碼上(比如 ``setkeycodes e05b 99`` )。最好將這個命令放在啓動腳本
217 中。
218 哦,順便說一句,你十秒鐘不輸入任何東西就將退出 “showkey”。
219 
220 我想添加一個 SysRq 鍵事件到一個模塊中,如何去做呢?
221 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
222 
223 爲了註冊一個基礎函數到這個表中,首先你必須包含 ``include/linux/sysrq.h`` 頭
224 文件,這個頭文件定義了你所需要的所有東西。然後你必須創建一個 ``sysrq_key_op``
225 結構體,然後初始化它,使用如下內容,A) 你將使用的這個鍵的處理函數, B) 一個
226 help_msg 字符串,在 SysRq 鍵打印幫助信息時將打印出來,C) 一個 action_msg 字
227 符串,就在你的處理函數調用前打印出來。你的處理函數必須符合在 'sysrq.h' 文件中
228 的函數原型。
229 
230 在 ``sysrq_key_op`` 結構體被創建後,你可以調用內核函數
231 ``register_sysrq_key(int key, const struct sysrq_key_op *op_p);``,
232 該函數在表中的 'key' 對應位置內容是空的情況下,將通過 ``op_p`` 指針註冊這個操作
233 函數到表中 'key' 對應位置上。在模塊卸載的時候,你必須調用
234 ``unregister_sysrq_key(int key, const struct sysrq_key_op *op_p)`` 函數,該函數
235 只有在當前該鍵對應的處理函數被註冊到了 'key' 對應位置時,纔會移除 'op_p' 指針
236 對應的鍵值操作函數。這是爲了防止在你註冊之後,該位置被改寫的情況。
237 
238 魔法 SysRq 鍵系統的工作原理是將鍵對應操作函數註冊到鍵的操作查找表,
239 該表定義在 'drivers/tty/sysrq.c' 文件中。
240 該鍵表有許多在編譯時候就註冊進去的操作函數,但是是可變的。
241 並且有兩個函數作爲操作該表的接口被導出::
242 
243         register_sysrq_key 和 unregister_sysrq_key.
244 
245 當然,永遠不要在表中留下無效指針,即,當你的模塊存在調用 register_sysrq_key()
246 函數,它一定要調用 unregister_sysrq_key() 來清除它使用過的 SysRq 鍵表條目。
247 表中的空指針是安全的。:)
248 
249 如果對於某種原因,在 handle_sysrq 調用的處理函數中,你認爲有必要調用
250 handle_sysrq 函數時,你必須意識到當前你處於一個鎖中(你同時也處於一箇中斷處理
251 函數中,這意味着不能睡眠)。所以這時你必須使用 ``__handle_sysrq_nolock`` 替代。
252 
253 當我敲擊一個 SysRq 組合鍵時,只有標題打印出現在控制檯?
254 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
255 
256 SysRq 鍵的輸出和所有其他控制檯輸出一樣,受制於控制檯日誌級別控制。
257 這意味着,如果內核以發行版內核中常見的 "quiet" 方式啓動,則輸出可能不會出現在實際
258 的控制檯上,即使它會出現在 dmesg 緩存中,也可以通過 dmesg 命令和 ``/proc/kmsg``
259 文件的消費訪問到。作爲一個特例,來自 sysrq 命令的標題行將被傳遞給所有控制檯
260 使用者,就好像當前日誌級別是最大的一樣。如果只發出標題頭,則幾乎可以肯定內核日誌
261 級別太低。如果你需要控制檯上的輸出,那麼你將需要臨時提高控制檯日誌級別,通過使用
262 鍵盤組合鍵 :kbd:`alt-sysrq-8` 或者::
263 
264     echo 8 > /proc/sysrq-trigger
265 
266 在觸發了你感興趣的 SysRq 鍵命令後,記得恢復日誌級別到正常情況。
267 
268 我有很多問題時,可以請教誰?
269 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
270 
271 請教在內核郵件列表上的人,郵箱:
272         linux-kernel@vger.kernel.org
273 
274 致謝
275 ~~~~
276 
277 - Mydraal <vulpyne@vulpyne.net> 撰寫了該文件
278 - Adam Sulmicki <adam@cfar.umd.edu> 進行了更新
279 - Jeremy M. Dolan <jmd@turbogeek.org> 在 2001/01/28 10:15:59 進行了更新
280 - Crutcher Dunnavant <crutcher+kernel@datastacks.com> 添加鍵註冊部分
281 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php