Linux sysrq使用
1. 介绍
Sysrq被称为”魔术组合键”, 是内建于Linux内核的调试工具。只要内核没有完全锁住(还可以响应中断),不管内核在做什么事情,使用这些组合键都可以搜集包括系统内存使用、CPU任务处理、进程运行状态等系统运行信息。
更详细信息可以查看内核文档:Documentation/admin-guide/sysrq.rst
2. sysrq使能
使用sysrq组合键,需要在内核打开配置
CONFIG_MAGIC_SYSRQ
可以通过以下节点查看sysrq的支持情况和控制sysrq响应的命令键值
cat /proc/sys/kernel/sysrq
sysrq值说明如下:
in /proc/sys/kernel/sysrq:
0 - disable sysrq completely
1 - enable all functions of sysrq
1 - bitmask of allowed sysrq functions (see below for detailed function description):
2 - enable control of console logging level
4 - enable control of keyboard (SAK, unraw)
8 - enable debugging dumps of processes etc.
16 - enable sync command
32 - enable remount read-only
64 - enable signalling of processes (term, kill, oom-kill)
128 - allow reboot/poweroff
256 - allow nicing of all RT tasks
3. sysrq调试使用
在串口可以使用的情况下,都可以通过以下节点来实现sysrq的调试功能
echo funckey > /proc/sysrq-trigger
sysrq常用调试功能说明如下表所示:
功能键 | 功能说明 |
---|---|
b | 重启系统 |
c | 触发访问空指针 |
d | 查看锁持有情况 |
e | 向除了init进程的其他进程发送SIGTERM信号 |
f | 触发oom killer进行内存回收 |
g | 用于kgdb |
h | 展示帮助信息 |
i | 向除了init进程的其他进程发送SIGKILL信号 |
l | 打印当前online cpu的栈回溯信息 |
m | 打印当前系统的内存信息 |
o | 关机(需要系统支持) |
p | 打印当前进程的寄存器和flag |
t | 打印当前系统所有进程的栈回溯信息 |
w | 打印当前block状态(uninterruptable)的进程栈回溯信息 |
0-9 | 设置控制台loglevel |
更多信息,请看内核文档:Documentation/admin-guide/sysrq.rst。
3.1 键盘使用sysrq
在PC下,并没有串口控制台,因此很多sysrq功能都是通过键盘实现。
在sysrq的驱动实现中,会为input device注册一个sysrq功能键的处理接口,当键盘输入sysrq的功能键时,就会转发到sysrq对应的handler进行处理。
键盘触发sysrq功能键为:alt + sysrq + key,如查看系统内存信息,可以使用 alt + sysrq + m
注:SYSRQ键也就是键盘上的Print Screen键.
3.2 嵌入式设备使用sysrq
在嵌入式设备,一般console都是使用串口,串口并不是标准的input devices,因此通过键盘组合按键,是无法触发sysrq相应的功能的,串口设备,一般都是通过tty子系统注册的,如果需要支持sysrq,那需要对应的串口驱动支持才行,假设串口驱动已经支持sysrq了,如何触发呢?
从sysrq.rst文档可知,通过串口发送BREAK + command key就可以触发sysrq相应的功能了。
在使用mobaxterm当串口工具时,按如下所示即可:
在串口终端鼠标右键,选择special command—>break—> command key(如m)
如下图所示:
如果使用SecureCRT工具,则按以下步骤配置即可:
单击Mapped Keys后,进行按键映射设置,弹出如下对话框后,输入一个要映射的原始组合键,比如我这里使用“Ctrl + D”,则在按键上按下“Ctrl + D”。
在按下“Ctrl + D”后,调出最终要映射的目标键,在Function里选择“Telnet Function”,在后面选择“TN_BREAK”,点击“OK”设置完成。
设置完成后,连接上串口,就可以通过ctrl + D + command key(如m) 触发sysrq功能了,如下图所示:
3.3 串口驱动支持sysrq
在tty core层,已经支持对sysrq的处理,因此串口驱动只需要在接收中断中对接收到的sysrq字符进行特殊处理即可。
串口驱动需要定义SUPPORT_SYSRQ,如下所示:
#if defined(CONFIG_SERIAL_AMBA_PL011_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
#define SUPPORT_SYSRQ
#endif