debian 6.1.0-20 内核更新后 USB3 网卡接口问题的第 4 部分。
请参阅此处的其他帖子:
- Debian 12 - 突然间,我的 USB3 Lan 适配器每次重新启动时都会分配随机 MAC 地址
- 在 UDEV 配置中使用父属性“serial”为 lan 接口分配另一个名称,而不是依赖于 MAC 地址
- 在 udev 规则中使用 USB 网卡地址的 USB 路径来分配接口名称而不是 MAC 地址
抽象的: 最近使用内核 6.1.0-20 的 debian 更新打破了对存储在 usb-lan nics EEPROM 内的 MAC 地址的识别,因此之前使用ATTR{地址}(根据 mac 地址更改接口名称)不再起作用。
现在为什么写这篇文章:
- 使用ATTRS{系列}确实有效,但我有 6 个适配器中的 3 个共享相同的“串行”属性,因此无法确定哪个是哪个。
- 我此时尝试使用USBATTRS{总线号}和ATTRS{devnum}然而,要具体识别剩下的 3 个接口,这些值似乎并不稳定,并且会随着主交流电流的移除和放回而随时改变。
所以上述解决方案都没有真正解决最后的问题。
然而,似乎如果您使用以下命令放下和打开(或者可能仅打开)eth 接口:
ip link set dev eth0 down
ip link set dev eth0 up
eth0 又名 USB3 LAN 适配器读回存储在 EEPROM 中的正确 MAC 地址...
此时我唯一的想法是:
- 我可以放下/打开所有接口,以便它们获得正确的 MAC 地址并使 udev 再次重新应用规则,还是只在启动时发生一次?如果可能的话,你能帮我写一个脚本,能够将 eth 从 0 降到 10,然后重新调用 udev,以便可以重命名接口。
或者...
- 当接口已经取回其原始 MAC 地址时,能够在调用 udev 之前向下/向上刷新 ETH,在这种情况下,udev 应该完成其工作。
您上次@AB 建议的 RUN+= 解决方案与此相关吗?
答案1
描述
为了修复当前状态,按照OP的想法,我做了一个乌德夫规定:
仅当满足所有这些条件时:
- 添加
- 网络设备
- 带司机
ax88179_178a
- 使用随机 MAC 地址创建 (
addr_assign_type=1
)
将要:
设置接口 UP(从而使驱动程序检索永久 MAC 地址属性)
将其设置回 DOWN(这是新添加的接口的预期状态)
如果确认接口现在已检索到其永久 MAC 地址 (
addr_assign_type=0
),则重新触发该接口的添加...从而通过对界面进行适当的重命名来触发新一轮。 (例如:如果没有其他说明,通常 USB 网络接口会根据其 MAC 地址重命名为
enx...
)
规则和激活
创建一个优先级足够低的规则(我选择了 40)
/etc/udev/rules.d/40-local-net-ax88179_178a.rules
:
ACTION=="add", SUBSYSTEM=="net", ATTR{addr_assign_type}=="1", DRIVERS=="ax88179_178a", \
RUN="/bin/ip link set %k up", RUN+="/bin/ip link set %k down", \
RUN+="/bin/udevadm trigger -s net -a addr_assign_type=0 -p INTERFACE=%k -c add"
然后仅第一次(从较重到最轻的效果):
重启
或重新启动
udev
:systemctl restart udev
并拔下/重新插入 USB 设备
或重新加载驱动程序
rmmod ax88179_178a modprobe ax88179_178a
或者仅在需要修复的接口上人为地触发新规则
udevadm trigger -v -s net -p ID_NET_DRIVER=ax88179_178a -a addr_assign_type=1 -c add
如果接口已经启动(例如:通过诸如网络管理器),它可能不需要检查其 MAC 地址类型,而只需执行以下操作:
udevadm trigger -v -s net -p ID_NET_DRIVER=ax88179_178a -c add
补充笔记
这最终将导致与补丁之前相同数量的设备重置,从而避免发生此类设备重置:两次,因为接口获得了额外的 UP(然后是 DOWN),确实触发了此类重置。
因此,无论如何编译内核时,恢复补丁仍然更简单。当需要 SecureBoot 并且无法签署生成的内核模块时,此解决方法非常有用。
实际的第三个驱动程序补丁仍然会受到欢迎。
运行命令
必须使用第一个 RUN 命令。
第二个 RUN 命令应该用于获得与使用正确处理 NIC 的内核驱动程序运行时相同的结果:添加处于状态 DOWN 的接口。人们可能会考虑不要将其设置为“关闭”并保留其“打开”,从而避免一台设备重置(如果以后的网络工具可以解决这一问题)
最后一个 RUN 命令可能会被跳过:如果接口已被仅依赖于 MAC 地址的更高版本的网络工具重命名,则可能不需要该命令。
循环不会发生,因为:
- 如果接口获得永久 MAC 地址:无操作
- 如果接口一旦启动然后关闭仍然没有获得永久 MAC 地址(即:解决方法不起作用),则
add
不会执行该操作(因为它仅限于永久 MAC 地址设备),为设备留下随机 MAC 地址
Debian 以外的其他发行版
确保
/bin/ip
存在或将其替换为正确的路径(例如/sbin/ip
:)尤德夫(Devuan、Gentoo ...):我不知道是否尤德夫行为相同系统的乌德夫当从内部触发事件时。第三次运行可能需要改变。
如果由于某种原因必须添加附加条件,因为
...S
匹配变体(对于父属性)必须全部是同一父属性的一部分,如果需要DRIVERS=="ax88179_178a"
,可以替换ATTRS{product}=="AX88179"
为类似的效果(并且如果特定 USB 设备确实匹配)此属性)以从其他父级(例如ATTRS{serial}
)获取备用有用属性。至少
addr_assign_type=3
这似乎意味着 MAC 地址已被更改(手动或其他方式,例如:将接口设置为绑定从属)。这个规则不会触及这个(也不应该,也不会遇到这种情况)使用的文档
udev(7)
udevadm(8)
/lib/udev/rules.d/
作为示例的文件