2、网络配置核心:静态IP配置、DHCP配置、DNS配置、网关配置、多网卡配置
嵌入式Linux的网络配置,说白了就是让设备能“说话”。我刚开始做Yocto项目时,总觉得网络配置不就是改几个文件嘛,结果第一次给客户部署,设备死活连不上服务器。排查了半天,发现是网关配错了。嗯,从那以后,我对网络配置这块就格外上心。
今天咱们就把网络配置的五个核心点掰开揉碎讲清楚。你想想看,一个设备要上网,至少需要知道三件事:自己的地址(IP)、找谁问路(网关)、怎么解析名字(DNS)。多网卡场景下,还得考虑路由优先级。咱们一个一个来。
核心要点:Yocto中网络配置的最终落脚点是 /etc/network/interfaces 或 systemd-networkd 的配置文件。不管你用哪种方式,底层原理都一样。
2.1 静态IP配置
静态IP,就是给设备一个固定的“门牌号”。我习惯在产线部署时用静态IP,这样方便远程SSH登录。你想想看,如果设备每次重启IP都变,运维人员不得疯掉?
在Yocto中,我推荐用 systemd-networkd 来管理网络。为什么?因为它更现代,而且跟systemd生态无缝集成。配置起来也很简单:
# /etc/systemd/network/10-eth0.network
[Match]
Name=eth0
[Network]
Address=192.168.1.100/24
Gateway=192.168.1.1
DNS=8.8.8.8
DNS=114.114.114.114
这里要注意,Address 后面的 /24 是子网掩码的简写,相当于255.255.255.0。我在项目中遇到过有人忘了写子网掩码,结果设备能ping通网关,但就是访问不了外网。排查了半天,发现是路由表出了问题。
我的小技巧:配置完静态IP后,记得用 ip addr show 确认地址生效。别问我为什么强调这个——我曾经在客户现场发现配置没生效,结果是因为网口名字写错了(eth0写成了ethO,字母O和数字0搞混了)。
2.2 DHCP配置
DHCP,说白了就是让设备自动获取IP。适合开发板调试、或者设备数量多的场景。我个人习惯在开发阶段用DHCP,省事。但生产环境我一般用静态IP,原因后面说。
配置DHCP同样用 systemd-networkd:
# /etc/systemd/network/20-eth0-dhcp.network
[Match]
Name=eth0
[Network]
DHCP=yes
[DHCP]
UseDNS=yes
UseNTP=yes
这里 UseDNS=yes 表示从DHCP服务器获取DNS配置。UseNTP=yes 则是获取NTP服务器地址。嗯,这个功能很实用,设备上电就能自动同步时间。
注意:DHCP获取的IP是有租期的。我曾经遇到过设备运行了几天后突然断网,排查发现是DHCP租期到了,但设备没有续约成功。所以,关键设备还是用静态IP稳妥。
2.3 DNS配置
DNS配置,就是告诉设备“怎么把域名翻译成IP”。你想想看,没有DNS,你连百度都访问不了,只能记IP地址——这谁受得了?
在Yocto中,DNS配置有两种方式:
| 方式 | 配置文件 | 适用场景 |
|---|---|---|
| 全局配置 | /etc/resolv.conf |
所有网络接口共用 |
| 接口级配置 | systemd-networkd 配置中的 DNS= |
多网卡时不同接口用不同DNS |
我个人习惯用 systemd-networkd 的接口级配置,因为更灵活。比如,eth0连外网用8.8.8.8,eth1连内网用公司内部的DNS服务器。
# 全局DNS配置示例
# /etc/resolv.conf
nameserver 8.8.8.8
nameserver 114.114.114.114
避坑指南:我曾经在项目中遇到一个问题:设备能ping通IP,但ping不通域名。排查发现是 /etc/resolv.conf 被某个服务覆盖了。后来我改用 systemd-resolved 来管理DNS,再也没出过这个问题。
2.4 网关配置
网关,就是设备访问外网的“大门”。配置错了,设备就只能在内网里打转。我刚开始做嵌入式时,觉得网关配置很简单,直到有一次设备能ping通网关,但就是访问不了外网——你猜怎么着?网关地址写错了,写成了192.168.1.254,但实际网关是192.168.1.1。
在 systemd-networkd 中配置网关:
# 单网关配置
[Network]
Gateway=192.168.1.1
# 多网关配置(主备模式)
[Network]
Gateway=192.168.1.1
Gateway=192.168.1.254
多网关配置时,默认会使用第一个网关作为主网关,第二个作为备份。只有当主网关不可达时,才会切换到备份网关。这个机制很实用,我在工业项目中经常用到。
检查网关是否生效:
# 查看路由表
ip route show
# 输出示例
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
2.5 多网卡配置
多网卡配置,是嵌入式设备中常见的场景。比如,一个网口连外网,一个网口连内网设备。配置不好,就会出现“路由冲突”——设备不知道该从哪个口出去。
我做过一个项目,设备有3个网口:eth0连外网,eth1连摄像头,eth2连PLC。刚开始配置时,设备总是从eth1出去访问外网,结果当然访问不了。后来我通过配置路由优先级解决了这个问题。
多网卡配置的核心思路:
- 明确每个网口的用途:哪个连外网,哪个连内网
- 配置默认路由:只让连外网的网口有默认网关
- 配置静态路由:内网网口只添加对应的网段路由
# eth0 - 外网接口
# /etc/systemd/network/10-eth0.network
[Match]
Name=eth0
[Network]
Address=192.168.1.100/24
Gateway=192.168.1.1
DNS=8.8.8.8
# eth1 - 内网接口(连摄像头)
# /etc/systemd/network/20-eth1.network
[Match]
Name=eth1
[Network]
Address=10.0.0.100/24
# 注意:这里不配置Gateway,只配置内网路由
配置完以后,记得添加静态路由:
# 添加静态路由,让访问10.0.0.0/24网段走eth1
ip route add 10.0.0.0/24 dev eth1
# 查看路由表确认
ip route show
重要提醒:多网卡配置时,千万不要给多个网口都配置默认网关。否则设备会随机选择一个网关出去,导致网络不稳定。我曾经在项目中见过这个问题,排查了两天才发现是配置了双默认网关。
2.6 知识体系总览
下面这张图,是我梳理的网络配置核心知识体系。你把它理解了,Yocto网络配置这块基本就通了。
这张图把五个核心配置的关系理清楚了。静态IP和DHCP是IP地址的两种获取方式,DNS负责域名解析,网关负责跨网段通信,多网卡则是在此基础上的进阶应用。你掌握了这些,Yocto网络配置这块基本就稳了。
我的经验总结:网络配置最怕“想当然”。每次改完配置,一定要用 ip addr、ip route、ping 这三个命令验证。我曾经因为少验证一步,在客户现场折腾了三个小时——嗯,从那以后,验证步骤我一次都不敢省。
好了,网络配置的核心内容就这些。记住,配置是死的,思路是活的。遇到问题多想想“数据包是怎么走的”,很多问题就迎刃而解了。