Linux中sysrq事件

anonymous_vhacker
anonymous_vhacker
发布于 2023-05-09 / 36 阅读
0
0

Linux中sysrq事件

功能

即时打印出内核相关的信息,或触发一些内核级别的事件,用于调试诊断内核。

触发方法

  1. 组合按键

    按下Alt+PrintScreen+[CommandKey] 其中CommandKey为具体的按键,见下面内容。

  2. 写入字符到/proc/sysrq-trigger

    例如:

    echo c > /proc/sysrq-trigger

启用的条件

在某些操作系统上,sysrq默认是禁用的,如redHat

cat /proc/sys/kernel/sysrq命令显示 1,或者sysctl kernel.sysrq命令显示 kernel.sysrq = 1则为启用状态。

若不是,则用如下命令启用:

echo 1 > /proc/sys/kernel/sysrq 或者sysctl kernel.sysrq=1

CommandKey指令类型

常用的已高亮显示。以下为机翻,准确内容请见原文:原文链接

  • b - 即时重新启动系统,

  • c - 故意让系统崩溃(在使用netdump或diskdump的时候有用),

  • d - 显示所有持有的锁,

  • e - 给除了init的所有进程发送 SIGTERM,

  • f - 调用 oom killer 杀掉一个过度占用内存的进程,如果什么任务都没杀,也不会 panic,

  • g - kgdb 使用 (内核调试器),

  • h - 显示帮助,

  • i - 给除了init的所有进程发送 SIGKILL,

  • j - 强制性的“解冻它” - 用于被 FIFREEZE ioctl 操作冻住的文件系统,

  • k - 安全访问秘钥(SAK)杀掉在当前虚拟控制台的所有程序,注意:参考下面 SAK 节重要论述,

  • l - 显示所有活动 cpu 的栈回溯,

  • m - 导出关于内存分配的信息,

  • n - 使所有实时任务变成普通任务,

  • o - 即时关机 (如果机器设置并支持此项功能),

  • p - 导出当前CPU寄存器信息和标志位的信息,

  • q - 导出每个 cpu 上所有已装备的高精度定时器(非 regular timer_list timers)和所有时钟事件设备的详细信息,

  • r - 关闭键盘的原始模式,设置为XLATE

  • s - 即时同步所有挂载的文件系统,

  • t - 导出线程状态信息,

  • u - 即时重新挂载所有的文件系统为只读,

  • v - 强制恢复帧缓存控制台,

  • w - 导出处于不可中断状态(阻塞)的任务,

  • x - 在 ppc/powerpc 架构上用于 xmon 接口。在 sparc64 架构上用于显示全局的 PMU(性能监控单元)寄存器。在 MIPS 架构上导出所有的 tlb 条目,

  • y - 显示全局 cpu 寄存器 [SPARC-64 架构特有],

  • z - 导出 ftrace 缓存信息,

  • 0-9 - 设置控制台日志级别,该级别控制什么样的内核信息将被打印到你的控制台。(比如 ``0`` ,将使得只有紧急信息,像 PANICs 或 OOPSes 才显示在控制台。)

sak(k)(安全访问秘钥)

在你尝试登陆的同时,又想确保当前控制台没有可以获取你的密码的特洛伊木马程序运行时是有用的。它会杀掉给定控制台的所有程序,这样你就可以确认当前的登陆提示程序是实际来自 init 进程的程序,而不是某些特洛伊木马程序。

案例

为了触发系统崩溃来测试看门狗,可用如下命令:

echo c > /proc/sysrq-trigger
# 直接让系统崩溃,可用于测试硬件看门狗是否有效

再此之前,要cat /proc/sys/kernel/panic_on_oops 或者sysctl kernel.panic_on_oops看一下是不是为0(0为发生opps时尝试继续,1为发生opps时立马panic),若不是,需要如下操作:

echo 0 > /proc/sys/kernel/panic_on_oops
#或者
sysctl kernel.panic_on_oops=0

但是,有时候发现即使没有启用看门狗,也会让系统崩溃一段时间后自己重启了,觉得很奇怪。原因在于:

发生了linux kernel panic之后,会在一定的时间内触发重启,这个时间的设置如下:

cat /proc/sys/kernel/panic
# 5
sysctl kernel.panic
# kernel.panic = 5

把这个时间设置的长一点,就可以测试看门狗生效与否了。例如,panic重启时间设置为120s:如果没启用看门狗,发生崩溃时需要120s才能触发重启;如过看门狗启用了且20s不喂狗就超时,那么发生了崩溃后过20s系统就会重启了。如此便可知道看门狗是否生效。

修改panic后等待重启的时间的方法:

echo 120 /proc/sys/kernel/panic
# 或者
sysctl kernel.panic=120
# 以上为临时的设置方法,重启后会回到默认,因为/proc并非真实的文件目录,而是linux的虚拟文件
# 若需永久设置:
vim /etc/sysctl.conf
文件中添加:
kernel.panic = 20


评论