双网卡设置

Tutorial: 卓越工程师 Category: 嵌入式 Published: 2026-10-23 11:05:29 Views: 1 Likes: 0 Comments: 0

338.3.11 双网卡设置

本节没有编写 C 程序、驱动源码或设备树源码,因此标题下不添加臆造的 C 代码。课程目标是让 Ubuntu 虚拟机同时拥有两条用途不同的网络链路:一条用于日常上网或远程管理,另一条专门连接开发板,供后续 TFTP 下载内核、DTB 以及 NFS 挂载根文件系统使用。

上网/管理链路:外部网络 ── Windows 的 Wi-Fi(或另一有线网卡)── VMware ── Ubuntu 网卡 1

板卡实验链路:开发板 ── 网线 ── Windows 物理以太网口
                                  │
                                  └── VMware 桥接网络 ── Ubuntu 网卡 2

“双网卡”指 Ubuntu 中存在两个独立的网络接口,并不等于把 Windows 网卡的 IP 复制给虚拟机。桥接后,Ubuntu 的第二块虚拟网卡会像一台独立设备一样出现在板卡侧二层网络中,拥有自己的 MAC 地址和 IP 地址。

视频采用的地址规划如下。开发板地址来自上一课,本课只配置并测试 Windows 与 Ubuntu 两端:

设备/接口视频中的地址用途是否需要默认网关
Ubuntu 原网卡 ens33192.168.31.230/24上网、SSH 管理由原网络提供
Windows 板卡侧物理网卡192.168.2.223/24Windows 与板卡侧网络通信直连实验网通常不需要
Ubuntu 新网卡 ens37192.168.2.220/24TFTP/NFS 服务端地址不需要,视频实操也留空
开发板192.168.2.120/24TFTP/NFS 客户端同网段直连时不需要

其中 /24 等价于子网掩码 255.255.255.0。四个地址的前三段相同,所以 192.168.2.120、192.168.2.220 和 192.168.2.223 属于同一个 192.168.2.0/24 子网,可以直接通信;每台设备的最后一段必须不同,且本子网中的 .0 是网络地址、.255 是广播地址,不能分配给普通主机。

一、双网卡设置

双网卡的核心不是“两个接口都能上网”,而是让路由表按目标网络选择出口:

  • 发往 192.168.2.0/24 的数据从板卡侧网卡发出;
  • 发往其他网络的数据仍从原上网网卡及其默认网关发出;
  • 板卡侧接口只服务本地实验网,不应抢占默认路由。

同一子网的主机通信时,发送方会先通过 ARP 获得目标 MAC 地址,再直接发送以太网帧,不需要经过默认网关。默认网关只负责把数据转发到其他子网。因此,给板卡专用网卡填一个实际并不存在的 192.168.2.1,不能增强连通性,反而可能引入错误或竞争的默认路由。

1.1 Windows端

1.1.1 确认硬件连接和目标网卡

课程的硬件前提是:开发板通过网线连接 Windows 主机的物理以太网口;Windows 还要通过 Wi-Fi 或另一块有线网卡维持原来的上网链路。不要把 VMware 自动创建的 VMware Network Adapter VMnet8 当成连接开发板的物理网卡。视频中的板卡侧物理设备为 Realtek Gaming 2.5GbE Family Controller,实际机器应以自己的网卡名称为准。

视频通过“设置 → 网络和 Internet → 高级网络设置”查看网络适配器,并采用断电、上电的方法辅助识别:

  • 开发板断电或网线拔掉后,目标以太网口显示“未连接”;
  • 开发板上电且网线、PHY 正常后,目标接口由“未连接”变成“未识别的网络”。

这里必须纠正一个概念:“未识别的网络”最多说明 Windows 检测到了物理链路,并且没有把该网络识别成已知网络;它不能证明 IP 已正确配置,也不能证明双方已经交换业务数据。物理层有载波、IP 层可达和 TFTP/NFS 服务可用,是三个不同层次的状态,后面仍要逐层验证。

1.1.2 设置静态 IPv4 地址

视频使用传统适配器属性页,依次打开目标物理网卡的“属性 → Internet 协议版本 4(TCP/IPv4)→ 属性”,然后选择“使用下面的 IP 地址”。不同 Windows 版本也可以从网络设置中的“IP 分配 → 编辑 → 手动”进入;微软官方步骤见 Windows 基本网络设置与 TCP/IP 配置。

视频截图填写的是:

IP 地址:     192.168.2.223
子网掩码:   255.255.255.0
默认网关:   192.168.2.1
首选 DNS:   114.114.114.114

但按本课“电脑网口直连开发板”的拓扑,推荐配置应为:

IP 地址:     192.168.2.223
子网掩码:   255.255.255.0
默认网关:   留空
DNS 服务器: 留空

原因如下:

  • 192.168.2.223/24 已经会自动生成一条到 192.168.2.0/24 的直连路由,访问开发板和 Ubuntu 第二网卡不需要网关;
  • 视频拓扑中没有证据表明 192.168.2.1 上存在路由器,填写它可能给 Windows 增加一个无效默认出口;
  • 本课使用 IP 地址访问开发板,不需要 DNS 做域名解析;
  • 上网所需的默认网关和 DNS 应继续由 Wi-Fi 或另一块上网网卡提供。

如果实际网络中确实有一台路由器负责连接其他子网,才按真实拓扑填写网关,不能机械照抄 192.168.2.1。Windows 物理网卡本身的 192.168.2.223 主要用于主机参与测试;即使只要求“开发板 ↔ Ubuntu 虚拟机”通信,二者的桥接转发也不依赖 Windows 使用同一个 IP。

1.2 虚拟机设置

1.2.1 建立专用桥接网络

在 VMware Workstation 中打开“编辑 → 虚拟网络编辑器”,点击“更改设置”取得管理员权限,然后执行:

  1. 选择一个未使用的 VMnet;视频使用 VMnet1。
  2. 把该 VMnet 的类型设置为“桥接模式”。
  3. 在“桥接至”下拉框中,明确选择连接开发板的物理以太网卡;视频选择 Realtek 有线网卡。
  4. 应用并保存设置。

桥接模式会把虚拟网卡直接接入所选物理网络;NAT 则是让虚拟机通过主机地址共享外部网络;Host-only 只建立主机与虚拟机之间的私有网络。Broadcom 的 VMware Workstation 虚拟网络编辑器说明还特别建议:使用多块网卡时,应分别指定每块网卡所桥接的物理适配器,不要依赖 Automatic 自动桥接。否则 VMware 可能选到 Wi-Fi,板卡数据便不会走预期的有线口。

视频把 VMnet1 从 Host-only 改成了桥接网络。VMnet0、VMnet1、VMnet8 通常分别承担默认桥接、Host-only 和 NAT 功能;因此改动 VMnet1 会占用原来的 Host-only 网络。若其他虚拟机还依赖 Host-only,应改用一个空闲的自定义 VMnet,而不是无条件照搬名称。真正重要的是“该 VMnet 桥接到哪块物理网卡”,名称本身没有网络语义。

1.2.2 把第二块虚拟网卡接入该网络

为减少热添加兼容性问题,可以先正常关闭 Ubuntu 虚拟机,再在 VMware 中操作:

  1. 右击虚拟机名称,打开“设置”。
  2. 点击“添加”,选择“网络适配器”,再点击“完成”。
  3. 选中新出现的网络适配器,选择“自定义:特定虚拟网络”。
  4. 指定前一步配置的 VMnet;视频为 VMnet1。
  5. 确认“已连接”和“启动时连接”的状态符合需要,然后保存。

这一步增加的是 Ubuntu 能看到的第二块虚拟硬件网卡;前一步配置的 VMnet 则决定这块虚拟网卡如何接到 Windows 的物理网卡。两步缺一不可。如果 VMware 版本支持在线添加且操作成功,也可以不关机;若“添加”按钮不可用、Ubuntu 未识别设备或状态异常,关闭虚拟机后重新添加最稳妥。

1.3 Ubuntu设置

启动 Ubuntu 后,视频运行 ifconfig,从原来的 ens33、lo 变为 ens33、ens37、lo。这说明第二块虚拟网卡已被系统识别,但当时 ens37 还没有 IPv4 地址。网卡名由 Linux 的可预测命名规则和虚拟硬件位置决定,换一台虚拟机可能显示为 ens38、enp0s8 等,不能把 ens37 当成固定名称。

ifconfig 可以复现课程画面,但现代 Ubuntu 更适合使用 ip 命令。Ubuntu 的 ip address 手册说明该命令用于查看和管理网络设备上的协议地址。

# 以简洁格式查看所有接口是否存在、是否为 UP。
ip -br link

# 查看各接口的 IPv4/IPv6 地址;新网卡出现但无 192.168.2.x 时,说明尚未完成地址配置。
ip -br address

# 查看当前路由,确认哪个接口承担默认路由以及 192.168.2.0/24 走哪个接口。
ip route

# 查看 NetworkManager 认为每块设备处于 connected、disconnected 还是 unavailable。
nmcli device status

若第二块接口没有出现,应依次检查:VMware 是否真的添加了第二个网络适配器、是否勾选“已连接/启动时连接”、该适配器是否指向正确 VMnet。完成检查后再重启 Ubuntu;重启不是替代配置检查的万能修复方法。

1.4 打开设置

1.4.1 在图形界面配置板卡侧地址

视频在 Ubuntu 中打开“Settings → Network”,找到没有 IPv4 地址的第二块网卡 ens37,打开开关并进入齿轮设置,然后执行:

  1. 进入 IPv4 页签;
  2. 将地址获取方式从 Automatic (DHCP) 改成 Manual;
  3. 地址填写 192.168.2.220;
  4. Netmask 填写 255.255.255.0;
  5. Gateway 留空;
  6. 应用配置,必要时关闭再重新打开该连接使配置生效。

视频实操画面中的 Gateway 确实为空,原笔记“填写 192.168.2.1”与视频不符。对于只连接开发板的接口,网关和 DNS 都应留空;这样 Ubuntu 的原网卡继续负责上网,板卡侧网卡只生成 192.168.2.0/24 直连路由。

NetworkManager 的官方 IPv4 配置说明指出:设置 gateway 会创建标准默认路由,而 ipv4.never-default=true 会阻止该连接成为默认连接,详见 NetworkManager IPv4 设置参考。如果所用桌面版本的图形界面提供“仅将此连接用于其网络上的资源”一类选项,应勾选它;命令行也可以为板卡侧 profile 设置 ipv4.never-default yes。具体 profile 名称必须先查询,不能照抄示例占位符:

# 列出配置名称、类型以及当前绑定的设备,先确认哪一条属于板卡侧网卡。
nmcli connection show

# 将板卡侧配置标记为永不提供 IPv4 默认路由;把尖括号内容换成实际配置名。
nmcli connection modify "<板卡侧配置名>" ipv4.never-default yes

# 在指定接口上重新激活这条配置;远程操作时不要误停承载 SSH 的 ens33。
nmcli connection up "<板卡侧配置名>" ifname ens37

应用后,视频再次执行 ifconfig,看到:

ens33  inet 192.168.31.230  netmask 255.255.255.0  broadcast 192.168.31.255
ens37  inet 192.168.2.220   netmask 255.255.255.0  broadcast 192.168.2.255

这验证了两个接口都拥有地址,但仍应继续检查路由。理想的关键路由结构是:

default via <上网网络的真实网关> dev ens33
192.168.2.0/24 dev ens37 ... src 192.168.2.220

不应再出现一条无依据的 default via 192.168.2.1 dev ens37。可以用下面的命令让内核直接回答“去开发板会走哪条路”,比只看地址更可靠:

# 查询发往开发板地址时将采用的出口接口、下一跳和源地址,但不真正发送数据包。
ip route get 192.168.2.120

ip route get 会按内核实际路由规则解析一次目标,定义见 Ubuntu ip-route(8) 手册。预期结果应包含板卡侧接口和源地址 192.168.2.220,而不是经 ens33 或默认网关转发。

1.4.2 正确认识 NetworkManager profile

视频最后补充:若两个紫色开关不能同时打开,可点击加号,为两个网卡建立不同 profile。这个方向基本正确,但“随便改一改 profile 就能恢复”不够严谨。

NetworkManager 中,**设备(device)**是实际网卡,**连接配置(connection/profile)**是地址、路由、DNS 等设置的集合。一个设备在同一时刻通常只激活一条普通有线 profile;两个不同设备则可以各自激活一条 profile。官方 nmcli 手册也说明,一台设备可以拥有多个候选配置,但同一时刻只能使用其中一个,参见 Ubuntu nmcli(1) 手册。

本课应建立清晰的一一对应关系:

  • ens33 → 上网/管理 profile → DHCP 或原有网络配置 → 提供默认路由;
  • ens37 → 板卡实验 profile → 192.168.2.220/24 → 不提供默认路由和 DNS。

如果重启后连不上网,先执行 nmcli device status 和 nmcli connection show --active,确认哪条 profile 实际绑定在哪个设备上,再有针对性地激活或修正;不要反复随机切换。通过 SSH 操作时尤其要避免停用当前 SSH 所走的上网接口,否则会立即断开远程会话。

1.5 测试网络

1.5.1 复现视频测试

Ubuntu 到 Windows 板卡侧物理网卡:

# 发送 4 个 ICMP Echo 请求后自动结束;视频直接使用 ping 时需按 Ctrl+C 停止。
ping -c 4 192.168.2.223

Windows 到 Ubuntu 板卡侧虚拟网卡:

# Windows 默认只发送 4 个请求,不加 /t 时通常会自行结束。
ping 192.168.2.220

视频中,Ubuntu 能收到 192.168.2.223 的回应,Windows 也能收到 192.168.2.220 的回应,证明两端在 192.168.2.0/24 上具备双向 ICMP/IP 可达性。Windows ping 默认发送 4 个 Echo 请求;只有加 /t 才持续发送,微软的参数说明见 Windows ping 命令文档。Linux ping 默认持续运行,可以按 Ctrl+C 结束,也可以像上面一样用 -c 4 限定次数;其工作机制见 Ubuntu ping(8) 手册。

视频还尝试了同网段中未配置给现有设备的地址,例如从 Ubuntu ping 192.168.2.224、从 Windows ping 192.168.2.221,均未收到回应。这个结果只说明当时没有收到这些地址的 ICMP Echo Reply,不能简单归纳为“网线一定断了”或“网络一定不通”:目标主机可能不存在、没有启用该地址、尚未启动,或者防火墙拒绝 ICMP。

同理,ping 成功只证明 ICMP 往返路径可用,并不证明 TFTP、NFS 或 U-Boot 参数已经正确。后续接入并配置开发板后,还应测试:

# 测试 Ubuntu 到开发板的 IPv4 可达性;地址沿用课程规划。
ping -c 4 192.168.2.120

# 查看内核通过 ARP/邻居发现学到的开发板 MAC;INCOMPLETE/FAILED 表示邻居解析未成功。
ip neigh show dev ens37

# 查看 TFTP 服务是否监听 UDP 69;服务端实际传输还会使用协商出的端口。
sudo ss -lunp | grep ':69'

# 查看 NFS 服务端当前真正生效的导出规则,而不只是配置文件文本。
sudo exportfs -v
1.5.2 分层排障顺序
层次检查方法能确认什么
物理层网线、接口灯、Windows“已连接”、VMware“已连接”是否存在基本链路;不能证明 IP 正确
虚拟交换层VMnet 是否桥接到准确的物理网卡Ubuntu 的第二虚拟网卡是否真正接到板卡网段
接口与地址ip -br link、ip -br address、Windows ipconfig接口状态和 IP/掩码是否正确、是否地址冲突
路由层ip route、ip route get 192.168.2.120、Windows route print -4流量是否从预期网卡发出,是否出现错误默认路由
邻居层ip neigh、Windows arp -a同网段目标能否解析到 MAC 地址
ICMP 层双向 pingIP 往返是否可达;失败也可能是防火墙拦截
服务层实际 TFTP 下载、NFS 挂载及服务日志端口、权限、路径和协议是否真正可用

最终验收标准不是“两个紫色开关都打开”,而是同时满足:Ubuntu 原网卡仍能访问原网络;192.168.2.0/24 明确经第二网卡发送;Windows、Ubuntu 和开发板地址互不冲突;三端在需要的方向上可达;TFTP/NFS 再通过各自的真实操作验证。这样双网卡才真正为后续网络启动提供了稳定基础。