[hardware development] 内核调试手段: 通过网络控制台打印死机现场
Tofloor
poster avatar
忘怀
deepin
7 hours ago
Author

常常遇到死机的问题抓不到日志无法报告怎么办?

如何避免瞎猜或者用水晶球或者算卦的情形?

如果内核没有挂掉可以求助于内核日志信息,如果内核也挂了,该如何抓住死机现场?

一般来说这时候可以使用串口接入电脑并设置console=ttyS0或者有些是console=ttyAMA0之类的。

如果没有串口怎么办,这时候可以请出我们的网络控制台netconsole模块充当串口。

可以通过zcat /proc/config.gz | grep XXX命令来看某个内核配置是否打开

网络控制台串口需要的是复现机器上有CONFIG_NETCONSOLE + CONFIG_NETCONSOLE_DYNAMIC这两个内核配置

在接收内核日志的机器终端上运行 nc -u -l -p 6666 | tee /tmp/klog.txt接收6666端口的数据

在复现问题机器的终端上以root权限对netconsole模块进行一通配置

  1. modprobe netconsole 这里意思是加载这个内核模块 如果是内核配置=y而不是=m就默认加载不需要这一步了
  2. mount -t configfs none /sys/kernel/config 这里意思是把configfs文件系统挂载出来来配置netconsole 如果自动挂载在这里了也不需要配置这一步了
  3. mkdir /sys/kernel/config/netconsole/target1 这里意思是新建一个netconsole配置
  4. cd /sys/kernel/config/netconsole/target1 进入这个配置文件夹
  5. echo enp2s0 > dev_name 这里意思是 enp2s0 是复现机器要发送数据的网口接口名,可以通过ip a之类的命令查到
  6. echo 192.168.1.10 > local_ip 类似的 这个是 复现机器的网口IP
  7. echo 6666 > local_port 类似的 这个是 复现机器的网口发送端口
  8. echo 6666 > remote_port 这个是接收内核日志的机器的nc接收的端口
  9. echo 192.168.1.20 > remote_ip 这个是接收内核日志的机器的nc接收的ip地址
  10. echo 1 > enabled 启用netconsole功能
  11. echo 8 > /proc/sys/kernel/printk 把控制台的输出级别调到最高这样就会输出所有级别的日志(一般还得通过打开具体的动态打印来补充更多信息)
  12. echo xxx > /dev/kmsg 这个是测试命令 用来产生一个新的内核日志 测试对端是否能收到新产生的日志
Reply Favorite View the author
All Replies

No replies yet