找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3880

积分

0

好友

514

主题
发表于 2 小时前 | 查看: 3| 回复: 0

目录

  • 从一次调试翻车说起
  • 两个同名模块,各自干吗的
  • U-Boot NetConsole:远程“操控”用
  • Kernel NetConsole:专门“抓日志”用
  • 该怎么选?

从一次调试翻车说起

有一次调试一块没有引出串口的嵌入式板子,内核 panic 后什么日志也没留下来——磁盘来不及写,dmesg 环形缓冲区也跟着重启清零了。

后来同事甩过来一句:开 netconsole 啊。

一搜才发现,U-Boot 和 Linux 内核里各有一个 NetConsole,名字差不多,东西完全不一样。

今天就把这个坑理清楚。

两个同名模块,各自干吗的

先看对比:

U-Boot NetConsole Kernel NetConsole
代码位置 U-Boot 源码 net/netconsole.c Linux 内核 drivers/net/netconsole.c
工作阶段 上电 → 内核启动前 内核启动后
通信方向 双向(能收能发) 只发不收(output-only)
作用 远程操作 U-Boot、敲命令 抓内核日志(尤其 panic)
典型场景 无串口时替代串口 内核崩溃时保住最后一口气

U-Boot 与 Kernel 双 NetConsole 架构对比图

(图1:U-Boot 与 Kernel 双 NetConsole 对比)

一句话区分:U-Boot 的是“远程终端”,Kernel 的是“远程日志”

U-Boot NetConsole:远程“操控”用

U-Boot 设计 NetConsole 的动机很实在:嵌入式板子不一定有串口,但大概率有网口。

它把 stdin/stdout/stderr 全切到 UDP,开发机通过网络就能操作 U-Boot:

# 板子 U-Boot 端设置
setenv ethaddr 00:11:22:33:44:55
setenv ipaddr 192.168.1.10
setenv serverip 192.168.1.20
setenv ncip 192.168.1.20     # 你开发机的 IP

# 把标准输入输出全切到网络
setenv stdin nc
setenv stdout nc
setenv stderr nc

然后开发机开个 UDP 监听:

# U-Boot 源码 tools/ 目录自带接收工具
./tools/netconsole 6666

这时候你在开发机键盘上敲的 printenvtftpboot,全是通过 UDP 包发到板子执行的,输出也原路返回。

什么场景用得着?

  • 产品板子没引出串口,想改 U-Boot 参数只能走网口
  • 工厂批量烧录,一台电脑同时操多块板子,比串口一个一个插快得多

Kernel NetConsole:专门“抓日志”用

内核里的 netconsole 就不一样了,它只管发,不管收

内核 printk ──→ netconsole 模块 ──→ UDP (目标端口 6666) ──→ 远程 syslog/你的开发机

它做的事情就是:在 printk 的路径上挂个钩子,每条内核消息除了往环形缓冲区写,还顺手组装成 UDP 包丢出去。

Kernel NetConsole 内部数据流

(图2:Kernel NetConsole 内部数据流)

为什么只发不收?

不是做不了,而是没必要。内核启动后有 SSH、telnet 这些用户态的远程登录手段,不需要在内核态再搞一个网络终端。而且从网络接收输入来操作内核,攻击面太大,得不偿失。

那它“只发”可靠吗?

正因为功能单一,它在极端场景下特别能打:

  • 网卡驱动没挂,日志就能发出去,不依赖磁盘和文件系统
  • 支持在中断上下文直接发 UDP,panic 时调度器停了照样干活
  • 支持多目标同时发送,一份日志发到多个接收端
  • 开销极小,不影响系统性能

使用方式也简单:

# 加载模块,指定本地和目标信息
modprobe netconsole netconsole=4444@192.168.1.10/eth0,6666@192.168.1.20/

# 或者写进内核启动参数(U-Boot bootargs 传入)
# console=ttyS0,115200 netconsole=4444@192.168.1.10/eth0,6666@192.168.1.20/

接收端用 netcat 就行:

nc -u -l 6666

在 U-Boot 里通过 bootargs 传入 netconsole 参数,内核一启动就加载模块,越早越好——连内核早期初始化的日志都不会丢。

该怎么选?

场景 用哪个
设备没串口,想操作 U-Boot U-Boot NetConsole
内核莫名崩溃,想抓 panic 日志 Kernel NetConsole
两者都要 两个都配上,U-Boot 管启动,内核接管日志

搞清楚这两个东西的区别,下次遇到没串口的板子,或者内核莫名其妙重启的时候,就知道该掏哪个工具了。更多嵌入式实战技巧可查阅 技术文档,欢迎访问云栈社区。




上一篇:微软 WSL 3 规划揭秘:原生 Linux 容器、GPU/NPU 加速,强力提升 Windows 开发体验
下一篇:你每天见到的红色波浪线,今年31岁了:纪念拼写检查背后的程序员
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-6-25 05:21 , Processed in 0.697900 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表