The Linux Magic SysRq key 是一个内核级别的功能,允许你直接向内核发送底层命令,即使系统已经冻结。你可以把它看作一个内置的应急机制,在正常进程无法响应时发挥作用。

它可以保存数据、干净地重启一个冻结的系统,或者诊断问题。但它也可能带来安全风险。

什么是 Magic SysRq key

通过检查 /proc/sys/kernel/sysrq 文件的值来控制哪些功能被启用。

Magic SysRq key 是内置于内核的。根据官方 Linux kernel documentation,它被描述为一个“神奇的键组合,你可以用它来让内核执行一些操作,无论它在做什么,前提是内核本身仍然在编译时启用了该功能。”

它依赖于特定的内核键码。在大多数现代键盘上,这个键是 drivers/tty/sysrq.c。

这个名字来源于 SysRq(系统请求)键,通常与 Print Screen 键共用。

当你按下这个组合键时,内核会执行低级别的命令,绕过所有进程和中断。这种功能在内核编译时通过 CONFIG_MAGIC_SYSRQ 配置选项启用。

它不是什么

Magic SysRq key 不是一个常规的键盘快捷键,也不是一个可以修复任何问题的调试工具。它是内核代码,只有在被触发时才会运行。

为什么存在这个功能

系统崩溃时有发生。软件会锁死。内核会恐慌。正常的关机方式可能无法工作。

在这种情况下,你有几个选择:

  1. 按住电源按钮强制关机(可能丢失数据)
  2. 等待系统自行恢复(通常不会)
  3. 使用 Magic SysRq 优雅地关机(可以保存你的数据)

这个功能是在内核开发早期加入的,用于系统管理员调试和内核恐慌恢复。

如何触发 Magic SysRq 命令

基本模式是:按住修饰键,然后按一个命令字母。

在大多数 x86 系统上:

  • 按住 Alt + SysRq(或 Print Screen)
  • 在按住的同时,按一个命令字母

在部分笔记本电脑上:

  • 按住 Alt + Fn + SysRq
  • 然后按命令字母

示例: 要干净地重启,按住 Alt + SysRq 并按 b。

内核文档特别指出:许多键盘无法同时处理多个按键。如果发生这种情况,试试:按 Alt,按 SysRq,松开 SysRq,按命令键,然后松开所有键。

重要提示: 命令键是 区分大小写 的。内核文档明确说明了这一点。例如,小写 r 和大写 Print Screen 是两个完全不同的命令。所有 SysRq 命令都是 小写 的。这在通过 /proc/sysrq-trigger 直接写入时尤其重要。

最有用的 SysRq 命令

下面列出了许多命令。最常用的命令如下。所有都是小写:

1. r - 将键盘模式从 XLATE(原始)恢复

X 和 Wayland 可能会将键盘置于原始模式,独占输入。此命令将其恢复正常的内核处理。

2. e - 向所有进程发送 SIGTERM(除 init/PID 1 外)

要求进程优雅地关闭。

3. i - 向所有进程发送 SIGKILL(除 init/PID 1 外)

强制进程立即关闭。

4. s - 同步所有挂载的文件系统

将缓存的数据写入磁盘。内核文档提示:等待直到“OK”和“Done”信息出现在控制台上。

5. u - 以只读方式重新挂载文件系统

在关机前保护数据。同样,等待“OK”和“Done”。

6. b - 立即重启

不进行同步或卸载。这相当于在未同步的情况下按下电源按钮。

  1. R - 关闭系统(如果硬件支持安全关机)

8. f - 调用 OOM 杀手

杀死最占内存的进程。如果没有什么可以杀死的,内核可能会恐慌。

9. h - 显示内核日志帮助

列出所有可用的 SysRq 命令。

REISUB 序列:安全重启冻结系统

当系统完全冻结时,使用这个序列来安全关机。每个字母代表一个命令:

  • r - 恢复键盘模式(原始)并让内核处理下一个键
  • e - 优雅地终止所有进程(SIGTERM)
  • i - 杀死任何剩余进程(SIGKILL)
  • s - 将数据同步到磁盘并等待磁盘活动稳定
  • u - 以只读方式重新挂载文件系统
  • b - 重启

按住 Alt + SysRq 持续。依次按每个字母,每个字母之间间隔 1–2 秒。给每个步骤时间来完成。

两个助记符来帮助记住 REISUB:

  • “重启即使系统彻底坏掉”
  • “举起大象是如此极其无聊”

两者都映射到相同的字母序列。用你觉得好记的那个。

关于现代文件系统的一个说明:

Btrfs、ZFS 和 xfs 等写时复制文件系统被引入后,REISUB 最初是为了防止文件系统损坏而设计的。对于这些文件系统,s 和 u 步骤仍然有助于将未写入的数据刷新到磁盘,但它们的必要性不如在 ext4、btrfs 或 xfs 上那么关键。实际上,运行 s 和 u 后再 b 仍然是一个很好的安全做法。

检查 SysRq 是否启用

Magic SysRq 必须在内核中通过 CONFIG_MAGIC_SYSRQ 配置启用,这是所有主流发行版的默认设置。默认值是 CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE,对应内核文档中的 /etc/sysctl.d/10-magic-sysrq.conf。

以下是如何检查当前在你的系统上激活了什么:

cat /proc/sys/kernel/sysrq

这个数字显示的是哪些功能被启用。根据内核文档:

  • 0 = 完全禁用
  • 1 = 所有命令启用
  • >1 = 位掩码允许的功能

常见的位掩码值有:

按发行版默认值分类:

  • Ubuntu:176(16+32+128 — 同步、卸载、重启)—— 确切值可能不同;检查 /etc/sysctl.d/10-magic-sysrq.conf 你自己的系统
  • Debian:438(2+4+16+32+128+256)

关于 systemd 的一个说明:

在 systemd 管理的发行版(主要是 Arch Linux 和衍生版)上,systemd 将此值设置为 0x10(十进制 16) 作为默认值,这仅启用同步命令并禁用信号处理和重启。如果你的系统是 systemd 管理的,并且 REISUB 不能完全工作,这很可能是原因。

要临时启用所有命令:

echo 1 | sudo tee /proc/sys/kernel/sysrq

要使其永久生效,创建一个 drop-in 配置文件:

# /etc/sysctl.d/99-sysrq.conf
kernel.sysrq = 1

然后重新加载:

sudo sysctl --system

推荐阅读:


何时实际使用 REISUB 功能

使用 Magic SysRq 当:

  • 你的桌面完全冻结,没有任何响应
  • SSH 连接已死,无法正常恢复
  • 一个进程锁死了整个系统
  • 你需要干净地重启,但正常的关机方式无效
  • 你正在调试内核恐慌

不要使用它当:

  • 正常的关机命令仍然有效
  • 你只是遇到了一个不兼容的慢速系统
  • 应用程序正在响应,即使很慢
  • 你还没有检查 Ctrl+Alt+F2 来查看文本控制台是否有响应
  • 问题是一个用户空间程序(杀死它更合适)

试试这些温和的替代方案。使用 SysRq 作为最后的手段,在电源按钮之前。

安全影响和风险

任何拥有物理键盘访问权限的人都可以使用 Magic SysRq。如果启用,他们可以:

  • 立即重启机器
  • 杀死所有正在运行的进程
  • 通过调试命令访问内存内容
  • 触发一个崩溃

Linux 内核文档特别指出:“没有‘合理的’编译器优化会使 magic SysRq 键成为一个无效的调试工具。”

在多用户生产环境上: 考虑将位掩码值限制为 176(仅同步 + 卸载 + 重启)。这会禁用可能暴露内存内容的调试命令。

在个人笔记本电脑上: 完全访问(值 1)通常是可接受的。物理键盘访问已经是一个显著的安全边界。

警告: 在公共可访问系统上启用所有 SysRq 命令是一个安全风险。攻击者如果拥有物理访问权限,可以崩溃你的系统、杀死进程,或者通过调试命令读取内存内容。在服务器上使用一个限制性的位掩码。

一个重要的技术细节: /proc/sys/kernel/sysrq 中的值只控制键盘触发的命令。通过 /proc/sysrq-trigger 调用总是被允许的,需要 root 权限或适当的位掩码设置。如果你只依赖 /proc/sysrq-trigger 进行远程管理,请确保 /proc/sys/kernel/sysrq 的值不会限制键盘触发的访问。

你应该知道的限制

Magic SysRq 很强大,但它不能修复一切。它只在“系统完全锁定但内核仍然在编译时启用了该功能”时有效。

它不会帮助:

  • 内核本身因恐慌而崩溃,无法恢复
  • 硬件被物理限制
  • CPU 锁定在一个安全循环中
  • 键盘设备本身已损坏
  • 你的键盘没有正确连接

它可能不工作当:

  • 你的内核编译时没有 CONFIG_MAGIC_SYSRQ
  • 你正在使用一个虚拟机,并且键盘组合没有被传递
  • 你的桌面环境没有正确处理键盘组合
  • systemd 将位掩码设置为一个禁用你所需命令的值

它不是魔法: 不要被名字迷惑。它是一个内核功能。如果内核不能运行,SysRq 也不能运行。

通过网络使用 SysRq

/proc/sysrq-trigger 接口自 Linux 2.4.21 起可用,让你远程触发命令。

/proc/sysrq-trigger 接口,自 Linux 2.4.21 起可用,让你远程触发命令。它的关键优势在于它绕过了键盘位掩码,只要你拥有 root 访问权限。

通过 SSH(如果连接仍然可用):

echo s | sudo tee /proc/sysrq-trigger  # Sync filesystems
echo u | sudo tee /proc/sysrq-trigger  # Remount read-only
echo b | sudo tee /proc/sysrq-trigger  # Reboot

完整 REISUB 序列在一个命令中(按顺序暂停,在最新内核上推荐):

echo _reisub | sudo tee /proc/sysrq-trigger

通过一个串行控制台: 发送一个 BREAK 信号,然后在 5 秒内,发送命令键。这个方法取决于你的终端程序如何发送 BREAK。

验证:测试 SysRq 工作

在需要之前测试它:

  1. 检查它是否启用:cat /proc/sys/kernel/sysrq 应该显示一个非零值
  2. 尝试一个安全命令:Alt + SysRq + h(显示内核日志帮助)
  3. 确认它工作了:sudo dmesg | tail -20 应该显示 SysRq 输出

不要测试 b 除非你准备好立即重启。

不要测试 f 除非你想要一个随机进程被 OOM 杀手杀死。

从 h 开始。如果帮助文本出现在 dmesg 上,一切都会工作。

要避免的常见错误

错误 1:跳过 REISUB 序列的步骤

每个步骤需要 1 到 2 秒。如果你在 b 之前按 s 而没有等待同步,你会破坏数据。

错误 2:单独使用 b 来重启

b 命令立即重启,没有同步和卸载。使用完整的 REISUB 序列代替。

错误 3:在笔记本电脑上忘记 Fn 键

许多笔记本电脑需要 Fn + SysRq。试试不同的组合,如果一种不行的话。

错误 4:在生产环境中测试危险命令

命令 e、i 和 b 会立即导致系统范围的破坏。在一个隔离的机器上测试。

错误 5:假设它在虚拟机上工作

虚拟机、云实例和自定义内核可能不会传递 SysRq 组合。先验证它。

错误 6:在公共系统上启用所有 SysRq

任何拥有物理访问权限的人都可以崩溃你的系统。使用一个限制性的位掩码。

错误 7:在 /proc/sysrq-trigger 中使用大写命令字母

命令是区分大小写的。例如,echo B > /proc/sysrq-trigger 不会重启你的系统。echo b 也不会。

Linux Magic SysRq Key Cheatsheet

Recover Frozen Linux System## LINUX MAGIC SYSRQ KEYEmergency Command ReferenceAlt + SysRq + [key] · keys are case-sensitive · always use lowercaseREISUB SEQUENCE# safe reboot for a frozen systemrunraw keyboardturns off raw mode → XLATEeSIGTERM all processesasks them to close gracefullyiSIGKILL all processesforce-kills what remainsssync filesystemswait for disk activity to settleuremount read-onlyprotects filesystemsbreboot immediatelyno further sync after this# mnemonics"Reboot Even If System Utterly Broken""Raising Elephants Is So Utterly Boring"OTHER COMMANDS opower off (if supported) fOOM killer — kills memory hog kSAK — kills current console procs mdump memory info to console tdump tasks and threads hhelp — check with dmesg# check & enablecat /proc/sys/kernel/sysrq# enable all (temporary)echo 1 | sudo tee /proc/sys/kernel/sysrq# remote REISUB via triggerecho _reisub | sudo tee /proc/sysrq-trigger# bitmask quick ref 0disabled 1all commands enabled 176sync + remount + reboot only 438Debian default 16systemd default (sync only!)Source: kernel.org/doc/html/latest/admin-guide/sysrq.html

结论

Magic SysRq 是一个应急工具。作为一个系统管理员,它是你电源按钮之前的最后手段。

当系统冻结且没有响应时,REISUB 可以保存你的数据。它优雅地关机,即使正常关机已经不可能。

在个人机器上启用 REISUB。在服务器上限制它。测试它是否工作。最重要的是,记住命令都是小写的。

Magic SysRq 不会解决任何底层问题。把它看作一个应急安全网。使用它当你必须时。忽略它当你不需要时。

当你的系统在凌晨 3 点毫无征兆地冻结时,你会庆幸你测试过它。

一个最后的提示: 把 REISUB 序列写在一个物理便利贴上。例如,你可以把它贴在你的显示器上,或者你桌面的背面。