如何检查哪些 SysRq 功能已启用?

use*_*001 19 linux bash bitmaps linux-kernel sysrq

该文件/proc/sys/kernel/sysrq包含一个数字,例如:

  • 1 (启用所有 SysRq 命令),
  • 0 (禁用所有),
  • 或用作二进制位掩码的基数为 10 的正整数,启用函数的子集。

有人能告诉我当位掩码设置为 时允许/禁止哪些 SysRq 函数438吗?


$ cat /proc/sys/kernel/sysrq
438
Run Code Online (Sandbox Code Playgroud)

Wil*_*son 26

这些是可用的 SysRq 函数:

0 - disable every SysRq function.
1 - enable every SysRq function.
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 signalling of processes (term, kill, oom-kill)
128 - allow reboot/poweroff
256 - allow nicing of all RT tasks
Run Code Online (Sandbox Code Playgroud)

438= 2 + 4 + 16 + 32 + 128 + 256,因此只允许与这些数字关联的函数。在文档中阅读所有相关信息

如果转换438为基数 2 ( 110110110),则更容易看到。

1     1     0    1    1    0   1   1   0
^256  ^128  ^64  ^32  ^16  ^8  ^4  ^2  ^1
Run Code Online (Sandbox Code Playgroud)

根据您的发行版,您可以CONFIG_MAGIC_SYSRQ使用以下命令判断内核是否编译:

$ grep SYSRQ /boot/config-$(uname -r)
Run Code Online (Sandbox Code Playgroud)

这在 Ubuntu 上对我有用。

  • 我添加了一种可能的方法来检查`CONFIG_MAGIC_SYSRQ`。 (3认同)

ken*_*orb 5

这是一个 Bash one-liner,它将为您打印启用的选项:

for i in $(seq 1 8); do (( ($(</proc/sys/kernel/sysrq) & $((1<<$i))) > 0 )) && echo $((1<<$i)); done
Run Code Online (Sandbox Code Playgroud)

当位掩码设置为 438 时,允许/禁止哪些 SysRq 功能?

$ for i in $(seq 1 8); do (( (438 & $((1<<$i))) > 0 )) && echo $((1<<$i)); done
2
4
16
32
128
256
Run Code Online (Sandbox Code Playgroud)

其含义请参考威廉的回答


要启用所有选项,请运行:

echo 1 | sudo tee /proc/sys/kernel/sysrq
Run Code Online (Sandbox Code Playgroud)

要使其持久化,请运行:

echo kernel.sysrq=1 | sudo tee /etc/sysctl.d/20-sysrq.conf
Run Code Online (Sandbox Code Playgroud)