
RK3588这类国产高性能ARM平台现在拿来做边缘网关、工业控制、多网口设备的团队越来越多。板子到手系统跑起来第一件让人卡住的事往往不是NPU跑模型也不是VPU硬解而是最基础的网络配置——尤其是双网口场景。我见过太多人在这上面耗掉一整个下午eth0通了eth1不通重启之后IP又没了两个网口互相打架或者配完发现SSH连不上只能抱着串口线干瞪眼。这篇就把RK3588 Linux环境下双网口静态IP配置这件事彻底讲透从网口识别、配置文件写法、双网口路由隔离到重启失效、网口冲突这些高频坑全部给出手把手的排查链路。不管你是刚拿到正点原子RK3588板子的新手还是已经在做RK3588 Ubuntu移植的老手这篇内容都能直接抄作业。1. 先搞清楚RK3588的网口到底长什么样1.1 硬件层面的双网口拓扑RK3588芯片本身集成了两路GMAC千兆以太网控制器这是它能原生支持双网口的硬件基础。但注意芯片支持不等于板子一定引出两个口。市面上常见的RK3588开发板网络配置大致分三种情况双GMAC直出两颗PHY芯片分别接GMAC0和GMAC1对应eth0和eth1这是最标准的双网口形态。单GMAC 交换机芯片一颗PHY加一颗交换芯片扩展出多个口这种本质上还是一个网段做双网口隔离意义不大。单网口 USB网卡板子只引出一个GMAC另一个口靠USB转以太网这种在系统里可能显示为eth1也可能是enx开头的名字。你在配置之前第一件事是确认自己的板子属于哪种。用下面这条命令看网口列表ip link show或者更直观的ls /sys/class/net/如果看到eth0、eth1两个独立接口且ethtool -i eth0和ethtool -i eth1显示的driver不同或bus-info不同那基本就是双GMAC独立方案。这一步看着简单但我踩过的坑是有些板子eth1其实是交换芯片的虚拟口你给它配了不同网段结果数据包还是从eth0出去因为底层是同一个MAC。所以先确认拓扑再谈配置。1.2 设备树里的网口节点确认RK3588的网口在设备树DTS里对应gmac0和gmac1节点。如果你是自己移植Ubuntu或者构建镜像需要确认这两个节点都使能了且PHY地址、复位GPIO、时钟配置正确。常见的设备树片段长这样gmac0 { phy-mode rgmii-rxid; clock_in_out output; snps,reset-gpio gpio3 RK_PB7 GPIO_ACTIVE_LOW; snps,reset-active-low; snps,reset-delays-us 0 20000 100000; pinctrl-names default; pinctrl-0 gmac0_miim gmac0_tx_bus2 gmac0_rx_bus2 gmac0_rgmii_clk gmac0_rgmii_bus; phy-handle rgmii_phy0; status okay; };如果设备树里gmac1的status是disabled那系统里根本不会出现eth1这时候你配什么IP都是白搭。判断方法很简单dmesg | grep -i gmac看内核启动日志里有没有两个GMAC的初始化信息。这一步是很多新手忽略的他们拿到板子发现只有一个网口以为是系统问题其实是设备树没开。1.3 网口命名规则与udev的影响Linux网口命名现在有两种风格传统的eth0/eth1和基于固件信息的enP*/enx*。RK3588的Ubuntu镜像默认大多还是eth0/eth1但如果你用的是较新的systemd版本可能会变成基于PCI路径的命名。命名规则由/etc/systemd/network/或/lib/udev/rules.d/下的规则决定。我建议在RK3588这种嵌入式场景下统一固定成eth0/eth1因为很多工业软件和脚本都默认这个名字。固定方法是在内核cmdline里加net.ifnames0或者写udev规则# /etc/udev/rules.d/70-persistent-net.rules SUBSYSTEMnet, ACTIONadd, DRIVERSrk_gmac, ATTR{address}xx:xx:xx:xx:xx:xx, NAMEeth0把MAC地址换成你板子上实际的。这样无论系统怎么升级网口名字都不会变脚本和配置文件就不用跟着改。2. 静态IP配置的三种写法与选型逻辑2.1 为什么嵌入式场景更推荐静态IP动态IPDHCP在办公环境很方便但在RK3588的典型应用场景里——边缘计算盒子、工业网关、视觉检测设备——静态IP几乎是刚需。原因有三第一设备部署在现场后你不可能每次都去路由器后台查它拿到了什么IP第二很多工业协议和上位机软件要求固定地址通信第三双网口做内外网隔离时内网口必须固定网段否则路由表会乱。所以这篇重点讲静态IP。但静态IP的写法在不同Linux发行版上差异很大RK3588上常见的有UbuntuNetplan、Debian/OpenEulerifupdown、以及systemd-networkd三种体系。选错体系你改的文件根本不生效这是第一大坑。2.2 Netplan写法Ubuntu系首选RK3588的Ubuntu镜像基本都用Netplan。配置文件在/etc/netplan/下通常是01-network-manager-all.yaml或50-cloud-init.yaml。先看目录里有哪些文件ls /etc/netplan/然后编辑对应的yaml。双网口静态IP的典型配置network: version: 2 renderer: networkd ethernets: eth0: dhcp4: no addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8, 114.114.114.114] eth1: dhcp4: no addresses: - 10.0.0.100/24这里有个关键点默认路由只能有一个。上面配置里eth0走了default路由eth1只配了地址没配网关这是双网口隔离的标准做法。如果你给两个网口都配了via网关系统会随机选一条默认路由导致网络时通时断这是双网口配置最经典的坑。写完执行sudo netplan apply如果报错用sudo netplan --debug apply看详细日志。Netplan的缩进极其严格必须用空格不能用Tabyaml对缩进敏感错一个空格就解析失败。2.3 ifupdown写法Debian/OpenEuler系有些RK3588的国产系统镜像用的是传统ifupdown配置文件在/etc/network/interfaces。写法auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8 auto eth1 iface eth1 inet static address 10.0.0.100 netmask 255.255.255.0同样gateway只写在eth0上。改完重启网络sudo systemctl restart networking或者sudo ifdown eth0 sudo ifup eth0注意ifupdown和NetworkManager可能冲突。如果系统里装了NetworkManager它会接管网口你改interfaces文件不生效。判断方法systemctl status NetworkManager看是否active。如果是要么停掉它要么改用nmcli配置。2.4 systemd-networkd写法轻量方案systemd-networkd适合裁剪过的系统配置文件在/etc/systemd/network/。每个网口一个.network文件# /etc/systemd/network/10-eth0.network [Match] Nameeth0 [Network] Address192.168.1.100/24 Gateway192.168.1.1 DNS8.8.8.8# /etc/systemd/network/20-eth1.network [Match] Nameeth1 [Network] Address10.0.0.100/24然后sudo systemctl enable systemd-networkd sudo systemctl restart systemd-networkd三种方案对比方案适用系统配置文件生效命令坑点NetplanUbuntu 18.04/etc/netplan/*.yamlnetplan apply缩进严格renderer选错ifupdownDebian/OpenEuler/etc/network/interfacesrestart networking与NM冲突systemd-networkd裁剪系统/etc/systemd/network/*.networkrestart systemd-networkd需先禁用其他管理工具选型逻辑很简单先确认系统里哪个网络管理服务在跑就改对应的配置。用systemctl list-units | grep -i network一看便知。3. 双网口最容易踩的五个坑与排查链路3.1 坑一两个网口配了同网段导致路由冲突这是新手最常犯的错。比如eth0配192.168.1.100/24eth1配192.168.1.200/24两个口在同一网段。Linux内核会认为这两个地址属于同一个子网数据包从哪个口出去取决于路由表的metric结果就是时通时不通。排查方法ip route show如果看到两条同网段的路由且没有明确的优先级那就是冲突了。解决方式是给两个网口配不同网段或者用策略路由指定源地址。工业场景下双网口通常一个接内网一个接外网网段天然不同所以配不同网段是最省事的做法。3.2 坑二默认网关配了两个前面提过但值得单独拎出来说。两个网口都写gateway或via系统会生成两条default路由default via 192.168.1.1 dev eth0 default via 10.0.0.1 dev eth1内核选哪条看metricmetric小的优先。但metric可能相同那就轮询导致外网访问断断续续。正确做法是只给需要上外网的网口配默认网关另一个口只配地址和网段路由。如果你确实需要两个口都能上外网比如双WAN冗余那要用策略路由配置ip rule和多个路由表这就复杂了普通场景没必要。3.3 坑三改完配置重启后IP丢失这个坑的根因通常是你改的配置文件不是系统实际读取的那个。比如系统用NetworkManager你改了/etc/network/interfaces重启后NM按自己的配置重新分配你的静态IP就没了。排查链路先确认当前IP是谁配的nmcli device show eth0看是不是NM管的。看开机时哪个服务先跑systemctl list-unit-files | grep -E NetworkManager|networking|systemd-networkd。只保留一个网络管理服务其他disable掉。我个人的习惯是RK3588上统一用Netplan networkd把NetworkManager和networking都禁用避免多服务打架。3.4 坑四网口link up但ping不通网口灯亮了ip link显示UP但ping不通对端。这种情况先看物理层ethtool eth0看Speed和Duplex是否正常。RK3588的RGMII接口对PHY时钟延迟敏感如果设备树里phy-mode配错比如该用rgmii-rxid却配成rgmii会出现link up但丢包严重甚至完全不通。这时候要对照板子原理图和PHY手册确认phy-mode。再检查防火墙sudo iptables -L -n有些镜像默认开了防火墙规则把ICMP挡了。还有SELinux或AppArmor也可能拦截用getenforce看状态。3.5 坑五双网口共用一个MDIO导致PHY识别异常这个坑比较隐蔽但在RK3588上确实存在。有些板子设计时两个GMAC共用一组MDIO总线如果两个PHY的地址PHY address配成一样内核只能识别到一个PHY另一个网口就起不来。判断方法dmesg | grep -i phy看日志里有没有两个PHY的探测信息。如果只有一个检查设备树里两个gmac节点的phy-handle指向的PHY地址是否重复。正常应该是phy0地址为0phy1地址为1或按硬件实际。这个需要改设备树重新编译属于移植层面的问题。4. 配置完成后的验证与持久化4.1 分层验证从链路层到应用层配完不能只看ip addr显示对了就完事要分层验证链路层ip link show eth0 ip link show eth1确认两个口都是UP状态MTU正常默认1500。网络层ip addr show ip route show确认地址、掩码、路由表符合预期default路由只有一条。连通性ping -c 4 192.168.1.1 # 网关 ping -c 4 -I eth1 10.0.0.1 # 指定从eth1出去ping-I参数指定源接口这是验证双网口隔离是否生效的关键。如果ping -I eth1能通而ping -I eth0不通说明路由隔离正确。DNSnslookup www.baidu.com确认nameservers生效。4.2 重启持久化测试配置完必须重启验证sudo reboot重启后重新执行上面的验证步骤。如果IP丢了回到3.3节排查。持久化的关键是配置文件写对位置且对应的网络服务开机自启。4.3 用脚本一键检查网络状态我习惯在板子上放一个自检脚本部署时跑一下#!/bin/bash echo 网口状态 ip -br addr show echo 路由表 ip route show echo 默认路由数量 ip route show | grep -c default echo eth0 连通性 ping -c 2 -W 2 -I eth0 192.168.1.1 echo eth0 OK || echo eth0 FAIL echo eth1 连通性 ping -c 2 -W 2 -I eth1 10.0.0.1 echo eth1 OK || echo eth1 FAIL这个脚本能快速定位问题出在哪一层比一条条敲命令高效得多。5. 几个实战中总结的经验技巧5.1 配置前先备份原文件改网络配置最怕改错导致SSH断连。我的习惯是改之前先备份sudo cp /etc/netplan/01-network-manager-all.yaml /etc/netplan/01-network-manager-all.yaml.bak而且尽量用串口终端操作不要只靠SSH。RK3588板子一般都引出了调试串口配网络时串口连着改错了还能救回来。这个习惯帮我省过好几次重刷系统的麻烦。5.2 用nmcli快速配置NetworkManager场景如果你的系统确实用NetworkManager用nmcli比改文件更直接sudo nmcli con mod eth0 ipv4.addresses 192.168.1.100/24 sudo nmcli con mod eth0 ipv4.gateway 192.168.1.1 sudo nmcli con mod eth0 ipv4.dns 8.8.8.8 sudo nmcli con mod eth0 ipv4.method manual sudo nmcli con up eth0eth1类似但不设gateway。nmcli的好处是即时生效且持久化不用重启。5.3 双网口做内外网隔离时的路由策略如果eth0接外网、eth1接内网设备除了默认路由只给eth0还要确保访问内网网段走eth1。通常同网段直连路由会自动生成不用手动加。但如果内网有多个网段需要加静态路由sudo ip route add 10.0.1.0/24 via 10.0.0.1 dev eth1持久化的话Netplan里写eth1: routes: - to: 10.0.1.0/24 via: 10.0.0.15.4 查看网口实时流量和错误计数调试网络问题时ethtool -S能看详细的收发统计ethtool -S eth0 | grep -E error|drop|fifo如果error或drop计数持续增长说明物理层或驱动有问题不是IP配置的事。这个命令帮我区分过好几次配置问题和硬件问题。5.5 关于RK3588 Ubuntu移植的额外提醒如果你是自己移植Ubuntu到RK3588网络这块要注意内核config里CONFIG_STMMAC_ETH和CONFIG_RK_GMAC相关选项要开设备树里gmac节点的时钟和复位要配对。移植完第一件事就是验证双网口是否都能识别别等到应用层才发现少一个口。另外不同内核版本对RK3588 GMAC的支持成熟度不同建议用Rockchip官方维护的内核分支社区主线内核在早期版本上双网口支持可能不完整。网络配置这事说难不难但坑是真的多尤其是双网口场景下路由和网段的设计。我的经验是先确认硬件拓扑再选对配置体系然后严格遵循一个默认网关原则最后分层验证加重启测试。按这个流程走5分钟配好双网口静态IP完全没问题剩下的时间可以留给NPU和视频编解码那些更有意思的事。