条件
通常需要有一个可操作的串行控制台,并能将其输出存储到一个文件中。文本格式比图像更受欢迎。如果图像是唯一的方式,如果可能的话,请使用OCR软件将其内容转换为文本。只有在内核日志信息没有被存储到磁盘的情况下才需要串行控制台,例如由于rsyslogd没有运行,或者journald只是将日志记录到内存而不是磁盘上。
如何使用SysRq组合键
触发的动作取决于SysRq组合键中使用的命令键。对调试最有用的命令键是。
- "t "将系统中每个进程的堆栈跟踪打印到内核日志中。这个输出允许人们看到所有进程在那一刻在做什么。在一个繁忙的、完全启动的系统中,输出可能有数万行之多。
- "l "将当前运行在CPU上的所有进程的堆栈痕迹打印到内核日志中。
- "w"(AZERTY键盘上的 "z")将所有在不间断睡眠中被阻塞的进程的堆栈痕迹打印到内核日志中。这个命令键是用来调试I/O问题的。输出结果应该比 "t "命令键短得多,因为不是所有进程都被打印出来。
- "m" ("," on AZERTY) 将当前的内存信息打印到内核日志中。如果怀疑有一个与内存有关的问题,这很有用。
- "c" - 将崩溃系统。如果kdump被启用,内核转储将被存储。
当获得调试数据时,最好反复发送命令键(除了 "c"),命令键之间至少间隔几秒钟。这样,就可以捕捉到系统在不同时间点的状态。
还有一些命令键用于以尽可能小的影响重新启动机器。
- "r" - 关闭键盘原始模式,并将其设置为XLATE。
- "s" - 将尝试同步所有安装的文件系统。这减少了数据丢失的机会。
- "e" - 向所有进程发送一个SIGTERM,除了init。
- "i" - 向所有进程发送一个SIGKILL,除了init。
- "u" - 将尝试重新挂载所有挂载的文件系统为只读。
- "b" - 将立即重启你的系统(不同步或卸载你的磁盘)。
有一个记忆法可以记住上述命令键的顺序:Raising Skinny Elephants Is Utterly Boring.
不同连接方式下触发SysRq
台式机(x86架构)
如果PS2或USB键盘连接到机器上,通过按下Alt键和Print Screen/SysRq键以及一个命令键来向内核发送SysRq组合键,例如Alt-SysRq-m来获取内存信息。
使用SSH的服务器。
用ssh登录到机器上。要向内核发送SysRq密钥,只需以root身份将命令密钥写入/proc/sysrq-trigger中。例如:
# echo m > /proc/sysrq-trigger # echo w > /proc/sysrq-trigger # echo l > /proc/sysrq-trigger
Copy
只使用串行控制台的服务器。
当系统开始出现问题时,往往需要借助于串行控制台。/proc/sysrq-trigger文件可以用来发送SysRq键,以防仍然可以登录系统。否则,Sysrq键也可以通过串行线发送,方法是在5秒内发送一个break,然后再发送一个命令键。
注意:你的终端类型将定义如何 "发送break",例如:在ipmitool中,break字符是"~B"(tilde后面是大写的B)
Azure
在Azure上,SysRq键可以从虚拟机的串行控制台的GUI界面发送。要进入控制台,在Azure门户上的机器菜单中选择 "支持+故障排除/串行控制台"。控制台的顶部栏有一个用于发送SysRq密钥的工具。
使用SysRq组合键修复抖动问题
- 同时按键盘上的Ctrl + Alt + Fn键。
- 用另一只手按SysRq键。如果你的键盘上没有SysRq标签,请按Prtscn键。
- 释放Ctrl + Alt + Fn键,同时仍按住SysRq键。
- 按照这个顺序按以下键。R,E,I,S,U,B。
- 松开所有的键。
这样做之后,等待几秒钟,你的机器就会停止抖动。上述的组合键在你的系统上执行了以下任务。
- R:将键盘切换到Raw模式。
- E:向除init以外的所有进程发送SIGTERM信号。这个信号负责指定进程的终止。
- I:向除init以外的所有进程发送SIGKILL信号。
- S: 同步当前挂载在系统上的所有文件系统。
- U: 以只读模式重新挂载文件系统。
- B: 重新启动系统。
修复无反应的Linux系统
当内存不足时,一些特定的进程会使计算机的工作陷入瓶颈。在这样的情况下,SysRq组合键可能会派上用场。另外,你也可以重启系统,立即杀死可能导致该问题的进程。但这并不是一个可行的选择。
你也可以使用ps命令监控你的Linux系统上的运行进程。该命令将输出诸如进程ID、按CPU分配给进程的时间、当前的TTY外壳等信息。