
目录
大家好,我是情报小哥。
有一次调试一块没有引出串口的嵌入式板子,内核 panic 后什么日志也没留下来——磁盘来不及写,dmesg 环形缓冲区跟着重启清零了。
后来同事甩过来一句:开 netconsole 啊。
一搜才发现,U-Boot 和 Linux 内核里各有一个 NetConsole,名字差不多,东西完全不一样。
今天就把这个坑理清楚。
先看对比:
| U-Boot NetConsole | Kernel NetConsole | |
|---|---|---|
net/netconsole.c | drivers/net/netconsole.c | |
| 双向 | 只发不收 | |

(图1:U-Boot 与 Kernel 双 NetConsole 对比)
一句话区分:U-Boot 的是"远程终端",Kernel 的是"远程日志"。
U-Boot 设计 NetConsole 的动机很实在:嵌入式板子不一定有串口,但大概率有网口。
它把 stdin/stdout/stderr 全切到 UDP 上,开发机通过网络就能操作 U-Boot:
# 板子 U-Boot 端设置setenv ethaddr 00:11:22:33:44:55setenv ipaddr 192.168.1.10setenv serverip 192.168.1.20setenv ncip 192.168.1.20 # 你开发机的 IP# 把标准输入输出全切到网络setenv stdin ncsetenv stdout ncsetenv stderr nc然后开发机开个 UDP 监听:
# U-Boot 源码 tools/ 目录自带接收工具./tools/netconsole 6666这时候你在开发机键盘上敲的 printenv、tftp、boot,全是通过 UDP 包发到板子执行的,输出也原路返回。
什么场景用得着?
内核里的 netconsole 就不一样了,它只管发,不管收。
内核 printk ──→ netconsole 模块 ──→ UDP (目标端口 6666) ──→ 远程 syslog/你的开发机它做的事情就是:在 printk 的路径上挂个钩子,每条内核消息除了往环形缓冲区写,还顺手组装成 UDP 包丢出去。

(图2:Kernel NetConsole 内部数据流)
为什么只发不收?
不是做不了,而是没必要。内核启动后有 SSH、telnet 这些用户态的远程登录手段,不需要在内核态再搞一个网络终端。而且从网络接收输入来操作内核,攻击面太大,得不偿失。
那它"只发"可靠吗?
正因为功能单一,它在极端场景下特别能打:
使用方式也简单:
# 加载模块,指定本地和目标信息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 参数,内核一启动就加载模块,越早越好——连内核早期初始化的日志都不会丢。
搞清楚这两个东西的区别,下次遇到没串口的板子,或者内核莫名其妙重启的时候,就知道该掏哪个工具了。
星标公众号,第一时间看文章!
小哥搜集了一些嵌入式学习资料,公众号内回复【1024】即可找到下载链接!
推荐好文点击蓝色字体即可跳转
☞专辑|Linux应用程序编程大全 ☞ 专辑|学点网络知识 ☞ 专辑|手撕C语言 ☞ 专辑|手撕C++语言 ☞ 专辑|经验分享 ☞ 专辑|从单片机到Linux ☞ 专辑|电能控制技术 ☞ 专辑|嵌入式必备数学知识 ☞ MCU进阶专辑
☞ 经验分享