您的位置:首页 > 运维架构

远程监控内核死机的一种方法

2009-09-22 21:53 148 查看
开发背景:
最近开发一个内核项目时,遇到一个服务器内核维护的问题: 服务器存放在很远的电信机房内,只能通过ssh连接上服务器,当服务器的内核死机时,没有办法看到死机时内核打印的调试信息。因此需要开放一个内核维护模块。

通过查找,发现当前内核已经存在几个模块用于debug内核,如LKCD, netconsole模块,还有kexec模块,KDB等模块。 其实,比较贴近需求的是netconsole模块,该模块可以把内核的debug信息发送给远端主机,但一但启用,所有的信息都会马上发送到网络远端,而我的目的是:内核Crash时,才把debug信息,包含Oops, panic信息,以及开发模块的诊断信息发送给远端。因此我决定写一个Debug模块。

技术要点:
1. 通过netpoll实现低层发送UDP数据报文。
2. 注册panic notifier实例,当内核挂机之前,会回调实例函数,这样就可以在挂起前发送被debug模块的诊断信息以及Panic相关信息。
3. 替换内核dump回调函数dump_function_ptr为自定义的dump回调函数,内核Oops时会调用dump函数,参考LKCD的dump()函数,修改内核include/linux/dump.h的默认dump函数。

这样,当内核Crash发生时,会通过printk打印出内核出错信息,然后回调自定义的回调函数2或者3,在回调函数中注册一个console实例,就会调用console的write函数,write函数再通过netpoll把内核的log buffer的信息全部发送给远端主机输出到中。

实测过程:
远端主机使用netcat来侦听coredump消息端口。
netcat -l -u -p 51002
当内核crash后,远端主机终端可以看到如下信息:


Unable to handle kernel paging request at 0000000098761111 RIP:
<ffffffff880074c0>{:kccd:kccd_kmq_event_proc+97}
PGD d6b4067 PUD 0
Oops: 0002 [1]
last sysfs file:
CPU 0
Modules linked in: kccd mque
Pid: 622, comm: kccd Tainted: PF U 2.6.16.60-0.21-default #25
RIP: 0010:[<ffffffff880074c0>] <ffffffff880074c0>{:kccd:kccd_kmq_event_proc+97}
RSP: 0000:ffff81000c2ddda8 EFLAGS: 00010046
RAX: 0000000000000000 RBX: 00007fffffc094f0 RCX: 000000000000000c
RDX: ffff81000f5c4400 RSI: ffffffff8167c950 RDI: 0000000098761111
RBP: 0000000000000001 R08: 0000000023bdcff2 R09: ffff81000fb726c0
R10: 0000000000000000 R11: 0000000000000002 R12: 00007fffffc094f0
R13: ffff81000d793f50 R14: 0000000000000000 R15: 000000000050e6b9
FS: 00002b5528878e30(0000) GS:ffffffff81611000(0000) knlGS:00000000082dc840
CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
CR2: 0000000098761111 CR3: 000000000f5fd000 CR4: 00000000000006e0
Process kccd (pid: 622, threadinfo ffff81000c2dc000, task ffff81000f9cf0c0)
Stack: 00000000000b8494 0000000000000000 ffff81000f5c4400 ffff81000f8e4340
00000000045d8000 0000000100000000 ffff81000c2dde18 0000000000000096
0000000000000002 ffff81000f5c4400
Call Trace: <ffffffff8102684e>{__wake_up_common+61}
<ffffffff88007b3d>{:kccd:kccd_thread+265} <ffffffff8100b5ae>{child_rip+8}
<ffffffff88007a34>{:kccd:kccd_thread+0} <ffffffff8100b5a6>{child_rip+0}

Code: f3 ab 48 8d 9c 24 9c 00 00 00 48 8d bc 24 90 00 00 00 48 c7
=======kccd dump happend!!! dump_str:Oops
=======
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: