目录
- 从一次调试翻车说起
- 两个同名模块,各自干吗的
- 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) |
| 典型场景 |
无串口时替代串口 |
内核崩溃时保住最后一口气 |

(图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
这时候你在开发机键盘上敲的 printenv、tftp、boot,全是通过 UDP 包发到板子执行的,输出也原路返回。
什么场景用得着?
- 产品板子没引出串口,想改 U-Boot 参数只能走网口
- 工厂批量烧录,一台电脑同时操多块板子,比串口一个一个插快得多
Kernel NetConsole:专门“抓日志”用
内核里的 netconsole 就不一样了,它只管发,不管收。
内核 printk ──→ netconsole 模块 ──→ UDP (目标端口 6666) ──→ 远程 syslog/你的开发机
它做的事情就是:在 printk 的路径上挂个钩子,每条内核消息除了往环形缓冲区写,还顺手组装成 UDP 包丢出去。

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