I am LAZY bones ? all linux

2009年 08月 10日 的归档

linux的Magic Key

自从我换成了开源的A卡驱动以后,我的电脑就时不时地崩溃。现象是:突然之间,整个画面就冻结了,鼠标也不能动了,几乎所有的按键也都失效了,ctrl+alt+F1 和 ctrl+alt+backspace 都无效。这种情况一般发生在有不规则形状的窗口出现的时候,比如gnome-osd的透明文字,但也不是很一定的,发生的概率也不高,一般几天才会有一次。我想,要彻底解决的话,也只能等待驱动的改进了。
不过,每次崩溃都强行按电源的话,还是有点心痛的。幸好办法还是有的,因为驱动程序其实也只是一个程序而已,这时候即使驱动死掉了,鼠标键盘不能动,linux内核还是在正常运行的(按理如果我开了sshd的话,其他机器还是能ssh上来的)。而且,内核还是能处理一些键盘事件的,比如本文要说的:Magic System Request Key
以下按键,一般情况下不建议使用,除非是ctrl+alt+F1都失效了,才用。
使用Magic SysRq key的前提是CONFIG_MAGIC_SYSRQ这个内核选项被打开,并且没有在/proc/sys/kernel/sysrq里禁用掉,也就是 cat 这个文件的时候,出来的是 1 (或其他某些非0值)。其实这两个条件,在一般的linux发行版里都是满足的。下面就来介绍一下几个键的具体作用,其中SysRq指的是右上角的“Print Screen”键。

ALT-SysRq-b 立即重启系统,不卸载分区和同步文件。
ALT-SysRq-c 调用kexec内核函数来重启,可以生成个crashdump。
ALT-SysRq-d 显示所有的“锁”,如果开了X的话,估计基本看不到。
ALT-SysRq-e 给除了init以外的所有进程发送SIGTERM信号,可以试图正常结束所有进程。
ALT-SysRq-f 调用oom_kill函数来干掉占用了很大内存的进程。
ALT-SysRq-g 内核调试相关的(好像新内核已经没了?)。
ALT-SysRq-h 显示其他key的帮助,同样,如果开了X的话,估计基本看不到。
ALT-SysRq-i 给除了init以外的所有进程发送SIGKILL信号。
ALT-SysRq-k 结束当前虚拟终端的所有进程。
ALT-SysRq-l 显示所有活动CPU的栈跟踪信息。
ALT-SysRq-m 显示内存状态。
ALT-SysRq-n
ALT-SysRq-o 可能的话,关机。
ALT-SysRq-p 显示当前的寄存器状态和标志位。
ALT-SysRq-r 关闭键盘的raw模式。
ALT-SysRq-s 同步内存里的数据到硬盘。
ALT-SysRq-t 显示当前的任务信息。
ALT-SysRq-u 以只读模式重新挂载所有分区。
ALT-SysRq-v
ALT-SysRq-w 显示不可中断的任务
ALT-SysRq-x
ALT-SysRq-z
ALT-SysRq-数字键 调整日志输出级别
另外,除了物理的按键以外,其实还可以把某个键的值用root权限写到 /proc/sysrq-trigger 文件里(这个文件是个只写不读的怪文件,哈哈),比如

echo t > /proc/sysrq-trigger

,来触发Magic SysRq key。

以上内容可以在内核源码的 Documentation/sysrq.txt 里找到英文原文,但是即便是这个官方文档,也似乎不是每个按键都有效的,可能是某些只有在特定的硬件条件下才有效,又或者文档没更新?
在万一遇到程序崩溃的时候,你可能需要按的键是: ALT-SysRq-r e i s u b 来安全地重启机器~