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

开发背景:

最近开发一个内核项目时,遇到一个服务器内核维护的问题: 服务器存放在很远的电信机房内,只能通过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函数,参考LKCDdump()函数,修改内核include/linux/dump.h的默认dump函数。

 

这样,当内核Crash发生时,会通过printk打印出内核出错信息,然后回调自定义的回调函数2或者3,在回调函数中注册一个console实例,就会调用consolewrite函数,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

=======

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值