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
Logo

更多推荐