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

来源:互联网 发布:google拼音 linux 编辑:程序博客网 时间:2024/06/05 10:20

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);

 

原创粉丝点击