在某次长期使用电脑后,如往常一样使用 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
。
临时启用
|
|
永久启用
|
|
SysRq 组合键
在许多键盘上不再设有单独的 SysRq
按键,但仍可通过 Alt + PrtSc
组合键来调用 SysRq
。
以下摘自 LinuxKernel 文档
命令键 | 功能 |
---|---|
b | 立即重启系统,不会同步或者卸载磁盘。 |
c | 执行系统 crash,如果配置了系统 crashdump,将执行 crashdump。 |
d | 显示所有持有的锁。 |
e | 发送 SIGTERM 信号给所有进程,除了 init 进程。 |
f | 调用 oom killer 杀掉过度占用内存的进程。 |
g | kgdb 使用(内核调试器)。 |
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
值的影响。
...