在某次长期使用电脑后,如往常一样使用 poweroff 关机,结果在关机界面卡住了,系统在结束了桌面环境后并未切断电源,所有 tty也都不可用。

正好最近重温了 MagicSysRq 这一 Magic按键,于是我跃跃欲试的进行着操作。

以下引用 WIKI 的介绍:

Magic SysRq 组合键是一串能直接与 Linux 内核沟通的组合键,允许用户就算在系统进入死循环濒临崩溃时,直接调用系统底层将资料写入文件系统或重启,避免尚未写入文件系统与硬盘的数据在关机后消失。效果类似于电脑上的电源键或重启键,但能执行更多操作。

以下引用 LinuxKernel 文档 的介绍:

它是一个你可以输入的具有魔法般的组合键。 无论内核在做什么,内核都会响应 SysRq 键的输入,除非内核完全卡死。

简而言之就是在系统异常但 Linux内核 并未完全 死掉 的时候,与之直接通信来进行必要应急操作的神奇按键,而不会只能强制关机

就在我满怀期待地按下 Alt + PrtSc + O 期望能够关机时,发现系统毫无反应。

以为是操作不当的我又照着网上的教程进行了一波 神秘仪式,结果还是没能生效。

最后只能死心的我,还是长按了电源键进行强制关机。

之后我立即重启电脑调出了熟悉的 journalctl -rb -1 ,倒序输出上次启动后的日志,看看系统到底发生了什么。

可以看到,内核其实收到了 SysRq操作输入,只是内核操作被禁用了。

那么接下来,就是启用这一操作,避免下一次发生意外时无能为力。

判断状态

除了可以通过使用后观察内核的响应来判断,还可以使用 sudo sysctl kernel.sysrq 来输出 kernel.sysrq 内核参数的值,其值为 1 时启用,否则则被禁用。

ArchLinux 内核默认禁用 SysRq

临时启用

1
sudo sysctl -w kernel.sysrq=1

永久启用

1
echo "kernel.sysrq = 1" | sudo tee -a /etc/sysctl.d/90-enable-sysrq.conf > /dev/null

SysRq 组合键

在许多键盘上不再设有单独的 SysRq 按键,但仍可通过 Alt + PrtSc 组合键来调用 SysRq

以下摘自 LinuxKernel 文档

命令键功能
b立即重启系统,不会同步或者卸载磁盘。
c执行系统 crash,如果配置了系统 crashdump,将执行 crashdump。
d显示所有持有的锁。
e发送 SIGTERM 信号给所有进程,除了 init 进程。
f调用 oom killer 杀掉过度占用内存的进程。
gkgdb 使用(内核调试器)。
h显示帮助。
i发送 SIGKILL 给所有进程,除了 init 进程。
j强制性的 “解冻它” - 用于被 FIFREEZE ioctl 操作冻住的文件系统。
k安全访问秘钥(SAK)杀掉在当前虚拟控制台的所有程序。
l显示所有活动 cpu 的栈回溯。
m导出当前内存信息到你的控制台。
n用于使所有实时任务变成普通任务。
o关闭系统。
p导出当前寄存器和标志位到控制台。
q导出每个 cpu 上所有已装备的高精度定时器。
r关闭键盘的原始模式,设置为转换模式。
s尝试同步所有的已挂载文件系统。
t导出当前所有任务列表和它们的信息到控制台。
u尝试重新挂载已挂载文件系统为只读。
v强制恢复帧缓存控制台。
v触发 ETM 缓存导出 [ARM 架构特有]
w导出处于不可中断状态(阻塞)的任务。 在 sparc64 架构上用于显示全局的 PMU(性能监控单元)寄存器。 在 MIPS 架构上导出所有的 tlb 条目。
x在 ppc/powerpc 架构上用于 xmon 接口。
y显示全局 cpu 寄存器 [SPARC-64 架构特有]
z导出 ftrace 缓存信息
0-9设置控制台日志级别,该级别控制什么样的内核信息将被打印到你的控制台。

例如当你需要关闭系统时,可以使用 Alt + PrtSc + O 组合键来进行操作。

ArchLinux 默认启用了 0-9 b c e f i j k l m n o p q r s t u v w z 功能。

远程使用

当通过 ssh 或其他远程手段连接到目标机时,无法通过按键调用 SysRq ,此时可以通过 echo "h" | sudo tee -a /proc/sysrq-trigger 将指令写入 /proc/sysrq-trigger 来直接调用 SysRq ,并且这种做法不受 /proc/sys/kernel/sysrq 值的影响。

202403040244852.png

202403040246572.png