3、网络调试工具:ifconfig、ip、ping、traceroute、netstat、ss、tcpdump、wireshark在Yocto中的使用

做嵌入式Linux开发,网络调试是家常便饭。Yocto构建的系统跟桌面发行版不太一样——很多工具默认是不装的,得你自己加。我刚开始用Yocto那会儿,就吃过这个亏:板子起不来网,想用ifconfig看一眼,结果告诉我命令找不到。嗯,那感觉挺尴尬的。

今天咱们就把这些网络调试工具在Yocto里的用法捋一遍。说白了,就是告诉你每个工具是干嘛的、怎么加到镜像里、实际项目中怎么用。

核心观点:Yocto里网络工具不是标配,你得主动往IMAGE_INSTALL里加。加对了,调试事半功倍;加错了,板子跑起来你只能干瞪眼。

3.1 ifconfig 和 ip:网络接口配置的老将与新秀

ifconfig是传统工具,属于net-tools包。ip是新一代工具,属于iproute2包。我个人习惯用ip,因为它功能更全,而且Yocto里iproute2默认就带了,省事。

在Yocto里加这两个工具很简单:

# 在local.conf或你的recipe里加
IMAGE_INSTALL_append = " net-tools iproute2"

我在项目中遇到过一个问题:用ifconfig配了IP,但重启后设置就丢了。后来发现ifconfig只是临时生效,要想持久化得用ip配合systemd-networkd或者connman。你想想看,如果生产环境里网络配置重启就丢,那得多坑。

常用命令对比:

功能 ifconfig ip
查看所有接口 ifconfig -a ip link show
查看IP地址 ifconfig eth0 ip addr show eth0
设置IP地址 ifconfig eth0 192.168.1.100 netmask 255.255.255.0 ip addr add 192.168.1.100/24 dev eth0
启用/禁用接口 ifconfig eth0 up/down ip link set eth0 up/down

我的建议:新项目直接用ip。Yocto的core-image-base里默认就有iproute2,省得你再加net-tools。除非你维护的是老项目,否则别折腾ifconfig了。

3.2 ping 和 traceroute:连通性测试的黄金搭档

ping属于busybox或者iputils包。Yocto的busybox默认就带了ping,但功能阉割得厉害——不支持-c参数指定次数,也不支持-s设置包大小。我建议你加iputils,功能完整得多。

IMAGE_INSTALL_append = " iputils"

traceroute属于traceroute包,需要单独加:

IMAGE_INSTALL_append = " traceroute"

实际调试时,我一般这么用:

  • 先ping网关:ping -c 4 192.168.1.1,看本地网络通不通
  • 再ping外网:ping -c 4 8.8.8.8,看路由和DNS正不正常
  • 最后traceroute:traceroute -n 8.8.8.8,看数据包走了哪些跳

我曾经遇到过一个怪问题:板子能ping通网关,但死活ping不通外网。用traceroute一看,发现数据包到了网关就停了——原来是网关没配NAT。你想想看,如果没有traceroute,我可能还在傻乎乎地查板子配置呢。

注意:Yocto的busybox版ping默认不带-c参数,会一直ping下去。如果你不想手动Ctrl+C,记得加iputils。我曾经在自动化测试脚本里用ping,结果脚本卡死了——嗯,从那以后我再也不敢用busybox的ping了。

3.3 netstat 和 ss:端口与连接状态查看

netstat属于net-tools包,ss属于iproute2包。跟ifconfig和ip的关系一样,ss是netstat的现代替代品。我个人强烈推荐用ss,它更快、信息更全。

在Yocto里:

# netstat需要net-tools
IMAGE_INSTALL_append = " net-tools"

# ss在iproute2里,默认就有
# 不需要额外加

常用场景:

  • 查看所有监听端口:ss -tlnp(TCP)或ss -ulnp(UDP)
  • 查看当前连接:ss -tunp
  • 按端口过滤:ss -tlnp sport = :80
  • 按状态过滤:ss -tlnp state established

我在项目中遇到过一个问题:板子上跑了一个Web服务器,但客户端就是连不上。用ss -tlnp一看,发现80端口根本没在监听——原来是服务启动失败了。如果没有ss,你可能还在怀疑是防火墙的问题。

避坑指南:我曾经在Yocto里用netstat -anp,结果输出慢得要命,还经常卡住。后来换成ss -tlnp,瞬间出结果。原因很简单——netstat要遍历/proc下的所有进程,而ss直接从内核的socket表里读数据。所以,能用ss就别用netstat。

3.4 tcpdump 和 wireshark:抓包分析的双刃剑

tcpdump是命令行抓包工具,属于tcpdump包。wireshark是图形化抓包工具,属于wireshark包。在嵌入式板子上,我一般只用tcpdump,因为wireshark太吃资源了。但如果你有图形界面,wireshark确实更方便。

在Yocto里加它们:

IMAGE_INSTALL_append = " tcpdump"

# wireshark需要图形支持,一般用在有GUI的镜像里
IMAGE_INSTALL_append = " wireshark"

实际调试时,我常用的tcpdump命令:

  • 抓所有包:tcpdump -i eth0
  • 抓指定端口的包:tcpdump -i eth0 port 80
  • 抓指定主机的包:tcpdump -i eth0 host 192.168.1.100
  • 保存到文件:tcpdump -i eth0 -w capture.pcap
  • 读取文件:tcpdump -r capture.pcap

我曾经遇到过一个诡异的问题:板子跟服务器通信,偶尔会丢包。用tcpdump抓包一看,发现服务器回了数据,但板子没收到——原来是板子的网卡驱动有bug,在特定流量下会丢包。如果没有tcpdump,这种问题根本没法定位。

注意:在Yocto里用tcpdump,记得把libpcap也加上。另外,嵌入式板子的存储空间有限,抓包文件别太大。我一般用-c 100限制抓包数量,或者用-s 0只抓包头。

3.5 知识体系总览

下面这张图,是我自己总结的网络调试工具知识体系。你可以把它当成一个速查表,遇到问题就知道该用哪个工具了。

Yocto网络调试工具知识体系 网络调试工具 配置类工具 连通性测试 状态与抓包 ifconfig ip ping traceroute netstat/ss tcpdump/wireshark net-tools iproute2 iputils traceroute net-tools/iproute2 tcpdump/wireshark 调试思路总结 1. 先配IP(ip/ifconfig)→ 2. 测连通(ping/traceroute) 3. 查端口(ss/netstat)→ 4. 抓包分析(tcpdump/wireshark)

这张图把工具分成了三类:配置类、连通性测试、状态与抓包。实际调试时,我一般按这个顺序来:先配好IP,再测连通性,如果还不行就查端口状态,最后才抓包。你想想看,如果一上来就抓包,那得看多少无用数据?

我的经验:在Yocto里,我一般会在local.conf里加一行IMAGE_INSTALL_append = " iproute2 iputils tcpdump traceroute"。这样不管遇到什么网络问题,手头都有工具可用。至于net-tools和wireshark,除非有特殊需求,否则我一般不装——前者太老,后者太重。

好了,网络调试工具就聊到这儿。记住一句话:工具是死的,思路是活的。遇到问题别慌,按顺序排查,总能找到根因。

可可精品资料库