1、在键盘上我们可以看到一些很不常用的键:PrtSc/SysRq、ScrLk、Pause、Break等,但我们一直很少用,也搞不清楚它们有什么用。
2、而在linux下,当我们的系统发生故障,内核仍在运行,键盘依旧可以用,只是没办法登陆或者重启电脑(按电脑重启键除外),这时,我们可以使用“SysRq魔法键(magic SysRq key)”来实现安全关机。
3、SysRq魔法键可以通过PC键盘上的ALT和SysRq组合键来激活,在其他平台可通过其他特殊键来激活(内核源码中Documentation/sysrq.txt文档有说明)。
4、为什么要安全关机
5、在linux下,为了提高性能,会把大量的数据缓存在内存中,直到有内存页的换入换出,才会把相应的数据写回磁盘,故其不是实时同步数据到磁盘,这时,只有手动触发sync或其他条件,内核才会把数据从内存写回物理磁盘。
6、当在运行linux时出现键盘可操作,但系统无法登陆,并且“CTRL+ALT+DEL”组合键也无法使用,只有内核在运行时,即内核并没有完全的挂掉,此时,如果我们强行关机或重启,将会造成数据的丢失,导致文件系统损坏,此时就可以使用SysRq这一魔法。
7、开启SysRq
8、1)、内核的支持
9、要启用SysRq,内核必需有对CONFIG_MAGIC_SYSRQ的支持才可以使用,现在很多linux发行版已支持该功能,比如我的Ubuntu10.04就可以支持了,如何验证是否开启呢?只需要如下命令即可:
10、grep “CONFIG_MAGIC_SYSRQ” /boot/config-`uname – r`
11、当返回值为CONFIG_MAGIC_SYSRQ=y,即是默认是支持的。
12、2)、启用SysRq
13、首先,我们可以通过下面命令查看SysRq是否开启:
14、cat /proc/sys/kernel/sysrq
15、当返回1时则开启,0时则关闭。
16、那么我们如何手动控制其开启呢?可以如下操作:
17、a、要激活SysRq,则执行下面命令:
18、echo "1" > /proc/sys/kernel/sysrq或sysctl -w kernel.sysrq=1(即通过sysctl命令启用它,kernel.sysrq除了0和1外,还可启用其他参数,可参考sysrq内核文档。)
19、b、要关闭SysRq,则执行下面命令:
20、echo "0" > /proc/sys/kernel/sysrq或sysctl -w kernel.sysrq=0
21、如果我们要每次开机都启用SysRq功能,那么我们可以进行如下操作:
22、在/etc/sysctl.conf文件中添加如下一行内容:
23、kernel.sysrq=1
24、重启后即可生效。
25、使用SysRq
26、网上有道题,问在只有 shell,init、halt、shutdown 等命令都不工作的情况下如何重启系统。答案就是 SysRq。
27、1)、常见的SysRq功能键
28、在发生故障,SysRq是开启的,并且键盘是有响应的(说明Linux内核没完全挂掉),就可以使用SysRq魔法,在标准的QWERTY键盘中,可以使用“Alt+SysRq+功能键”方式调用相关的功能。
29、可用的SysRq功能键如下:
30、或参考kernel-doc说明,例如:/usr/share/doc/kernel-doc-2.6.18/Documentation/sysrq.txt。
31、2)、常用的执行序列
32、a、安全重启系统
33、这个SysRq序列是R-E-I-S-U-B,可以简单的记为busy比较级busier的逆序排列,其功能基本等价于reboot命令,会依次停止系统上运行的进程,回写磁盘缓冲区,最后才安全重启系统。
34、上面每执行一个命令都会需要一定的时间,故R-E-I-S-U-B这一序列的使用方式推荐是:R-1秒-E-30秒-I-10秒-S-5秒-U-5秒-B,并不是一气呵成的按这6个键,试想reboot命令也不是一瞬间完成重启的。
35、下面是这个序列的简单说明:
36、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)
37、b、恢复系统挂起
38、这个序列是E-I-K-F,使用它们来恢复系统挂起。
39、E和I上面有说到,下面是K和F:
40、K 只结束与当前控制台相关的进程组, 代表saK,全称为Secure Access Key 。F 则利用OOM-Killer选取一个进程并结束它。这对于内存问题引起的挂起可以起到比SysRq-K更加准确,但是有些时候 OOMKiller 也会误判而杀掉一些长时间运行的后台服务,引起一些不必要的麻烦。
41、SysRq的安全问题
42、当我们打开SysRq功能时,可能会引发一些安全问题,我们可以使用proc文件系统中的sysrq-trigger结点进行操作,如可以使用echo b > /proc/sysrq-trigger,其效果同“ALT+SysRq+b”组合按键一样,这样就可以随进对/proc/sysrq-trigger写入相应的命令来使用SysRq功能,造成一些问题,不过当我们在调试驱动时,出现“活的挂起”时,即驱程进入了某个死循环但系统整体还可以工作,则可以使用该方法来帮助查找问题,通常会使用SysRq的p功能直接指出有问题的例程所在的位置。
43、附录
44、SysRq键通常在键盘的右上角可以找到,如下图所示: