Yocto嵌入式Linux板重启后eth0缺全局IPv6致网络不可达如何解决
问题根因说明
该问题是嵌入式Linux软重启过程中以太网PHY未被硬件复位,导致链路状态残留、上层网络协议栈初始化异常,核心表现为eth0未获取到IPv6全局地址、默认路由丢失,最终公网访问不通。
解决方案
1. 优先修复PHY复位问题(对应网口灯未熄灭现象)
- 先确认开发板以太网PHY的复位GPIO编号,可查阅板级原理图或设备树配置找到对应GPIO号
- 在系统关机重启的脚本中添加PHY复位逻辑:
若使用systemd管理系统,在/lib/systemd/system-shutdown/目录下新建phy-reset.sh文件,添加以下内容:
执行#!/bin/bash # 替换X为实际的PHY复位GPIO编号 echo X > /sys/class/gpio/export echo out > /sys/class/gpio/gpioX/direction echo 0 > /sys/class/gpio/gpioX/value sleep 0.1 echo 1 > /sys/class/gpio/gpioX/valuechmod +x /lib/systemd/system-shutdown/phy-reset.sh赋予执行权限,之后软重启时系统会自动在关机阶段复位PHY,彻底解决链路状态残留问题。 - 如果找不到复位GPIO,可使用ethtool做软复位,在上述脚本中替换为
ethtool --reset eth0 all即可。
2. 补充网络重协商兜底配置
如果暂时无法修改复位逻辑,可添加开机自启动服务强制重新初始化网络接口:
- 新建
/etc/systemd/system/eth-reinit.service文件,内容如下:[Unit] Description=Reinitialize ethernet interface after boot After=network.target [Service] Type=oneshot ExecStart=/sbin/ip link set eth0 down ExecStart=/bin/sleep 1 ExecStart=/sbin/ip link set eth0 up ExecStart=/bin/sleep 2 ExecStart=/sbin/ifup eth0.2 [Install] WantedBy=multi-user.target - 执行
systemctl enable eth-reinit.service开启开机自启即可。
3. 修正IPv6路由通告接收配置
执行以下命令确保eth0开启IPv6路由通告接收,避免无法获取全局IPv6地址:
echo "net.ipv6.conf.eth0.accept_ra=2" >> /etc/sysctl.conf sysctl -p
验证方式
配置完成后执行3次以上软重启测试,每次重启后执行ping 1.1.1.1验证公网连通性即可。
内容的提问来源于stack exchange,提问作者godo
相关产品推荐
相关产品推荐

