什么是SysRq?

你是否遇到服务器不能通过 SSH 登录,也不能通过本地终端(tty)登录的情况?
在这种情况下,你除了按下电源或复位键之外,还做过什么吗?
你是否想过这种情况是可能恢复的呢?
你是否想过收集更多的信息来定位这次系统挂起的原因呢?
–上述情况,可称之为“可中断的系统挂起”。

换句话来讲,系统因为某种原因已经停止对大部分正常服务的响应,但是系统仍然可以响应键盘的按键中断(实际应该是串口中断)请求。
曾经啊,对着键盘上 Print Screen/SysRq 的键琢磨许久,也不知道所谓 SysRq 到底是做什么用的。
自从用了 linux,才算知道是给内核传递信息,紧急情况下重启系统用的。
Sysrq被称为”魔术组合键”, 是内建于Linux内核的调试工具,你可以按下它,内核会做出响应。
它被定义为一系列按键组合。之所以称它“magic”,是因为它在系统挂起,大多数服务已无法响应的情况下,还能通过按键组合来完成一系列预先定义的系统操作。
只要内核没有完全锁住,不管内核在做什么事情,使用这些组合键都可以搜集包括系统内存使用、CPU任务处理、进程运行状态等系统运行信息。
通过它,不但可以在保证磁盘数据安全的情况下重启一台挂起的服务器,避免数据丢失和重启后长时间的文件系统检查,
还可以收集包括系统内存使用,CPU 任务处理,进程运行状态等系统运行信息,甚至还可能在无需重启的情况下挽回一台已经停止响应的服务器。

如何启动SysRq?

需要在内核的“make menuconfig”中配置“CONFIG_MAGIC_SYSRQ”
当运行编译了SysRq的内核后,可以在“/proc/sys/kernel/sysrq”中控制允许通过哪些函数调用SysRq键。
下面是“/proc/sys/kernel/sysrq”可能的值列表(原文在Linux.x.x/Documentation/sysrq.txt):

 Here is the list of possible values in /proc/sys/kernel/sysrq:0 - disable sysrq completely1 - enable all functions of sysrq>1 - bitmask of allowed sysrq functions (see below for detailed function description):2 =   0x2 - enable control of console logging level4 =   0x4 - enable control of keyboard (SAK, unraw)8 =   0x8 - enable debugging dumps of processes etc.16 =  0x10 - enable sync command32 =  0x20 - enable remount read-only64 =  0x40 - enable signalling of processes (term, kill, oom-kill)128 =  0x80 - allow reboot/poweroff256 = 0x100 - allow nicing of all RT tasks

可以通过以下命令设置SysRq文件中的值:
echo “number” >/proc/sys/kernel/sysrq
如果需要永久启用或者禁用SysRqs, 则可在/etc/sysctl.conf中设置:

     kernel.sysrq = 1 (启用SsyRq)kernel.sysrq = 0 (禁用SysRq)

kernel.sysrq 还可接受除 0 和 1 以外的启用参数,详情请参考sysrq内核文档。

如何使用SysRq?

这个在不同的平台上,使用SysRq的方法也不同,直接摘抄原文如下:

On x86 - You press the key combo ‘ALT-SysRq-’. Note - Some
keyboards may not have a key labeled ‘SysRq’. The ‘SysRq’ key is
also known as the ‘Print Screen’ key. Also some keyboards cannot
handle so many keys being pressed at the same time, so you might
have better luck with “press Alt”, “press SysRq”, “release SysRq”,
"press ", release everything.

On SPARC - You press ‘ALT-STOP-’, I believe.

On the serial console (PC style standard serial ports only) -
You send a BREAK, then within 5 seconds a command key. Sending
BREAK twice is interpreted as a normal BREAK.

On PowerPC - Press 'ALT - Print Screen (or F13) - ,
Print Screen (or F13) - may suffice.

On other - If you know of the key combos for other architectures,
please
let me know so I can add them to this section.

On all - write a character to /proc/sysrq-trigger. e.g.:

echo t > /proc/sysrq-trigger

/proc/sysrq-trigger节点调试

内核配置选项中使能CONFIG_MAGIC_SYSRQ选项,这样系统启动之后,会生成/proc/sysrq-trigger节点用于调试。
注意,设置“/proc/sys/kernel/sysrq”的值只影响通过键盘的调用。
而“/proc/sysrq-trigger”节点能调用任何操作(具有管理特权的用户)
部分功能:

     echo m > /proc/sysrq-trigger 导出内存分配信息echo t > /proc/sysrq-trigger 导出当前任务状态信息echo p > /proc/sysrq-trigger 导出当前CPU寄存器和标志位信息echo c > /proc/sysrq-trigger 产生空指针panic事件,人为导致系统崩溃echo s > /proc/sysrq-trigger 即时同步所有挂载的文件系统echo u > /proc/sysrq-trigger 即时重新挂载所有的文件系统为只读echo w > /proc/sysrq-trigger 转储处于uninterruptable阻塞状态的任务

魔术键有哪些“命令”?

魔术键使用帮助:

 0-9 设定终端输出的内核 log 优先级b 立即重启系统c 内核live reboot,并输出错误信息d 显示所有排它锁(显示所有被持有的锁)e 向除 init 外进程发送 SIGTERM 信号,让其自行结束f 人为触发 OOM Killer (out of memory)g 当进入内核模式时,以 framebuttter 代替输出(kgdb(内核调试器)使用)h 输出帮助i 向除 init 以外所有进程发送 SIGKILL 信号,强制结束进程k 安全访问密钥(SAK)杀死当前虚拟控制台上的所有程序l 显示所有活动cpu的堆栈回溯。m 内存使用信息(将当前内存信息转储到您的控制台。)n 重置所有进程的 nice(优先级)o 关机p 输出cpu 寄存器信息q Display all active high-resolution timers and clock sources.r 把键盘设置为 ASCII 模式,使按键可以穿透 x server 捕捉传递给内核s 同步缓冲区数据到硬盘t 输出进程列表(将当前任务及其信息的列表转储到您的控制台。)u 重新挂载所有文件系统为只读模式v 输出 Voyager SMP 处理信息w 输出 block(d状态)进程列表

我们能用SysRq做什么?

  1. 1.“k” - (安全访问密钥)是非常有用的,当你想要确保没有木马程序运行在控制台,伺机抓取你的密码 在您尝试登录时。它会杀死给定控制台的所有程序, 因此,您可以确保您看到的登录提示符实际上是来自init的,不是木马程序。
  2. 2.“b” - 当系统无法关闭时重启(b)是很好的。但是您还应该首先同步(s)和umount(u)。
  3. 3.“s” - 同步(s)是伟大的,当您的系统被锁定,它允许您同步您的磁盘,当然会减少数据丢失和fscking的机会。 请注意,在屏幕上出现“OK”和“Done”之前,不会进行同步。(如果内核真的处于冲突中,您可能永远得不到OK或Done消息……)
  4. 4.“u” - 解除挂载(u)基本上与sync(s)一样有用。我通常同步(s), 解除挂载(u),然后重启(b)当我的系统锁定。 它帮我省了很多操作。同样,在您看到屏幕上出现“OK”和“Done”消息之前,解除挂载(remount只读)还没有发生。
  5. 5.“0-9” - 当控制台被不想看到的内核消息淹没时,日志级别“0”-“9”非常有用。 选择“0”将阻止除最紧急的内核消息之外的所有消息到达您的控制台。 (不过,如果syslod/klogd是活动的,它们仍然会被记录下来。)
  6. 6.“e”,“i” - term(e)和kill(i)是有用的,如果你有某种失控的进程, 你不能用任何其他方法来杀死它,特别是当它生成其他进程时。
  7. 7.“m” - 内存信息(m)是非常有用的,当系统处于卡死的状态,而你又想要查看当前系统的内存使用情况时。
  8. 8.“t” - 进程列表(t)可以打印当前所有的任务及其信息。用于查找一些异常的进程。
  9. 9.“p” - CPU寄存器§也是非常有用的,在系统卡住的时候,可以通过查看寄存器,找到当前的系统指针在哪个位置。
  10. 10.“R-E-I-S-U-B” - 安全重启系统。R-E-I-S-U-B 这个序列的推荐使用方式是: R – 1 秒 – E – 30 秒 – I – 10 秒 – S – 5 秒 – U – 5 秒 – B,而不是一气呵成地按下这六个键, 试想一次正常的reboot 命令也不是在一瞬间完成的吧。 R - 把键盘设置为 ASCII 模式 E - 向除 init 以外所有进程发送
    SIGTERM 信号 I - 向除 init 以外所有进程发送 SIGKILL 信号 S - 磁盘缓冲区同步 U -
    重新挂载为只读模式 B - 立即重启系统

点击了SysRq,但是什么也没有发生,为什么?

有些键盘为SysRq生成的键码与预定义的值99不同(请参阅include/linux/input.h中的KEY_SYSRQ),或者根本没有SysRq键。

我想添加一个事件到SysRq模块,应该怎么做?

我也不知道怎么做,因为我也没做过…
查阅资料,原文如下:

In order to register a basic function with the table, you must first include
the header ‘include/linux/sysrq.h’, this will define everything else you need.
Next, you must create a sysrq_key_op struct, and populate it with A) the key
handler function you will use, B) a help_msg string, that will print when SysRQ
prints help, and C) an action_msg string, that will print right before your
handler is called. Your handler must conform to the prototype in ‘sysrq.h’.
.
After the sysrq_key_op is created, you can call the kernel function
register_sysrq_key(int key, struct sysrq_key_op *op_p); this will
register the operation pointed to by ‘op_p’ at table key ‘key’, if
that slot in the table is blank. At module unload time, you must call
the function unregister_sysrq_key(int key, struct sysrq_key_op *op_p),
which will remove the key op pointed to by ‘op_p’ from the key ‘key’,
if and only if it is currently registered in that slot. This is in
case the slot has been overwritten since you registered it.

.

The Magic SysRQ system works by registering key operations against a
key op lookup table, which is defined in ‘drivers/tty/sysrq.c’. This
key table has a number of operations registered into it at compile
time, but is mutable, and 2 functions are exported for interface to
it: register_sysrq_key and unregister_sysrq_key. Of course, never
ever leave an invalid pointer in the table. I.e., when your module
that called register_sysrq_key() exits, it must call
unregister_sysrq_key() to clean up the sysrq key table entry that it
used. Null pointers in the table are always safe.

【调试工具】【sysrq】Sysrq魔术键介绍相关推荐

  1. 【开发工具】【sysrq】魔术键(sysRq)的使用

    SysRq相关链接(写的很详细):    https://www.ibm.com/developerworks/cn/linux/l-cn-sysrq/ 什么是SysRq? 你是否遇到服务器不能通过 ...

  2. Linux:内核调试之内核魔术键sysrq

    在linux系统下,我们可能会遇到系统某个命令hang住的情况,通常情况下,我们会查看/proc/pid/wchan文件,看看进程处于什么状况,然后进一步查看系统日志或者使用strace跟踪命令执行时 ...

  3. 电脑键盘上一些不常用的键介绍:F1 - F12,sysrq键,Scroll Lock键,pausebreak键

    F1:若处于一个选定的程序中需要帮助时,按下F1获得帮助.若不是处于程序中,处于资源管理器或者桌面,按下F1会显示出Windows界面的帮助程序. F2:若选中一个文件或文件夹在资源管理器中,按下F2 ...

  4. ubuntu死机重启的魔术键

    ubuntu死机之后如果总是断电强制重启,会对硬盘和数据造成损伤,可以使用魔术键进行重启: Alt+SysRq + r,e,i,s,u,b(确实很好背,就是单词 busier (英语"更忙& ...

  5. THINKPAD笔记本Fn组合键介绍

    THINKPAD笔记本Fn组合键介绍 Fn键作为笔记本的组合键,和其他键组合使用时会有强大的功能,很多使用技巧都是通过Fn组合键来实现的.下边就为大家总结一下IBM ThinkPad系列笔记本Fn键的 ...

  6. Linux中的SysRq魔术键

    1. SysRq介绍 我第一次接触到SysRq是由于硬件同事调试时突然发现串口打印了HELP信息,还以为软件出问题了,我就去了解了一下SysRq.而我真正用上SysRq是为了破解一个禁止了所有命令的系 ...

  7. 计算错误可以用计算机ac,计算器ac是什么键 计算器ac键介绍

    计算器上AC(All Clear)键是清除键,在数字输入期间,第一次按下此键将清除存储器内容外的所有数值. 计算器上CE/C:CE表示Clear Error,是指你清楚你当前的错误输入:而C表示Cle ...

  8. 苹果电脑的快捷键和组合键介绍

    一.启动电脑时的巧妙使用:    1.启动时,同时按住"Optionion"键可以重建桌面,此操作最好每月做一次:   2.启动时,按住"shift"键可以关闭 ...

  9. php 魔术方法介绍

    PHP 魔术方法有哪些,作用是什么 在面向对象编程中,PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利.PHP中的魔术方法通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定 ...

最新文章

  1. oracle缩小表空间
  2. Django 模板中使用css, javascript
  3. [转]为什么软件开发,人多,事少,还会工作量大?
  4. saltstack 安装nginx
  5. JavaScript onmouseup 事件
  6. jQuery学习之八---文档处理
  7. Ubuntu18.04 安装 nvidia2080Ti显卡驱动
  8. 基于WebActivator的改进版本KudyStudio.Web.Activating讲解与下载
  9. MVCC常问面试题(面试重点)
  10. easyui missingMessage
  11. Teradata天睿公司发布开源Kylo软件
  12. gh-ost学习笔记 试验代码学习
  13. 同比日期的获取(公历与农历)
  14. 浅谈软件项目开发过程中的主要项目风险及对策
  15. 部署Python的框架下的web app的详细教程
  16. 成语归类大全(留着,孩子有用的)
  17. pandas之美国各州人口分析
  18. Linux用户间的切换命令su以及su和su - 的区别
  19. 企鹅公司为企业与单位推出的一款基于其业务交流平台,该款企业微信mac版可以很轻松的进行企业级沟通
  20. 你还在抱怨职场的不公吗?

热门文章

  1. 学神经网络需要什么基础,神经网络快速入门
  2. 安装wsl2报错WslRegisterDistribution failed with error: 0x80370102解决方案
  3. jupyterhub安装与运维
  4. 7年一剑!旷视赴港上市招股书披露:年均31岁姚班创始团队,上半年研发支出4亿
  5. java 基础(上)
  6. Spring Cloud启动慢Initializing ExecutorService 'taskScheduler'占用三分钟
  7. Halcon Opencv 数据的不同
  8. Android之 Bitmap使用
  9. Delta Lake 0.5.0 新功能介绍
  10. c语言表达式的次方怎么表示,在C语言中,10的n次方怎么表示?