目的
了解如何启用SysRq功能,以及如何使用通过命令键调用它们。
要求
- 根权限
- 启用”CONFIG_MAGIC_SYSRQ”选项编译的Linux内核
困难
简单
约定
介绍
在某些特定情况下,可以使用SysRq组合键将命令直接发送到Linux内核:内核将响应使用以下命令发送的命令command keys
立即将其锁定,除非它已完全锁定。各种command keys
完成特定任务,并且可以将它们组合在一起以将系统还原到安全状态,或者在无其他操作的情况下获得干净的重新引导:这是我们可以通过reisub
顺序。
在本教程中,我们将看到如何使用标准安装来启用所有SysRq功能。Ubuntu 18.04 - Bionic
作为基础。
Beaver
SysRq魔术钥匙
的SysRq
组合键包含三个可同时按下的键:ALT + SysRq + command key
。您可能想知道什么是SysRq
键盘上的琴键。假设您使用的是QWERTY键盘,SysRq
键对应于print
键。
最后,命令键是键盘上的键,在此特殊模式下按下该键将立即向内核发送命令。稍后我们将看到其中一些键以及与它们相关的功能,但是在继续之前,我们必须确保所使用的内核已编译并启用了所需的选项。
CONFIG_MAGIC_SYSRQ内核选项
如上所述,对于SysRq
要使用组合键,内核必须已使用CONFIG_MAGIC_SYSRQ
选项已启用。在所有主要发行版中通常都是这种情况,但是了解如何检查其状态可能很有用。这是我们可以做到的。我们要知道的第一件事是我们正在使用的内核的版本和名称。获得此信息非常容易,我们只需运行:
$ uname -r
4.13.0-25-generic
如您所知,uname
命令用于检索一些系统信息。在这种情况下,我们将其与-r
标记,因为我们只想了解kernel release
该命令的结果是4.13.0-25-generic
:这是我们系统使用的内核的名称。现在,我们可以查看内部/boot
相应配置文件的目录:此文件包含编译内核时使用的所有选项。我们可以搜索用于CONFIG_MAGIC_SYSRQ
在里面:
$ ls /boot
abi-4.13.0-25-generic initrd.img-4.13.0-25-generic memtest86+_multiboot.bin
config-4.13.0-25-generic memtest86+.bin System.map-4.13.0-25-generic
grub memtest86+.elf vmlinuz-4.13.0-25-generic
如预期的那样,该文件存在:config-4.13.0.25-generic
是我们正在寻找的。现在我们有了所需的一切,让我们进行检查:
$ grep -i CONFIG_MAGIC_SYSRQ /boot/config-4.13.0-25-generic
CONFIG_MAGIC_SYSRQ=y
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x01b6
CONFIG_MAGIC_SYSRQ_SERIAL=y
如第一行所示,该选项CONFIG_MAGIC_SYSRQ
已y
作为其值,意味着在配置内核时将其设置为内置。其他行代表什么?的CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE
选项确实指定了启用的默认功能:该值表示为hexadecimal
形式,在这种情况下0x01b6
确实对应438
以十进制形式。
正如我们将在本教程的后面看到的那样,该值表示默认情况下启用了大多数功能。但是,出于安全原因,大多数发行版都通过键组合禁用了调用。第三种选择对我们来说现在不是很重要:它是关于启用SysRq key
在串行。
检查当前的SysRq值
大多数发行版都禁止访问某些SysRq
出于安全原因,通过组合键实现功能(但是,如果通过调用,则所有功能始终可用/proc/sysrq-trigger
具有root权限)。要检查系统中可用的功能,我们可以运行:
$ cat /proc/sys/kernel/sysrq
176
该命令返回的值为176
。如何获得此值,它代表什么?每个值都对应一个特定的函数,如下面的列表所示:
0 - disable sysrq completely
1 - enable all functions of sysrq
2 - enable control of console logging level
4 - enable control of keyboard (SAK, unraw)
8 - enable debugging dumps of processes etc.
16 - enable sync command
32 - enable remount read-only
64 - enable signaling of processes (term, kill, oom-kill)
128 - allow reboot/poweroff
256 - allow nicing of all RT tasks
虽然值0
禁用所有SysRq
功能和值1
启用所有这些,并提供大于1的值,我们可以启用特定的值。如上所述,我们有一个SysRq
的价值176
。这是从128
(允许重新启动和关闭电源)+32
(以只读模式重新挂载文件系统的能力)+16
,启用同步命令。同样,438
从2 + 4 + 16 + 32 + 128 + 256的总和中获得,因此启用了所有相应的功能。
如何更改SysRq值
现在我们知道SysRq
价值是,但是我们如何改变它呢?要立即更改此值,我们只需要将所需的值写入/proc/sys/kernel/sysrq
文件,通过运行:
# echo "1" > /proc/sys/kernel/sysrq
这样,更改将立即生效,但在重新启动后将无法生存。如何使其持久化?那很简单。在所有linux发行版中都有效的通用解决方案是赋予kernel.sysrq
在里面/etc/sysctl.d/99-sysctl.conf
文件:
# echo "kernel.sysrq = 1" >> /etc/sysctl.d/99-sysctl.conf
请注意我们如何使用>>
重定向运算符:这会将文本附加到文件中,并且不会覆盖它可能已经包含的其他设置。
reisub序列
在所有命令键序列中,reisub
可能是最著名的。为了更好地记住此顺序,通常将其用作“抬高大象太无聊”的首字母缩写。这个序列完成什么工作?保持alt+sysrq key
,我们继续按顺序按命令键,结果如下:
首先r
从切换键盘raw
至XLATE
模式,e
发送一个SIGTERM
向所有进程发出信号,以便在可能的情况下以优美的方式关闭它们。之后,我们发送一个SIGKILL
按下即可发出信号i
,以终止未响应先前信号的其余过程。用s
我们尝试同步所有已挂载的文件系统,并立即将所有更改从高速缓存刷新到磁盘。通过使用u
我们重新挂载所有文件系统read only
模式,最后按b
,我们执行系统重启。
的reisub
当系统变得非常无响应,并且其他解决方案不足以解决问题时,可以在某些情况下使用序列。但是,构成此序列的命令键只是可用键的一个子集:有关完整列表,您可以查看SysRq
内核文档。