一、问题背景与目标
在一个多网卡环境的树莓派系统中,存在如下网络接口:
| 接口 | 类型 | 说明 |
|---|---|---|
lo | 回环接口 | 系统内部通信 |
eth0 | 板载有线网卡 | 常态不插网线 |
enxUSB0 | USB 以太网适配器 | 期望作为主要联网方式 |
wlan0 | 无线网卡 | 偶尔手动连接 |
系统出现的主要现象:
enxUSB0在某些情况下 不自动 UPenxUSB0不自动获取 IPv4 地址- 系统重启后
enxUSB0经常处于 DOWN 状态 - 由于
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
十三、最终结果
完成全部配置后:
- 系统启动时
dhcpcd.service自动运行 - USB 网卡自动获取 DHCP 地址
- 默认路由策略稳定:
wlan0(连接时优先)
↓
enxUSB0
↓
eth0
- 通过
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