Linux Magic SysRq 魔键

2021年5月4日 3.25k 次阅读 0 条评论 1 人点赞

SysRq 魔键是一组由 Linux 内核解析的组合键,他使得用户可以直接执行各种低级指令,这些操作与当时的系统状态无关。例如从冻结中恢复,或者在不破坏文件系统的情况下重启系统,他的效果类似与直接按住了计算机的硬件重置按钮(电源开关),但是它具有更多的选项和更多的控制权。

通过这个组合键,为用户提供用于软件开发和灾难恢复的强大功能。他主要用于强制卸载文件系统、杀死进程、恢复键盘状态以及将未写入磁盘的数据同步等功能,对于这些任务,魔键也许已经成为了最后的手段。

当然,魔键也并不是无所不能,例如内核 panic 或者发生内核无法运行的硬件故障时,他也无法继续执行。

命令

魔键的组成通常是 Alt+SysRq(对于 Linux Mint,组合键是 Ctrl+Alt+SysRq)再加上其他的需要发送的命令键。SysRq 这个键可以在按命令键前释放掉,只要你一直按着 Alt 键。

我们主要讨论的是 QWERTY 键盘,至于其他键盘,暂时不做讨论,几乎大同小异,原理上都差不多。对于一些笔记本设备他的 SysRq 键需要与 Fn 键一起使用,否则该键不予响应。例如联想的 Thinkpad Carbon X1,他的组合键值对则为 Alt+Fn+SysRq 然后再加命令键。

魔键并不仅仅只能有键盘组合键发起,也可以通过其他手段发起,详情可见其他触发魔键的方法章节。

动作 QWERTY 按键键值
设置控制台日志等级,这个可以控制内核信息打印的等级 0 - 9
立即重启系统,不同步文件系统或者卸载文件系统 b
发起内核 Crash 崩溃,如果配置了 kdump 服务的话,将会获得一个 crashdump 文件 c
打印当前正在被持有的锁 Locks,CONFIG_LOCKEDP 内核选项需要开启 d
发送一个 SIGTERM 信号至所有进程,除开 1 号进程(init 进程) e
调用 oom_kill,选择一个最符合 oom 的进程杀死 f
当使用 Kernel Model Setting 模式的时候,切换至内核的 Frame Buffer 控制台,如果正在使用 kdb 进行调试,那么直接切换到 debugger g
将简洁的帮助文档打印至控制台 h
发送一个 SIGKILL 信号至所有进程,除开 1 号进程(init 进程) i
强制解冻由 FIFREEZE ioctl 冻结的文件系统 j
杀死当前虚拟中断的所有进程(可以杀死 X 和 SVGAlib 进程),最初是为了模仿安全警示按键而设立的 k
打印当前所有在线的 CPU 堆栈信息 l
打印当前的内存信息在控制台 m
重置所有的实时进程或者高优先级进程的 nice 值 n
关闭系统 o
打印当前的寄存器信息和 flags 信息在控制台 p
显示所有在线的高进度定时器和时钟源信息 q
键盘从 raw mode 切出至 XLATE 模式,经常被 X11 或者 SVGALib 使用 r
同步所有的已挂载的文件系统 s
打印当前的进程列表,以及他们的详细信息 t
重新挂载文件系统至只读模式 u
强制还原帧缓冲控制台 v
打印所有 D 状态(阻塞)的进程信息 w
转储 ftrace 缓冲区 z

在 x86_64 平台,按下 SysRq 组合键 h 之后的打印信息如下:

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)

使用

一个比较通用的使用方式就是安全重启 Linux 计算机而不被锁死(REISUB,Reboot Even If System Untterly Broken,即使系统完全崩溃也需要重启),这样可以防止在 reboot 的过程中需要 fsck 文件系统,使得一些进程有机会保存一些数据备份。当然,REISUB 还有一个解释就是按键的操作顺序,请看:

  • unRaw,从 X 接管键盘控制权
  • tErminate,发送 SIGTERM 到所有的进程,允许他们优雅的终止执行
  • kIll,发送强制退出指令,命令除了 init 进程之外的所有程序立即退出
  • Sync,同步内存缓存数据到磁盘
  • Unmount,重新已只读形式挂载所有的文件系统
  • reBoot,重启

当魔键 SysRq 杀死冻结的图形程序时,该程序没有机会恢复文件模式,这会使得所有的内容都不可读,SVGALib 的命令 textmode 和 reset 命令可以帮助恢复文本模式,使得控制台再次可读。

许多的发行版本默认进入的都是图形模式,所以需要切换到文本模式的话,可以使用 Ctrl+Alt+F1,F2,F3 至最大支持的控制台数量 Fn,如果要返回图形模式那就是 Ctrl+Alt+F(n+1)。

配置

魔键的支持能力是一个内核编译时功能,需要打开 CONFIG_MAGIC_SYSRQ 和 sysctl 内核参数 kernel.sysrq 来控制。对于一些发行版本,可以将数字写到 /proc/sys/kernel/sysrq 中,他们可以是 0 或者 1,也可以是比 1 大的正整数。例如在 UbuntuKylin 上可以写到 /etc/sysctl.d/10-magic-sysrq.conf 文件中。

其他触发魔键的方法

虽然魔键的设计最初是设计为使用键盘触发并使用与调试的,但是目前已经发展到远程也可以使用,不需要键盘参与。我们可以直接将需要的命令写入到 /proc/sysrq-trigger 文件中,例如 echo s > /proc/sysrq-trigger

对于一些嵌入式设备而言,他们不存在键盘,多数都是使用串口控制台进行输入输出,通过发送串口中断和所需的键,可以在串口控制台调用 Magic SysRq 功能,发送中断的方法取决于连接到串口控制台的中断程序或者硬件。一个与之相关的 sysctl 值需要被设置上用于启用本功能。

还有一种 Linux 守护程序 sysrqd 和 tcpconsole 提供了通过 TCP 连接,密码授权之后,当 hangwatch 守护进程可以在系统平均负载超过预定值时,去执行之前已经预制 sysrq 值的特定触发器。

参考链接

Magic SysRq key

标签:
最后编辑:2021年5月4日