获取Linux内核卡死前的日志

背景

在Linux驱动调试工作中,如果遇到内核卡死,只能断电复位,复位后打开/var/log/syslog文件,会发现卡死时的日志都丢了。
原因我猜是内核卡死后文件系统的缓存无法同步到磁盘,于是掉电时卡死前的日志就丢了。
而这些日志对我们定位问题意义重大,有了这些日志,我们才知道卡死的原因是空指针?还是死锁?还是死循环?

解决方案1 串口转发

连接设备串口到上位机,然后配置好串口调试工具的波特率等参数,同时下位机在ubootgrub里配好console参数值(一般是console=/dev/ttyS0,115200之类的),串口打印就能看到了

优点:

  • 日志详尽,几乎不会丢日志

缺点:

  • 配置比较复杂
  • 操作麻烦,调试串口一般不对外开放,可能要拆机器
  • 上位机和下位机必须在一起,无法远程调试

解决方案2 实时轮询syslog文件

ssh连接到设备后,执行下面命令

watch -n 1 tail -30 /var/log/syslog

上面命令的意思是每间隔1s打印syslog文件的最后30行。这样当内核卡死时,watch命令已经将日志从文件系统缓存搬移到屏幕缓存,所以日志信息不会丢

优点:

  • 配置最为简单
  • 不像串口需要专门连线,只使用网口即可,操作简单

缺点:

  • 极端情况下会丢1s的日志
  • 日志回看不方便

更准确的说,该方法其实是ssh转发文件系统缓存。一般情况下,该方法也够用了。

解决方案3 网口转发

rsyslog系统主动向上位机转发日志,需要上位机显式接收

优点:

  • 不像串口需要专门连线,只使用网口即可,操作简单
  • 日志虽然没有串口详尽,但比watch命令版本要详尽,绝大部分场景够用了
  • 回看方便

缺点:

  • 配置比较复杂,不信往下看

发送端修改

修改设备的rsyslog配置文件,一般在/etc/rsyslog.d/50-default.conf,添加一行UDP转发规则

#  Default rules for rsyslog.
#
#           For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*         /var/log/auth.log
*.*;auth,authpriv.none      -/var/log/syslog
#cron.*             /var/log/cron.log
#daemon.*           -/var/log/daemon.log
kern.*              -/var/log/kern.log
#lpr.*              -/var/log/lpr.log
mail.*              -/var/log/mail.log
#user.*             -/var/log/user.log
*.*;auth,authpriv.none      @192.168.20.103     #将日志以UDP形式转发到目标IP

接收端修改

接收端一般是Windows上位机,需要修改防火墙设置,开放syslog协议对应的514端口,否则Windows会拒绝接收
514端口禁止访问

添加防火墙通行规则
  1. 新建入站规则
    获取Linux内核卡死前的日志_第1张图片

  2. 应用于UDP 514端口
    获取Linux内核卡死前的日志_第2张图片

  3. 允许访问该端口
    获取Linux内核卡死前的日志_第3张图片

  4. 应用该规则到所有场景
    获取Linux内核卡死前的日志_第4张图片

  5. 给规则起一个有意义的名字
    获取Linux内核卡死前的日志_第5张图片

用rsyslog Windows agent做接收软件

怎么配都收不到,放弃!

用wireshark做接收软件

注意在过滤器栏填写syslog,这样就只显示syslog日志了。
获取Linux内核卡死前的日志_第6张图片

总结

只要思想不滑坡,办法总比困难多。

你可能感兴趣的:(linux软件,驱动开发,linux,syslog,rsyslog)