Sysrq是一组'魔术组合键',只要内核没有被完全锁住,不管内核在做什么事情,使用这些组合键可以立即打印出内核的信息。使用sysrq组合键是了解系统目前
运行情况的最好方式。如果系统出现挂起的情况或者在诊断一些和内核相关,比较怪异,比较难重现的问题的时候,使用sysrq键是一个比较好的方式。
在使用sysrq-trigger之前必须在内核中打开sysrq
CONFIG_MAGIC_SYSRQ=y
参看sysrq的值
#sysctl -a |grep sysrq
kernel.sysrq = 0
或者
#cat /proc/sys/kernel/sysrq
0
用sysctl修改sysrq的值
#sysctl -w kernel.sysrq=1 #修改内存中的内核参数
kernel.sysrq = 1
还可以用echo修改sysrq的值:
# echo 1 > /proc/sys/kernel/sysrq
关闭这个功能:
# echo 0 > /proc/sys/kernel/sysrq
看看sysrq-trigger的帮助信息
#echo -h> /proc/sysrq-trigger
#dmesg
SysRq : HELP : loglevel0-8 reBoot Crashdump tErm Full kIll saK showMem Nice powerOff showPc unRaw Sync showTasks Unmount shoWcpus
当我触发一个sysrq事件的时候,结果保存在什么地方?
当一个sysrq命令被触发,内核将会打印信息到内核的环形缓冲并输出到系统控制台。此信息一般也会通过syslog输出到/var/log/messages.
有时候,可能系统已经无法响应,syslogd可能无法记录此信息。在这种情况下,建议您配置一个串口终端来收集这个信息。
那些类型的sysrq事件可以被触发?
sysrq功能被打开后,有几种sysrq事件可以被触发。不同的内核版本可能会有些不同。但有一些是共用的:
* m - 导出关于内存分配的信息
* t - 导出线程状态信息
* p - 到处当前CPU寄存器信息和标志位的信息
* c - 故意让系统崩溃(在使用netdump或者diskdump的时候有用)
* s - 立即同步所有挂载的文件系统
* u - 立即重新挂载所有的文件系统为只读
* b - 立即重新启动系统
* o - 立即关机(如果机器配置并支持此项功能)
如何添加自己的sysrq.
#include <linux/sysrq.h>
static void read_xxx(void)
{
printk("call read_xxx\n");
}
static int loop_xxx = 0;
static void xxx_work_fn(struct work_struct *work);
static DECLARE_DELAYED_WORK(work_xxx, xxx_work_fn);
static void xxx_work_fn(struct work_struct *work)
{
read_xxx();
if (loop_xxx) {
schedule_delayed_work(&work_xxx, 200);
}
}
static void handle_xxx(int key)
{
schedule_delayed_work(&work_xxx, 200);
loop_xxx = !loop_xxx;
}
static struct sysrq_key_op sysrq_xxx_op = {
.handler = handle_xxx,
.help_msg = "xxx-fordebug(G)",
.action_msg = "XXX",
.enable_mask = SYSRQ_ENABLE_BOOT,
};
static int xxxxx_init(void)
{
register_sysrq_key('g', &sysrq_xxx_op);
printk("------------------------------- xxxxx_init -----------------\n");
return 0;
}
late_initcall(xxxxx_init);