
1. 项目概述当你的开发板“瘸了腿”最近在调试一块带双网口的工控板遇到了一个挺典型的硬件工程师和嵌入式软件工程师都会头疼的问题板子启动后ifconfig一看eth0和eth1两个网口只有一个能正常显示IP地址、能ping通另一个要么压根不出现要么出现了但状态是DOWN或者IP配置死活不生效。这感觉就像你买了一辆双引擎的跑车结果只有一个引擎能点火另一个完全哑火项目进度一下子就卡住了。这个问题在嵌入式开发、网络设备调试乃至一些自研的工控场景里太常见了。板子可能是树莓派CM4载板、可能是基于NXP i.MX系列或瑞芯微RK平台的开发板也可能是定制的ARM工控主板。现象虽然统一——“一个网口不能用”但背后的原因却可能千差万别从最底层的硬件焊接、物料选型到内核驱动、设备树DTS配置再到上层的网络管理工具如NetworkManager、systemd-networkd策略任何一个环节出岔子都可能导致这个结果。网上搜到的热词像“板子规格书”、“eth0(lan): 10.251.251.251/24 , eth1(dmz)10.252.252.252/24”非常典型。前者指向了硬件设计的源头——我们得知道这板子设计上到底支不支持双网口以及它们的具体引脚定义和供电要求。后者则是一个经典的双网口应用场景一个网口LAN连接内部局域网另一个网口DMZ连接一个隔离的或对外的网络区域这种配置在防火墙、网关设备上很常见。而“pads翻转板子”则暗示了可能在PCB设计软件如PADS中进行布局布线时对网口相关模块尤其是网络变压器、RJ45接口的镜像或翻转操作可能埋下了硬件隐患。所以解决“板子双网口一个网口无法使用”这个问题绝不是简单地敲几条ifconfig命令或者改个IP就能搞定的。它需要我们像侦探一样遵循一套从硬件到软件、从底层到上层的系统性排查流程。下面我就结合自己踩过的坑和总结的经验把这个排查流程掰开揉碎了讲清楚。2. 系统性排查思路从物理层到应用层遇到问题最忌无头苍蝇似的乱试。我的经验是必须建立一套分层、有序的排查逻辑。对于双网口问题我习惯采用“硬件 - 固件/驱动 - 系统配置 - 应用策略”的四层模型。这个模型能帮你快速定位问题大概出在哪一层避免在错误的方向上浪费大量时间。2.1 第一层硬件与物理连接排查所有软件问题排查之前必须先排除硬件问题。这是铁律。1. 核对原理图与规格书这是第一步也是很多新手容易忽略的一步。你需要找到这块板子的硬件原理图和规格书就是热词里的“板子规格书”。重点看网口控制器芯片板子上到底用了几个网络PHY芯片是一个芯片支持两个端口如常见的RTL8211F、KSZ9031还是两个独立的PHY芯片或者SoC内部集成了两个MAC外接两个PHY电源与时钟检查PHY芯片的供电通常是3.3V、1.2V等是否都正常。晶振或时钟电路是否完好我曾遇到过因为一颗滤波电容虚焊导致某个PHY的25MHz时钟不稳定网口时好时坏。网络变压器MagJack这是关键。确认RJ45接口带网络变压器一体或分离的型号是否正确焊接有无问题。特别是“pads翻转板子”这种操作如果镜像了封装可能导致变压器中心抽头、差分线对TX/TX- RX/RX-的引脚顺序完全反接这样网口必然无法工作。MDI/MDIX交叉功能现在大多数PHY和交换机都支持自动翻转Auto-MDIX但有些老旧设备或特定配置下可能需要直通线或交叉线。可以尝试换一根网线或者将网线连接到不同的网络设备交换机、路由器、电脑上试试。2. 上电测量与观察电压测量用万用表测量PHY芯片各供电引脚电压是否在规格范围内。指示灯观察插入网线后观察对应网口的链路Link指示灯和活动Activity指示灯是否亮起。如果链路灯不亮基本可以确定问题出在物理层或链路层协商失败。热成像辅助如果有条件用热成像仪扫一下板子看看两个PHY芯片的温度是否差异巨大。一个异常发烫的芯片很可能已经损坏。实操心得硬件排查时一个放大镜和一把好的烙铁是你的好朋友。仔细检查PHY芯片、网络变压器、电阻电容特别是终端匹配电阻有无虚焊、连锡、破损。有时候问题就是一颗0201封装的电阻被静电打坏了。2.2 第二层内核与驱动层诊断如果硬件看起来没问题或者你手头没有测量工具那么接下来就要深入系统内部看看内核是否识别到了你的网卡。1. 检查内核识别情况在系统串口或SSH终端里执行以下命令dmesg | grep -E “eth|net|phy|r8169|igb|e1000e”请将r8169、igb、e1000e替换为你的网卡可能对应的驱动名如Realtek、Intel、NXP等系列 这条命令会过滤出内核启动过程中与网络、以太网、PHY相关的日志。你需要寻找类似这样的信息[ 2.100000] r8169 0000:01:00.0 eth0: RTL8168h/8111h, 00:11:22:33:44:55, XID 641, IRQ 125 [ 2.150000] r8169 0000:02:00.0 eth1: RTL8168h/8111h, 00:11:22:33:44:56, XID 641, IRQ 126 [ 2.200000] libphy: r8169: probed [ 2.250000] r8169 0000:01:00.0 eth0: link up, 1000Mbps, full-duplex [ 2.300000] r8169 0000:02:00.0 eth1: link down如果eth1对应的行根本没有出现或者出现了但后面跟着probe failed、error -19设备不存在、error -110超时等错误那问题很可能出在内核驱动或设备树Device Tree配置上。2. 深入检查设备树DTS配置对于ARM架构的嵌入式Linux设备树是描述硬件的关键。你需要检查你的内核设备树源文件.dts或.dtsi。节点是否存在确认两个网口对应的节点例如fec1,fec2对于NXP i.MX系列gmac0,gmac1对于某些Rockchip平台是否都被启用status “okay”;。引脚复用Pinctrl配置网口的TX、RX、时钟等信号线需要复用到正确的GPIO引脚上。检查pinctrl-0属性引用的引脚配置组是否正确两个网口的配置是否冲突。一个经典的错误是两个网口的某个引脚如MDIO总线复用到了同一个物理引脚上导致只能有一个正常工作。时钟与电源管理检查clocks和clock-names属性确保PHY所需的时钟源被正确提供和使能。PHY配置检查phy-mode如rgmii,rmii、phy-handle、phy-connection-type等属性是否正确。特别是max-speed属性如果设置不当比如PHY只支持100M你强制设为1000M可能导致协商失败。3. 检查驱动模块使用lsmod查看已加载的内核模块确认你的网卡驱动如r8169,igb,stmmac等是否已加载。也可以尝试手动加载和卸载驱动来测试sudo rmmod r8169 # 卸载驱动 sudo modprobe r8169 # 重新加载驱动同时观察dmesg输出看是否有新的探测信息。2.3 第三层操作系统网络配置检查当内核已经正确识别并驱动了两个网卡ifconfig -a能看到eth0和eth1但其中一个无法配置IP或无法连接时问题就上升到了操作系统网络管理层面。1. 确认设备识别与链路状态ip link show或者ifconfig -a查看eth1的状态。如果显示state DOWN你需要先把它“拉起来”sudo ip link set eth1 up然后再次检查状态并观察链路是否建立ip link show eth1 # 或者查看更详细的信息 ethtool eth1在ethtool的输出中重点关注Link detected: yes/no物理链路是否接通。Speed和Duplex协商出的速率和双工模式。如果是10Mb/s或100Mb/s而不是预期的1000Mb/s可能是网线质量或对端设备问题。如果显示Unknown!则链路层有问题。2. 排查网络管理服务冲突这是现代Linux系统尤其是桌面版或某些发行版的一个大坑。NetworkManager和传统的systemd-networkd/networkingifupdown服务可能会冲突争抢网络设备的控制权。检查谁在管理设备nmcli device status如果eth1显示为unmanaged说明NetworkManager不管它那可能是systemd-networkd或/etc/network/interfaces在管。如果显示为connected或connecting但就是没IP那可能是NetworkManager的配置有问题。临时解决方案如果你只是临时调试可以尝试禁用冲突的服务。如果使用NetworkManager可以尝试为eth1设置一个简单连接sudo nmcli connection add type ethernet ifname eth1 con-name eth1-test sudo nmcli connection up eth1-test如果使用systemd-networkd检查/etc/systemd/network/目录下是否有针对eth1的.network文件。如果使用传统的ifupdown检查/etc/network/interfaces文件确保eth1的配置正确。一个经典的错误配置是auto eth0 iface eth0 inet static address 192.168.1.100 ... # 缺少了 ‘auto eth1’ 这一行 iface eth1 inet static address 192.168.2.100 ...缺少auto eth1导致系统启动时不会自动配置eth1。3. 防火墙与路由规则有时候网卡是up的也有IP但就是不通。需要检查防火墙iptables/nftables是否丢弃了该网口的流量或者路由表是否混乱。sudo iptables -L -n -v | grep -i eth1 sudo ip route show确保没有一条错误的路由规则将eth1网段的流量指向了eth0或者黑洞。2.4 第四层应用层与特定场景配置在特定的使用场景下如热词中提到的eth0(lan)和eth1(dmz)这已经涉及到网络拓扑和防火墙策略的配置了。这通常不是网口本身“不能用”而是策略上“不让用”或“用错了”。1. 静态IP与子网冲突热词中的IP10.251.251.251/24和10.252.252.252/24显然是静态配置。请检查两个IP是否确实配置在了正确的网卡上。这两个IP地址是否与网络中其他设备冲突。子网掩码/24是否正确eth0和eth1是否被错误地配置在了同一个子网里这是大忌会导致路由混乱。2. 作为网关或路由器的配置如果你的板子打算作为双网口网关一个接内网WAN一个接外网LAN你需要开启IP转发sysctl -w net.ipv4.ip_forward1配置NAT如果需要使用iptables设置MASQUERADE规则。仔细规划路由表默认网关default route通常指向外网口如eth1。内网口eth0则负责一个内部子网的路由。 一个常见的错误是两个网口都配置了默认网关或者默认网关指向了错误的口导致所有流量都从一个口出去另一个口看似“没流量”。3. 绑定与桥接配置在某些高性能或冗余场景两个网口可能被配置为“绑定”Bonding或“桥接”Bridging。如果配置错误可能导致一个口失效。检查是否有bond0、br0这样的虚拟接口存在。检查/etc/modprobe.d/下的bonding配置或者brctl show的输出。3. 实战排查流程与命令实录光讲思路不够我们模拟一个最常见的场景一块ARM工控板eth0正常获取IP192.168.1.100eth1在ifconfig中看不到或者看到但无IP状态为DOWN。我们按流程走一遍。3.1 第一步快速状态侦察# 1. 查看所有网络接口包括未激活的 ifconfig -a # 或使用更现代的 ip 命令 ip link show # 2. 查看内核启动信息中关于网络设备的部分 dmesg | grep -i “eth\|net\|phy” | tail -50 # 3. 检查已知的网络接口配置文件 ls -la /etc/sysconfig/network-scripts/ 2/dev/null # CentOS/RHEL ls -la /etc/netplan/ 2/dev/null # Ubuntu 18.04 ls -la /etc/systemd/network/ 2/dev/null # systemd-networkd cat /etc/network/interfaces 2/dev/null # Debian/Ubuntu legacy可能的结果与初步判断ifconfig -a输出中有eth1说明内核识别到了硬件。跳到第三步操作系统配置层排查。ifconfig -a输出中无eth1但dmesg中有相关错误如probe failed说明驱动或硬件有问题。跳到第二步内核/驱动层排查。ifconfig -a输出中无eth1且dmesg中完全无该网卡信息极有可能是硬件问题或设备树未启用。从第一步硬件层开始排查。3.2 第二步驱动与设备树深度检查假设侦察结果指向此层# 1. 查看PCIe或平台设备枚举根据你的总线类型 lspci | grep -i ethernet # 对于PCIe网卡 # 或者查看平台设备 ls /sys/class/net/ # 看看有哪些网络设备类 find /sys/devices -name “*eth*” -o -name “*net*” | grep -v virtual # 查找网络设备在sysfs中的路径 # 2. 检查驱动模块 lsmod | grep -E “8169|igb|e1000|stmmac” # 替换为你的驱动关键词 # 如果驱动未加载尝试加载 sudo modprobe r8169 # 再次查看dmesg dmesg | tail -20 # 3. 检查设备树需要内核编译时开启CONFIG_OF_OVERLAY等且通常在嵌入式环境 # 方法一查看已加载的设备树节点 sudo ls /proc/device-tree/ | grep -i ethernet sudo find /proc/device-tree -name “*ethernet*” -type f | xargs cat 2/dev/null | strings # 方法二如果系统有dtc工具可以反编译 sudo cat /sys/firmware/devicetree/base/soc/ethernet12345678/status 2/dev/null # 如果输出是 “disabled” 那就找到问题了 # 4. 检查PHY状态如果驱动已加载但链路不通 sudo ethtool eth1 # 假设eth1设备存在但down # 强制设置速率和双工模式试试仅在确定对端设备支持时 sudo ethtool -s eth1 speed 100 duplex full autoneg off3.3 第三步网络服务配置与冲突解决假设eth1已识别但未配置# 1. 尝试手动启动接口并分配临时IP sudo ip link set eth1 up sudo ip addr add 192.168.2.100/24 dev eth1 # 测试连通性 ping -c 3 192.168.2.1 # 假设网关是 .1 # 2. 如果手动配置成功说明硬件和驱动是好的问题是系统没自动配置。 # 检查并停用可能冲突的网络管理器以NetworkManager为例根据你的发行版调整 sudo systemctl stop NetworkManager sudo systemctl disable NetworkManager # 谨慎操作确认后执行 # 然后使用传统方式配置 sudo nano /etc/network/interfaces # 添加如下内容 auto eth1 iface eth1 inet static address 10.252.252.252 netmask 255.255.255.0 # gateway 10.252.252.1 # 如果需要网关再设置注意默认网关只能有一个 sudo systemctl restart networking # 3. 如果使用systemd-networkd sudo nano /etc/systemd/network/10-eth1.network10-eth1.network文件内容示例[Match] Nameeth1 [Network] Address10.252.252.252/24 #Gateway10.252.252.1 #DNS8.8.8.8然后重启服务sudo systemctl restart systemd-networkd3.4 第四步高级诊断与性能测试当两个网口都能正常工作时我们还需要验证其稳定性和性能是否符合预期特别是用于“板子规格书”中承诺的千兆或特定应用场景时。# 1. 使用 ethtool 进行详细诊断 sudo ethtool -i eth1 # 查看驱动版本、固件版本等 sudo ethtool -S eth1 # 查看详细的网络统计信息丢包、错误等驱动需支持 sudo ethtool -k eth1 # 查看和修改网卡Offload参数如GRO, GSO, TSO # 2. 进行带宽和压力测试 # 在同一台机器两个口之间用iperf3测试需要另一台机器或虚拟接口 # 在板子上启动服务器端在eth1的IP上监听 iperf3 -s -B 10.252.252.252 # 在另一台连接到eth1的机器上运行客户端 iperf3 -c 10.252.252.252 -t 30 -P 4 # 3. 检查中断平衡对于高性能应用重要 cat /proc/interrupts | grep -E “eth|8169” # 查看网卡中断在各CPU核心的分布 # 如果中断都集中在一个核心可以考虑设置中断亲和性irqbalance服务或手动设置4. 常见问题与排查技巧实录在这一部分我分享几个实际项目中遇到的典型案例和通用排查技巧这些往往是文档里不会写的“坑”。4.1 案例一设备树引脚复用冲突现象基于NXP i.MX6UL的定制板eth0工作正常eth1在ifconfig -a中能看到但状态一直是DOWNethtool显示Link detected: no内核日志无错误。排查过程硬件测量PHY的电压、时钟、复位信号均正常。检查设备树发现fec2eth1的pinctrl-0引用了一个名为pinctrl_enet2的组。追踪这个pinctrl组定义发现其中MDIO总线相关的两个引脚ENET2_MDIO和ENET2_MDC与另一个已启用的i2c1功能的引脚完全重合。在SoC的引脚复用表中确认这两个引脚只能被一个外设功能使用。根本原因PCB设计工程师和软件工程师沟通不畅。硬件上为了走线方便将eth1的MDIO管理总线与I2C1复用了同一组引脚但在软件配置中两者都被使能了导致引脚功能冲突eth1的PHY无法被正确访问和初始化。解决方案在设备树中禁用i2c1节点status “disabled”;或者如果I2C1必须使用则需要硬件上修改设计飞线或改板软件无法解决。避坑技巧拿到新板子的原理图后第一件事就是和软件工程师一起核对引脚复用表。重点关注MDIO、中断引脚、复位引脚这些容易被忽略但至关重要的信号线。使用imx_pinctrl之类的可视化工具可以辅助检查。4.2 案例二网络管理服务“幽灵”配置现象Ubuntu 20.04系统eth1时好时坏。有时重启后能有IP有时没有。ifconfig显示eth1存在ip link显示state UP但就是没有IP地址。排查过程sudo ip addr add ...手动配置IP后可以正常通信排除硬件和驱动问题。检查/etc/network/interfaces里面只有lo和eth0的配置。检查/etc/netplan/*.yaml发现一个名为01-network-manager-all.yaml的文件内容为renderer: NetworkManager。运行nmcli device status发现eth1的状态是unmanaged。检查NetworkManager的配置文件目录/etc/NetworkManager/发现conf.d目录下有一个陈旧的自定义配置文件里面有一条[keyfile] unmanaged-devicesinterface-name:eth1。根本原因系统之前被其他管理员调试过为了禁用NetworkManager对eth1的管理添加了配置但后来忘记删除。而系统主要的网络配置又交给了netplan后端可能是networkd但netplan的配置里没有定义eth1。导致eth1处于“三不管”地带。解决方案有两个选择方案A推荐清晰删除或注释掉/etc/NetworkManager/conf.d/下导致eth1被unmanaged的配置行。然后在/etc/netplan/中创建一个明确的配置文件如02-eth1.yaml来管理eth1。方案B直接让NetworkManager来管理eth1删除netplan中关于eth1的配置如果有并使用nmcli或nmtui图形界面配置。实操心得现代Linux发行版的网络配置管理“百花齐放”容易打架。我的原则是一个系统里只使用一种主力的网络配置管理工具。要么全用NetworkManager适合桌面或需要频繁切换网络的场景要么全用systemd-networkdnetplan适合服务器和嵌入式要么全用传统的/etc/network/interfaces适合老派管理员。混合使用一定要理清优先级和边界并做好详细文档。4.3 通用排查技巧速查表当你面对一个“网口不工作”的问题时可以按下面这个表格的顺序快速缩小范围排查步骤命令/检查点正常现象异常可能原因物理层观察网口指示灯插入网线后链路灯常亮活动灯闪烁灯不亮网线坏、对端设备未开机/未启用端口、PHY未供电、网络变压器故障、PCB断线。驱动层dmesg | grep -i eth看到eth0和eth1的probed和link up信息无eth1信息设备树未启用、驱动未编译进内核、硬件检测失败。有probe failed错误资源冲突如IRQ、内存地址、PHY通信失败。链路层ip link show eth1sudo ethtool eth1state UPLink detected: yes有正确的Speed/Duplexstate DOWN需ip link set eth1 up。Link detected: no物理链路问题或强制设置了不支持的速率/双工模式。网络层ip addr show eth1有正确的IPv4/IPv6地址无IP地址网络管理服务未配置、DHCP失败检查DHCP服务器、静态配置错误。路由/防火墙ip route showsudo iptables -L -n -v有到达目标网络的路由防火墙未阻断路由缺失或错误需添加路由。防火墙规则丢弃流量需修改规则。应用层ping 网关IPsudo tcpdump -i eth1能ping通网关tcpdump能看到进出流量ping不通但链路通ARP问题、网关IP错误、对端设备防火墙。tcpdump无流量可能网卡处于promiscuous模式失败或驱动问题。最后一个小技巧当你觉得所有配置都正确但就是不通时尝试更换一个已知良好的网络环境。比如把板子的问题网口用一根短网线直接连接到一台笔记本电脑的网口上将笔记本的网卡IP设置为同一网段的静态IP如10.252.252.1/24然后互ping。这能彻底排除外部交换机、路由器、网线、上层网络策略的影响将问题100%锁定在板子本身。这个方法帮我排除了至少30%的“疑难杂症”。