一、问题背景与目标

在一个多网卡环境的树莓派系统中,存在如下网络接口:

接口类型说明
lo回环接口系统内部通信
eth0板载有线网卡常态不插网线
enxUSB0USB 以太网适配器期望作为主要联网方式
wlan0无线网卡偶尔手动连接

系统出现的主要现象:

  1. enxUSB0 在某些情况下 不自动 UP
  2. enxUSB0 不自动获取 IPv4 地址
  3. 系统重启后 enxUSB0 经常处于 DOWN 状态
  4. 由于 eth0 不插网线、wlan0 不自动连接,导致 系统无网络

目标状态:

系统重启后,只要:

  • USB 网卡存在
  • 网线连接正常

系统就应该:

  • 自动启用 enxUSB0
  • 自动通过 DHCP 获取 IPv4 地址

同时需要实现多网卡路由优先级策略:

wlan0(手动连接时优先)

USB 以太网 enxUSB0

eth0

二、确认接口状态与问题复现

首先查看系统识别到的网络接口:

ip a

当时观察到:

eth0            已获取 IPv4(192.168.x.x)
enxUSB0 DOWN
wlan0 未连接

进一步只查看 USB 网卡:

ip link show enxUSB0

三、区分链路问题还是 DHCP 问题

在网络排查中,第一步必须判断物理链路是否建立

使用 ethtool 检查链路状态:

ethtool enxUSB0

早期输出中出现:

Link detected: no

这一步意味着:

即使 DHCP 客户端工作正常,也不会获得 IPv4 地址,因为:

  • 物理链路未建立
  • DHCP 请求不会发送

链路未建立可能原因包括:

  • 网线问题
  • 交换机端口问题
  • USB 网卡供电不足
  • 驱动未加载
  • 接口未 UP

四、手动启用接口并重新确认链路

先将接口设置为 UP:

ip link set enxUSB0 up

然后再次检查:

ip link show enxUSB0
ethtool enxUSB0

此时出现关键变化:

Link detected: yes

说明:

  • 物理链路已经建立
  • 可以继续进行 DHCP 获取地址

五、手动触发 DHCP 获取 IPv4

首先检查接口当前地址:

ip addr show enxUSB0

当时只看到:

fe80::xxxx

说明:

  • 只有 IPv6 link-local 地址
  • 还没有 IPv4

手动运行 DHCP 客户端:

dhcpcd enxUSB0

观察到的关键输出:

offered 192.168.x.x from 192.168.x.1
leased 192.168.x.x
adding default route via 192.168.x.1

再次确认接口地址:

ip a

此时 enxUSB0 出现:

inet 192.168.x.x/24

说明:

  • DHCP 工作正常
  • 网络环境正常

因此问题本质是:

开机时接口没有自动启用,也没有自动运行 DHCP。


六、重启后再次失效:定位到 dhcpcd 服务未启用

系统重启后再次检查:

ip a

发现:

enxUSB0  DOWN
无 IPv4

查看 DHCP 服务:

systemctl status dhcpcd

结果:

Unit dhcpcd.service could not be found

说明:

系统虽然存在 dhcpcd 命令,但:

  • 没有 systemd 服务
  • 或者 服务未启用

因此系统启动时不会自动运行 DHCP。


七、启用 dhcpcd 服务(关键修复步骤)

执行:

systemctl enable --now dhcpcd.service

执行完成后再次查看:

ip a

此时 enxUSB0 立即获得 IPv4 地址

192.168.x.x

这一步完成后:

系统启动时就会自动运行 DHCP。


八、多网卡环境下的默认路由问题

在多网卡环境中:

是否能正常上网不仅取决于接口是否有 IP,还取决于默认路由。

查看路由表:

ip route show

示例输出:

default via 192.168.x.1 dev enxUSB0 metric 100
default via 192.168.x.1 dev eth0 metric 300
default via 192.168.x.1 dev wlan0 metric 3004

路由选择规则:

metric 越小优先级越高

当前优先级:

enxUSB0 100
eth0 300
wlan0 3004

但期望策略是:

wlan0(连接时优先)

USB 网卡

eth0

因此需要设置:

wlan0   metric 50
enxUSB0 metric 100
eth0 metric 300

九、使用 dhcpcd.conf 固化路由优先级

备份配置文件:

cp /etc/dhcpcd.conf /etc/dhcpcd.conf.bak

编辑:

vim /etc/dhcpcd.conf

在文件末尾添加:

interface wlan0
metric 50interface enxUSB0
metric 100interface eth0
metric 300

保存后重启 DHCP 服务:

systemctl restart dhcpcd

验证路由:

ip route show

测试实际路由:

ip route get 8.8.8.8

期望结果:

  • Wi-Fi 未连接 → 使用 enxUSB0
  • Wi-Fi 连接 → 使用 wlan0

十、增强 USB 网卡自动 UP(提高鲁棒性)

USB 网卡存在以下不确定因素:

  • 热插拔
  • 驱动加载顺序
  • USB 初始化延迟
  • 链路抖动(carrier lost / acquired)

为了保证接口出现时自动启用,可以增加 udev 规则。

创建规则文件:

vim /etc/udev/rules.d/90-usb-ethernet.rules

写入:

ACTION=="add", SUBSYSTEM=="net", NAME=="enxUSB0", RUN+="/sbin/ip link set dev enxUSB0 up"

加载规则:

udevadm control --reload

手动触发:

udevadm trigger --action=add /sys/class/net/enxUSB0 || true

该规则作用:

当系统检测到 USB 网卡出现时:

自动执行
ip link set dev enxUSB0 up

从而避免接口保持 DOWN。


十一、dhcpcd 日志中的警告说明

在查看日志时可能出现如下信息:

journalctl -u dhcpcd -b --no-pager -n 100

示例日志:

ps_bpf_recvmsg: Invalid argument
ps_bpf_recvbpf: unexpected event 0x0100

但同时可以看到:

leased 192.168.x.x
adding default route

说明:

  • DHCP 实际上已经成功
  • 这些日志属于抓包接口相关警告

通常是:

dhcpcd 与内核网络接口能力之间的兼容性提示

不影响实际网络功能,可以忽略。

若需要彻底消除:

  • 升级内核
  • 升级 dhcpcd

即可。


十二、最终检查清单

系统重启后,可以执行以下检查:

检查接口 IPv4

ip a show enxUSB0

查看默认路由

ip route show

检查实际路由

ip route get 8.8.8.8

查看 DHCP 服务

systemctl status dhcpcd -l

查看 DHCP 日志

journalctl -u dhcpcd -b --no-pager -n 200

十三、最终结果

完成全部配置后:

  1. 系统启动时
    dhcpcd.service 自动运行
  2. USB 网卡自动获取 DHCP 地址
  3. 默认路由策略稳定:
wlan0(连接时优先)

enxUSB0

eth0
  1. 通过 udev 规则增强了 USB 网卡自动启用能力

系统网络行为变得:

稳定
可预测
自动恢复

附录:本文涉及的全部命令

ip a
ip link show enxUSB0
ethtool enxUSB0
ip link set enxUSB0 up
ip addr show enxUSB0
dhcpcd enxUSB0
systemctl status dhcpcd
systemctl enable --now dhcpcd.service
ip route show
ip route get 8.8.8.8
cp /etc/dhcpcd.conf /etc/dhcpcd.conf.bak
vim /etc/dhcpcd.conf
systemctl restart dhcpcd
vim /etc/udev/rules.d/90-usb-ethernet.rules
udevadm control --reload
udevadm trigger --action=add /sys/class/net/enxUSB0 || truejournalctl -u dhcpcd -b --no-pager -n 200

Leave a Reply

Your email address will not be published. Required fields are marked *