尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CM4双网口载板深度解析:从PCIe到Linux网络配置

CM4双网口载板深度解析:从PCIe到Linux网络配置 我曾经在一间改造中的工作室里折腾网络设备三间房间、一台核心NAS、还有一堆需要隔离的测试终端全部要跑有线链路。刚开始图省事打算用USB转千兆网口给树莓派Compute Module 4CM4扩展第二个网口结果稳定性让我头疼。后来换了带双LAN端口的CM4载板问题一下子简化了。Raspberry Pi CM4载板上的双网口看起来只是多了一个RJ45但这背后牵扯到PCIe通道分配、USB总线复用、网络芯片选型、GPIO引脚规划以及Linux网络栈配置是一整套工程决策。这篇文章我想把双网口CM4载板的完整经验写清楚为什么需要双网口、硬件上怎么实现、引脚怎么规划、系统层怎么配置以及我在实际使用中踩过的坑。适合正在选型CM4载板或者打算用CM4做软路由、工业网关、NAS、多网段隔离设备的开发者参考。无论你是买成品载板还是准备自己画底板这里面的信息都应该有用。1. 双网口不是堆料是CM4载板的分水岭1.1 两个网口能解决哪些真实痛点CM4模块本身只有一路原生千兆MAC/PHY对应官方IO Board上的那个以太网口。单网口对很多嵌入式应用是够的但一旦涉及多网段隔离、内外网分离、网络冗余或者流量管理一个物理口就不够用了。举几个我实际遇到过的场景多网段隔离工作室里办公设备、物联网终端、测试环境需要分开。单网口只能靠VLAN隔离但VLAN要上游交换机配合且跨设备后的管理配置很麻烦。双网口可以直接物理隔开WAN口接上级路由LAN口接内部交换机两个网段互不干扰逻辑上清晰得多。NAS与业务流量分离NAS一边承担文件共享一边又要做备份。如果只有单网口备份流量和用户访问流量会争抢带宽。双网口可以让备份走独立物理链路业务访问走另一个口吞吐量直观翻倍故障定位也容易。工业网关/边缘计算现场设备网和控制网通常要求物理隔离这是很多工业项目的硬性要求。双网口CM4载板可以一个口接设备网一个口接上层管理网中间做消息转发不需要额外购买工业交换机。网络冗余两个网口可以做bonding模式一个口断了另一个口顶上。对要求7x24小时在线的边缘节点这是很实在的可靠性提升。所以说双网口不是厂商堆料吸引眼球而是CM4在实际部署中最常见的痛点之一。载板厂商愿意把双网口做上去说明这个需求足够刚性。1.2 双网口改变了整块板子的系统角色单网口的CM4载板本质上是一个“可联网的单板计算机”。双网口载板则更像一台迷你网络设备。这个角色变化带来的连锁反应是板载电源设计需要更强的余量因为第二颗网卡芯片和网络变压器都会增加功耗PCB布局要考虑两个RJ45的位置避免与电源、USB 3.0接口产生干扰Ethernet EEPROM里的MAC地址管理也变成一项必须面对的问题。更关键的是双网口让CM4的PCIe通道有了新的使用方式。CM4的PCIe 2.0 x1接口很多时候被用来接NVMe SSD。如果第二颗网卡走PCIe就得在SSD和网卡之间做二选一或者通过切换开关/扩展芯片来共享。如果走USB 3.0则要占用高速USB通道可能牺牲USB 3.0接口数量。这个取舍是双网口载板设计中最核心的分水岭也是用户选型时最容易忽略的地方。2. 双网口载板的硬件设计拆解从PCIe、USB到MAC/PHY2.1 CM4有哪些可以用于扩展网口的总线CM4Compute Module 4基于BCM2711处理器和树莓派4B同款SoC。它对外提供的扩展接口最重要的有几类扩展总线数量/规格扩展网口的典型方案PCIe 2.0 x11路走PCIe转千兆/2.5G网卡芯片如Intel I225/I226、瑞昱RTL8111系列USB 2.01路走USB 2.0转百兆/千兆网卡芯片如AX88772、RTL8152USB 3.01路与PCIe可切换走USB 3.0转千兆/2.5G网卡如RTL8153、RTL8156、AX88179GPIO若干走SPI接口转以太网控制器如ENC28J60百兆以内性能有限从实际产品看市面上双网口CM4载板最主流的方案是原生网口BCM54210PE PHY或直接SoC内置MAC外置PHY USB 3.0转千兆网口。这种方案成本低、成熟稳定缺点是USB通道有额外延迟且会和USB 3.0接口冲突。另一种高端方案是PCIe转双口千兆网卡或者PCIe转2.5G网卡。这种方案理论性能更高但会占用PCIe x1通道。CM4想同时用PCIe NVMe和PCIe网卡只能通过PCIe Switch例如ASM1184e扩展成本一下就上去了而且CM4的PCIe 2.0 x1带宽大约500MB/s如果同时跑NVMe和高速网卡可能成为瓶颈。2.2 网卡芯片选型不同方案的优缺点对比载板上第二网口用什么芯片直接决定性能和兼容性。RTL8153USB 3.0转千兆最常见驱动在树莓派OS内核里已经成熟插上就能用。缺点是发热偏高满速跑时芯片温度能到70度左右。很多廉价载板用这颗需要留意散热。RTL8156USB 3.0转2.5G价格略高如果载板只给了千兆RJ45那多半用的不是它。它能跑2.5G但需要网线、对端设备都支持。AX88179USB 3.0转千兆亚信的老芯片兼容性也不错但性能比RTL8153稍微弱一档大流量下CPU占用偏高。Intel I225/I226PCIe转2.5G走PCIe方案时常见驱动在Linux内核里很完善延迟低、稳定性好。问题是CM4 PCIe通道有限且I225早期版本有硬件bug选型要避开旧批次。RTL8111H/RTL8111GPCIe转千兆老牌PCIe网卡方案驱动成熟但性能上限就千兆不如直接上2.5G。如果你决定买成品双网口载板可以查一下第二网口用的是哪颗芯片。如果只标注“千兆以太网”大概率是RTL8153。如果标注“PCIe 2.5G Ethernet”一般是I225或RTL8125。2.3 硬件设计上容易被低估的细节双网口载板不是把两颗网卡芯片焊上去就能稳定工作的。几个容易被忽视的硬件细节网络变压器的位置RJ45和网卡芯片之间必须有网络变压器或者带变压器的RJ45座否则信号共模干扰会非常严重。成品载板如果出现丢包率偏高、网口协商不稳定先检查变压器布局和焊盘。EEPROM配置很多USB网卡芯片需要外接EEPROM保存MAC地址和配置信息。有些低成本板子省掉EEPROM导致MAC地址每次启动随机生成虽然能用但做DHCP静态绑定、系统镜像迁移时会很痛苦。USB网卡的供电USB 3.0口供电一般是5V/900mA如果第二网卡是从USB HUB扩展出来的旁边再挂移动硬盘供电就紧张了。我见过USB网卡在接入大功率设备时直接断开就是供电不足。LED指示双网口板的RJ45指示灯设计也很重要系统运行状态、链路状态、数据活动状态最好分开。否则调试网络问题时会浪费很多时间。这些细节普通用户未必会关心但如果你打算自己设计载板或者评估一块板子的做工就值得一一对照。3. 看懂CM4 GPIO引脚图才算真正掌握载板的外设规划3.1 引脚图里藏着哪些关键信号“Raspberry Pi Compute Module 4 GPIO引脚图”是很多新接触CM4的开发者会搜的热词。不同于普通树莓派40Pin排针只引出GPIO和电源CM4的底板连接器是一对0.5mm间距的DF40系列板对板连接器引脚密度高得多。它除了GPIO还包含PCIe、USB、HDMI、DSI、CSI、I2S、UART、SPI、I2C、PWM、SD卡等信号。从双网口载板设计角度看引脚图里最需要在意的几类信号信号类型引脚用途是否影响双网口设计PCIePCIe_RX/TX、CLK、PERST接NVMe、PCIe网卡是选型核心USB 3.0USB_VBUS、USB_D_P/N、USB3_RX/TX接USB 3.0 HUB/网卡是决定USB方案USB 2.0USB2_D_P/N接USB 2.0设备、USB转百兆网卡可替代方案的备选GPIO0-GPIO27UART、I2C、SPI、PWM等影响外设扩展能力SD卡/ eMMC系统启动介质载板设计时要考虑走线RUN/复位引脚硬复位工业应用必备3.2 一份实际的外设分配案例我自己设计一块双网口CM4底板时引脚分配是这样的原生千兆网口直接用CM4核心板上的以太网PHYBCM54210PE信号走专用引脚不占用GPIO。第二网口用USB 3.0转RTL8153方案USB 3.0差分对连接到USB HUB再分一路给USB 3.0 Type-A接口。GPIO14/15UART0接调试串口方便系统启动时看内核日志。GPIO2/3I2C1接载板上的温度传感器和RTC时钟芯片。GPIO8/9/10/11SPI0接一个SPI转CAN控制器兼容工业应用。GPIO22/23/24/25预留为继电器控制输出。GPIO16/17PWM0/1接两颗LED指示灯用PWM控制呼吸效果。这个分配看起来简单但核心原则是引脚复用要先看BCM2711的function select表。比如GPIO14/15默认就是UART0但如果你把它们用作别的功能就要小心是否会影响控制台输出。CM4的启动过程默认会把UART0作为调试串口如果载板把这两个引脚占用为GPIO系统日志就会少一串排查问题会很别扭。3.3 引脚复用冲突与排查经验很多第一次画CM4载板的人拿到引脚图就懵了。0.5mm间距的DF40连接器一个小小底板上要引出上百个引脚一点错误就可能导致整板无法启动。我踩过的一个具体坑为了省事我把某个I2C设备挂在了GPIO0/1上但这两脚在CM4上默认是ID_SD/ID_SC用于读取EEPROM内容。结果载板Linux启动时内核尝试读取HAT EEPROM却识别到了I2C设备返回的异常数据导致树莓派OS把载板识别成了未知HATGPIO基地址都变了。后来才发现问题出在引脚复用上把I2C设备挪到GPIO2/3才解决。排查建议如果你拿到一块双网口载板发现某个外设不工作先查GPIO引脚图确认该引脚有没有被HAT EEPROM里的设备树片段覆盖。CM4和树莓派4不同大部分引脚功能都要靠设备树device tree来定义不能只靠物理连接。4. 双网口到底怎么用Linux下的网桥、VLAN与策略路由配置实战4.1 双网口基础配置系统起来后先确认系统识别到了两个网口。用ip link查看通常会看到eth0和eth1或者类似名字。如果其中一个网口名字变成了enx...那基本可以确认是USB网卡因为USB网卡的MAC地址来源于芯片/EEPROM。用ethtool查看两个网口的速率、双工模式ethtool eth0 ethtool eth1建议把网口命名固定下来用udev规则根据MAC地址绑定。否则USB网卡和原生网口的枚举顺序可能在每次启动时变化后面配置网络脚本时容易搞混。编辑/etc/network/interfaces或者用netplanUbuntu/Debian分支配置静态IP# netplan 示例 network: version: 2 renderer: networkd ethernets: eth0: addresses: - 192.168.10.2/24 eth1: addresses: - 192.168.20.2/244.2 网桥模式把两个网口做成透明交换双网口最基础也最实用的玩法是桥接。把两个网口放进同一个Linux bridge里相当于用软件实现了二层交换。比如让CM4作为一个透明的数据采集网关两个网口接两个不同网段设备可以互相通信。创建网桥sudo ip link add name br0 type bridge sudo ip link set dev eth0 master br0 sudo ip link set dev eth1 master br0 sudo ip link set br0 up持久化配置建议用netplan或者systemd-networkd避免重启后失效。桥接模式的好处是简单、对现有网络设备透明。缺点是所有广播报文都会在两个口之间转发如果接入的设备数量较多可能产生不必要的广播多播流量。一般建议在桥接场景加stp开启生成树防止环路sudo ip link set br0 type bridge stp_state 14.3 VLAN隔离与多网段路由如果双网口要承担路由功能那配置就稍微复杂一点。假设拓扑是eth0接WAN光猫/上级路由eth1接LAN内部交换机我们可以在CM4上开启IP转发并配置NAT规则。打开内核转发sudo sysctl -w net.ipv4.ip_forward1在/etc/sysctl.conf里写net.ipv4.ip_forward1永久生效。配置两个网口的IP按上面netplan方式然后添加iptables NAT规则sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT这就完成了一个最简单的双网口路由器。如果想在LAN侧做VLAN隔离可以在eth1上创建多个VLAN子接口sudo ip link add link eth1 name eth1.10 type vlan id 10 sudo ip link add link eth1 name eth1.20 type vlan id 20然后给子接口配置不同网段IP加上对应的防火墙规则就能实现单个物理LAN口承载多个隔离网段。这个场景非常适合CM4载板在机房、小型办公网络里做边缘路由/防火墙。4.4 性能与吞吐调优经验双网口跑满千兆CPU占用能不能压住取决于驱动、中断处理和内核网络栈。我的经验是首先要保证网卡驱动更新。树莓派OS自带的RTL8153驱动总体够用但遇到大流量场景建议加参数sudo ethtool -K eth1 rx-checksumming on sudo ethtool -K eth1 tx-checksumming on sudo ethtool -K eth1 scatter-gather on sudo ethtool -K eth1 tcp-segmentation-offload on这些offload特性可以把校验和、分片等工作交给网卡硬件完成降低CPU负载。如果不确定网卡支持哪些参数用ethtool -k eth1查看。另外中断合并参数对延迟和吞吐有直接影响。RTL8153可以通过ethtool -C eth1 rx-usecs 100调整接收中断合并延时。值太大延时会增加值太小中断过多CPU占用升高。我一般跑千兆时用50到100微秒之间的值作为吞吐和延迟的平衡点。测试吞吐量时建议用iperf3iperf3 -s # 服务端 iperf3 -c 192.168.10.2 -t 60 -P 4 # 客户端4并发流如果发现USB网卡吞吐跑不满千兆先检查USB连接速度dmesg | grep -i usb看到SuperSpeed才是USB 3.0模式。如果降级成了HighSpeedUSB 2.0说明线材、接触或PCB走线有问题吞吐会卡在400Mbps左右。5. 实战踩坑双网口载板从样板到稳定运行的几个关键问题5.1 电源设计不足导致网卡丢包我第一块自制双网口载板第二网卡用的是RTL8153单独测试一切正常但一旦把USB 3.0接口接上移动硬盘第二网卡就开始出现高丢包。排查过程先用dmesg查看USB总线事件没有报错。接着用ethtool -S eth1查看网卡统计发现rx_crc_errors和rx_errors计数持续增长。再量电压发现USB 5V接入移动硬盘后跌落到了4.6V左右。CM4的5V输入有电源管理芯片稳压但USB HUB的5V是直接从输入电源上取的没有额外稳压导致移动硬盘和大流量网卡同时工作时电压跌落。解决方案在外围电路里加一个5V/3A的DC-DC给USB HUB供电或者选择带有独立稳压电路的载板。这个坑说明双网口载板的电源设计不止是给SoC供电还要考虑所有接口的协同供电。5.2 PCIe信号完整性导致的网卡识别不稳定另一块测试板是PCIe转2.5G网卡方案现象是冷启动有时识别不到网卡重启后才正常。排查时用lspci看PCIe设备枚举状态发现网卡有时不在列表里。原因基本指向PCIe时钟或复位时序。CM4的PCIe时钟REFCLK是SoC直接输出的走线如果过长或阻抗不匹配信号质量会下降。另外PCIe设备的PERST#复位信号要遵守上电时序不能太早或太晚释放。解决办法是在PCB设计里尽量缩短PCIe差分对长度并在靠近连接器处加共模电感PERST#用RC延时电路控制释放时间通常要有至少100ms的延迟。如果你用成品板遇到类似问题先检查电源和复位别一上来就怀疑芯片。5.3 散热不足引发CM4降频网络延迟升高CM4满载运行时温度很容易超过80度一旦达到温度墙SoC会降频。降频后如果同时跑路由转发和网络桥接内核网络软中断处理能力会下降延迟明显升高。我在夏天测试一块无风扇载板外部环境35度CM4持续跑iperf3双向打流CPU温度很快冲到85度频率掉到1GHz以下网络延迟从0.3ms涨到3ms以上。后来加了一个小型散热片加风扇温度控制在60度以内延迟立刻恢复正常。经验双网口载板如果打算7x24小时跑路由/NAT强烈建议优先选主动散热方案或者至少选带大散热片的无风扇板并在软件里配置好温度监控。用vcgencmd measure_temp随时查看温度用vcgencmd measure_clock arm查看CPU频率。5.4 路由表混乱导致的双网口互相干扰两个网口同时启用时最常见的问题是默认路由冲突。系统可能会把默认网关指向错误的网口导致流量绕路或者直接无法上网。一个典型的场景eth0接内网192.168.10.0/24eth1接外网192.168.20.0/24。如果两个网口都设置了默认网关路由表会变得混乱某些网段可能走错口。解决办法是策略路由为每个网口单独维护一张路由表。比如ip rule add from 192.168.10.0/24 lookup 100 ip rule add from 192.168.20.0/24 lookup 200 ip route add default via 192.168.10.1 dev eth0 table 100 ip route add default via 192.168.20.1 dev eth1 table 200这样从不同网口进来的流量就按各自的路由表回包。配合前面说的NAT双WAN场景也能做得比较稳定。我用这个方案跑了两年的边缘网关没有出过路由错乱的问题。6. 选成品板还是自己画我的建议和判断标准6.1 选成品双网口载板你要先看这几项如果是买成品别只看照片和参数。我建议重点确认这几项第二网口是USB方案还是PCIe方案芯片型号是什么。USB方案便宜PCIe方案性能更稳但受限于CM4的PCIe通道不可能同时接NVMe和PCIe网卡。USB 3.0接口数量。如果第二网口占用了USB 3.0 HUB外接高速存储带宽会受影响。电源输入范围和供电能力是否支持PoE供电。很多双网口工业载板支持PoE这对壁挂安装场景非常方便。GPIO是否完全引出。有些载板为了节省空间GPIO只引出了一部分对后续扩展很不友好。是否带硬件看门狗watchdog。工业环境挂机看门狗很重要。散热方案。无风扇载板要看散热片的面积有风扇要看风扇噪音和使用寿命。我见过不少号称“工业级”的载板实际连个独立的RTC电池座都没有更不用说看门狗了。买之前建议先看官方原理图开源的最好确认关键电路设计。6.2 自研载板的最小可行配置如果你打算自己画CM4底板我这里总结一套比较稳的“最小双网口配置”核心板CM4建议带eMMC省去SD卡的不稳定因素原生千兆网口按树莓派官方IO Board参考设计用BCM54210PE PHY。第二千兆网口USB 3.0转RTL8153外接EEPROM存储MAC。电源5V/3A DC-DC输入加TVS和反接保护USB HUB电源单独稳压。连接器DF40系列板对板连接器注意焊接温度和一次对位精度。调试口串口UART0引出方便内核日志排查。看门狗GPIO控制外部看门狗芯片超时复位。这套方案成本相对较低硬件设计参考资料也多是我认为最适合入门自研CM4载板的组合。6.3 固件和驱动的长期维护提醒双网口载板做出来后软件层面的维护比硬件更持久。USB网卡驱动虽然内核自带但不同内核版本的行为差异很大。我曾经在升级内核后RTL8153网卡的MAC地址变了原因是新驱动读取EEPROM的逻辑不同。所以做产品化方案时最好锁定内核版本或者至少做好驱动版本验证。另外CM4的eMMC启动镜像如果提前做好网络配置到现场后直接插上就能用。建议把网口命名、MAC地址绑定、路由规则、防火墙规则都写进首次启动脚本避免每台设备手工配置。用Ansible管理一批双网口网关是效率最高的方式。最后再分享一个经验如果你刚接触双网口CM4载板不要一上来就追求2.5G、PCIe网卡这些高性能配置先用USB转千兆的成熟方案跑通业务逻辑把网络拓扑、路由规则、温度控制和备份策略理顺之后再考虑硬件升级。我自己的习惯是每块双网口载板到手第一件事不是跑性能测试而是用一个长时间运行的ping -f去压测两个网口再同时跑iperf3双向打流看有没有丢包、延迟抖动和网口断开重连。双网口设备最容易暴露问题的地方往往是电源和驱动不是网速。把这个关卡过了后面无论是做路由器还是做工业网关都会省心很多。
返回列表