红联Linux门户
Linux帮助

linux magic key之SysRq

发布时间:2017-02-28 10:22:16来源:linux网站作者:stguochongxin
在键盘上我们可以看到一些很不常用的键:PrtSc/SysRq、ScrLk、Pause、Break等,但我们一直很少用,也搞不清楚它们有什么用。
而在linux下,当我们的系统发生故障,内核仍在运行,键盘依旧可以用,只是没办法登陆或者重启电脑(按电脑重启键除外),这时,我们可以使用“SysRq魔法键(magic SysRq key)”来实现安全关机。
SysRq魔法键可以通过PC键盘上的ALT和SysRq组合键来激活,在其他平台可通过其他特殊键来激活(内核源码中Documentation/sysrq.txt文档有说明)。
 
1、为什么要安全关机
在linux下,为了提高性能,会把大量的数据缓存在内存中,直到有内存页的换入换出,才会把相应的数据写回磁盘,故其不是实时同步数据到磁盘,这时,只有手动触发sync或其他条件,内核才会把数据从内存写回物理磁盘。
当在运行linux时出现键盘可操作,但系统无法登陆,并且“CTRL+ALT+DEL”组合键也无法使用,只有内核在运行时,即内核并没有完全的挂掉,此时,如果我们强行关机或重启,将会造成数据的丢失,导致文件系统损坏,此时就可以使用SysRq这一魔法。
 
2、开启SysRq
1)、内核的支持
要启用SysRq,内核必需有对CONFIG_MAGIC_SYSRQ的支持才可以使用,现在很多linux发行版已支持该功能,比如我的Ubuntu10.04就可以支持了,如何验证是否开启呢?只需要如下命令即可:
grep “CONFIG_MAGIC_SYSRQ” /boot/config-`uname – r`
当返回值为CONFIG_MAGIC_SYSRQ=y,即是默认是支持的。
2)、启用SysRq
首先,我们可以通过下面命令查看SysRq是否开启:
cat /proc/sys/kernel/sysrq
当返回1时则开启,0时则关闭。
那么我们如何手动控制其开启呢?可以如下操作:
a、要激活SysRq,则执行下面命令:
echo "1" > /proc/sys/kernel/sysrq
sysctl -w kernel.sysrq=1
(即通过sysctl命令启用它,kernel.sysrq除了0和1外,还可启用其他参数,可参考sysrq内核文档。)
b、要关闭SysRq,则执行下面命令:
echo "0" > /proc/sys/kernel/sysrq
sysctl -w kernel.sysrq=0
如果我们要每次开机都启用SysRq功能,那么我们可以进行如下操作:
在/etc/sysctl.conf文件中添加如下一行内容:
kernel.sysrq=1
重启后即可生效。
 
3、使用SysRq
网上有道题,问在只有 shell,init、halt、shutdown 等命令都不工作的情况下如何重启系统。答案就是 SysRq。
1)、常见的SysRq功能键
在发生故障,SysRq是开启的,并且键盘是有响应的(说明Linux内核没完全挂掉),就可以使用SysRq魔法,在标准的QWERTY键盘中,可以使用“Alt+SysRq+功能键”方式调用相关的功能。
可用的SysRq功能键如下:
linux magic key之SysRq
或参考kernel-doc说明,例如:/usr/share/doc/kernel-doc-2.6.18/Documentation/sysrq.txt。
2)、常用的执行序列
a、安全重启系统
这个SysRq序列是R-E-I-S-U-B,可以简单的记为busy比较级busier的逆序排列,其功能基本等价于reboot命令,会依次停止系统上运行的进程,回写磁盘缓冲区,最后才安全重启系统。
上面每执行一个命令都会需要一定的时间,故R-E-I-S-U-B这一序列的使用方式推荐是:R-1秒-E-30秒-I-10秒-S-5秒-U-5秒-B,并不是一气呵成的按这6个键,试想reboot命令也不是一瞬间完成重启的。 
下面是这个序列的简单说明:
R: Switch the keyboard from raw mode to XLATE mode. 把键盘设置为ASCII模式(unRaw)
E: Send the SIGTERM signal to all processes except init.  向除init外的所有进程发送SIGTERM信号(tErminate)I: Send the SIGKILL signal to all processes except init. 向除init外的所有进程发送SIGKILL信号(kIll)S: Sync all mounted file systems (IMPORTANT). 将所有数据同步至磁盘(Sync)U: Remount all mounted file systems in read-only mode. 将所有分区重新挂载为只读模式(Unmount)B: Immediately reboot the system, without un-mounting partitions or syncing. 立即重启系统(reBoot)
b、恢复系统挂起
这个序列是E-I-K-F,使用它们来恢复系统挂起。
E和I上面有说到,下面是K和F:
K 只结束与当前控制台相关的进程组, 代表saK,全称为Secure Access Key 。
F 则利用OOM-Killer选取一个进程并结束它。这对于内存问题引起的挂起可以起到比SysRq-K更加准确,但是有些时候 OOMKiller 也会误判而杀掉一些长时间运行的后台服务,引起一些不必要的麻烦。
 
4、SysRq的安全问题
当我们打开SysRq功能时,可能会引发一些安全问题,我们可以使用proc文件系统中的sysrq-trigger结点进行操作,如可以使用echo b > /proc/sysrq-trigger,其效果同“ALT+SysRq+b”组合按键一样,这样就可以随进对/proc/sysrq-trigger写入相应的命令来使用SysRq功能,造成一些问题,不过当我们在调试驱动时,出现“活的挂起”时,即驱程进入了某个死循环但系统整体还可以工作,则可以使用该方法来帮助查找问题,通常会使用SysRq的p功能直接指出有问题的例程所在的位置。
 
5、附录
SysRq键通常在键盘的右上角可以找到,如下图所示:
linux magic key之SysRq
 
本文永久更新地址:http://www.linuxdiyf.com/linux/28767.html