Linux · 2025-04-17 0

如何在磁盘故障导致 I/O 错误时通过 SSH 强制重启 Linux 服务器(Magic SysRq 技巧)

关键词:Magic SysRq key、/proc/sysrq-trigger、硬复位、emergency sync、只读挂载


背景与问题

当 Linux 服务器的块设备(磁盘)出现严重故障,整个文件系统会被内核自动重新挂载为 只读,所有普通读写操作都会抛出 Input/output error。如果此时你仍保持着 SSH 会话,虽然能敲命令,但绝大多数二进制文件、shell 内置以外的工具都无法正常执行。

在无法物理接触服务器、亦没有带外管理(BMC/IPMI/iDRAC/iLO)或云供应商电源控制的情况下,我们仍可利用内核提供的 Magic SysRq机制从远程强制重启服务器。


Magic SysRq 概述

Magic SysRq key 是 Linux 内核内置的一个紧急控制通道,允许在几乎任何崩溃场景下直接向内核发送低级指令。例如:

指令字符作用
sEmergency Sync:立即将所有挂起的脏页写入磁盘
uRemount Read‑Only:把所有已挂载文件系统重新挂载为只读
bReboot:不经过关机流程,直接重启内核(硬复位)
cCrash:触发内核 panic(通常会自动重启,但更危险)

这些指令全部通过写入位于内存中的伪文件 /proc/sysrq-trigger 完成,不依赖磁盘。因此在出现 I/O 错误时依然可用,只要:

  1. 内核编译时启用了 CONFIG_MAGIC_SYSRQ(大多数发行版默认启用)。
  2. 运行时 sysctl kernel.sysrq 未被设置为 0(禁用)。
  3. /proc 文件系统仍然挂载并可写(它是 tmpfs,位于内存)。

操作前提检查

  1. 保持 root 权限Magic SysRq 指令只能由 root 执行。
  2. 确认 SysRq 是否启用cat /proc/sys/kernel/sysrq # 输出应为非 0(通常是 1 或 16 进制位掩码) 若返回 0,则可尝试在内存中启用:echo 1 > /proc/sys/kernel/sysrq 这同样写入内存,不涉及磁盘。

操作步骤详解

1. 紧急同步

echo s > /proc/sysrq-trigger

立即将缓存写入磁盘,尽量减小数据丢失。

2. 只读重新挂载

echo u > /proc/sysrq-trigger

防止后续写操作破坏更多数据。

3. 再次同步(可选,但推荐)

echo s > /proc/sysrq-trigger

确认所有文件系统在只读状态前已刷新。

4. 强制重启 (hard reboot)

echo b > /proc/sysrq-trigger

立即让内核复位,相当于按下硬件重启按钮。

安全组合顺序s → u → s → b 是社区常用的“保险四步”。


关键命令说明

  • echo & 重定向echo 为 zsh/bash 内置,重定向 > 由 shell 处理,不依赖磁盘上的 /bin/echo
  • /proc/sysrq-trigger 位于内存;即使根文件系统变为只读,它仍可写。
  • 为何不用 reboot -f/sbin/reboot 本身在磁盘上,且需要调用 systemd/shutdown,在 I/O 错误情况下经常失败。

失败场景及备选方案

场景解决途径
kernel.sysrq = 0 且无法修改只有外部电源管理:BMC、IPMI、云控制台、Watchdog 定时器等
/proc 无法写入说明内核已部分锁死;SSH 只剩 TCP keep‑alive,此时只能等待看门狗或人工断电
希望保留崩溃转储 (kdump)使用 echo c 触发 panic;需预先配置 kdump 并留有可写设备

风险与注意事项

  1. echo b 不会正常卸载文件系统,仅适用于已经无法正常关机的紧急情况。
  2. 数据一致性:执行前务必确保应用已停止写入;否则可能导致数据库、日志进一步损坏。
  3. 重启后 务必跑一次 fsck(文件系统检查)。
  4. 若服务器托管于云厂商,强制重启可能触发监控报警或账单中的故障事件记录。

结语

借助 Magic SysRq,我们可以在最恶劣的磁盘故障场景下,通过仅存的 SSH 会话“触及”内核,完成一次相对安全的强制重启。这不仅是运维工程师(SysAdmin)の应急“黑科技”,也提醒我们:

  • 提前 启用并验证 kernel.sysrq,并在 SOP 中记录操作步骤;
  • 为关键业务配置 带外管理通道,把 Magic SysRq 作为最后手段;
  • 定期演练灾难恢复,保持对异常场景的敏感度与处理速度。

希望本文能帮助你在遇到类似“只剩 SSH /proc 可写、全盘 I/O 错误”的极端情况下,依然能够稳住阵脚、快速恢复服务。祝运维顺利!