您的位置:首页 > 其它

如何使用sysrq及添加自己的sysrq

2012-10-18 20:11 183 查看
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);

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct kill 终端 c