如何从 root shell 触发 SysRq 事件
如果我们在机器上有一个 root shell(并且系统的响应足以让我们这样做),我们还可以将命令键字符写入 /proc/sysrq-trigger 文件。
当我们不在系统控制台上或者从脚本触发它时,这对于触发此信息很有用。
# echo 'm' > /proc/sysrq-trigger
即使将 kernel.sysrq 设置为 0,此方法也有另外的好处。
如何启用 SysRq
SysRq 键可以通过设置“Magic SysRq”来激活。
我们必须确保 sysctl.conf 中的 kernel.sysrq 设置正确:
kernel.sysrq = 1 (SysRq turned ON) kernel.sysrq = 0 (SysRq turned OFF)
注意:在 CentOS/RHEL 7 上,我们应该将更改更改为“/usr/lib/sysctl.d/50-default.conf”
上述设置确保系统启动后默认启用 SysRq(在 CentOS/RHEL 中默认禁用)。
要启用它,请立即在当前会话中运行,使用以下命令:
# echo 1 > /proc/sys/kernel/sysrq
并再次禁用它:
# echo 0 > /proc/sys/kernel/sysrq
注意:由于启用 SysRq 可为具有物理控制台访问权限的人提供另外能力,因此建议在不排除故障或者确保物理控制台访问得到适当保护时禁用它。
SysRq 事件的类型
一旦启用 SysRq 工具,就可以触发多个 SysRq 事件。
这些在内核版本之间有所不同,但有一些是常用的:
按键 | 作用 |
---|---|
m | 转储有关内存分配的信息 |
t | 转储线程状态信息 |
p | 转储当前 CPU 寄存器和标志 |
c | 故意使系统崩溃(内核panic)。 用于通过 kdump 捕获 vmcore。 |
s | 立即同步所有挂载的文件系统 |
u | 立即重新挂载所有只读文件系统 |
b | 立即重启机器 |
o | 立即关闭机器电源(如果已配置和支持) |
f | 启动内存不足杀手 (OOM) |
w | 转储处于不可中断(阻塞)状态的任务 |
什么是 SysRq 实用程序
如果内核冻结或者/和挂起,我们可以使用“magic” SysRq 工具。
'magic' SysRq 键允许即时访问几个基本的内核命令,包括同步、卸载、终止进程、showMem、showPc 和 reBoot。
根据 Linux 内核文档:
如何触发 SysRq 事件
有多种方法可以触发 SysRq 事件。
在大多数架构上,SysRq 事件可以通过以下组合键从控制台触发:
Alt+PrintScreen+[CommandKey]
PrintScreen 是在大多数 Linux 系统中用作 SysRq 键的键。
要访问无响应系统,请按 Alt+SysRq 和 H 以获取选项列表。
不同的内核版本可能有不同的选项。
要获取当前内核支持的选项,我们可以以 root 身份运行以下命令:
# echo h > /proc/sysrq-trigger
并检查 dmesg 输出。
以下是 RHEL 7 系统上的示例:
# dmesg [ 4338.124035] SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) dump-ftrace-buffer(z)