kdumpでカーネルクラッシュ時にクラッシュダンプを取得する方法がありました。
今回はカーネルクラッシュはしないけど、何らかの原因でLinuxがフリーズした場合に対処するMagic SysRq keyの設定です。
What is the SysRq Facility and how do I use it?
https://access.redhat.com/articles/231663
※RHNアカウントでログインしないと全文読めません。
- SysRq keyの有効
- SysRq keyの無効
RHELではセキュリティの観点からデフォルトは無効とのことです。
1 |
# echo 1 > /proc/sys/kernel/sysrq |
または
1 |
# sysctl -w kernel.sysrq=1 |
起動時に有効
1 2 3 |
# vi /etc/sysctl.conf # cat /etc/sysctl.conf kernel.sysrq = 1 |
1 |
# echo 0 > /proc/sys/kernel/sysrq |
または
1 |
# sysctl -w kernel.sysrq=0 |
CentOS 7(kernel 3.10.0-957.10.1.el7.x86_64)で検証しましたが、デフォルトは”16″でした。
1 2 |
# cat /proc/sys/kernel/sysrq 16 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# man 5 proc (snip) /proc/sys/kernel/sysrq このファイルは、SysRqキーにより起動が許可されている関数群を制御するものである。 デフォルトでは、ファイルの内容は 1 であり、これは起こり得る全ての SysRqリクエ ストが許可されることを意味する(古いバージョンのカーネルでは、SysRqはデフォルト では無効になっており、実行時に明示的に有効にする必要があったが、今はそうではない)。 このファイルで指定可能な値は以下の通り。 0 - sysrq を完全に無効にする 1 - sysrq の全ての関数を有効にする >1 - 許可する sysrq 関数のビットマスク。内訳は以下の通り。 2 - コンソールのログ・レベルの制御を有効にする 4 - キーボードの制御を有効にする (SAK, unraw) 8 - プロセスなどのデバッグ・ダンプを有効にする 16 - sync コマンドを有効にする 32 - 読み出し専用での再マウントを有効にする 64 - プロセスへのシグナル発行を有効にする (term, kill, oom-kill) 128 - リブート/電源オフを許可する 256 - 全てのリアルタイム・タスクの nice 値の変更を許可する |
- SysRqイベントを送る方法
下記のコンビネーションキーでカーネルにシグナルを送信することができます。
Alt+PrintScreen+[CommandKey]
CommandKeyは下記になります。
m – dump information about memory allocation
t – dump thread state information
p – dump current CPU registers and flags
c – intentionally crash the system (kernel panic). Useful for capturing a vmcore through kdump.
s – immediately sync all mounted filesystems
u – immediately remount all filesystems read-only
b – immediately reboot the machine
o – immediately power off the machine (if configured and supported)
f – start the Out Of Memory Killer (OOM)
w – dumps tasks that are in uninterruptable (blocked) state – [Introduced with kernel 2.6.32]
例えばAlt+PrintScreen+cで意図的にカーネルクラッシュを引き起こしてkdump経由でクラッシュダンプを生成します。
またキー入力が有効なら下記のコマンドで同様のことができます。
1 |
# echo 'm' > /proc/sysrq-trigger |
SysRqでシグナルを送信されるとその結果はカーネルのリングバッファとシステムコンソールに出力され、さらにsyslog経由で/var/log/messagesに記録されます。
ただ、カーネル応答が無い場合にはsyslogが動作していない可能性が高いので、そうなるとシステムコンソールで確認するしか無いです。