在 udev 规则集中分配名称之前如何重置网络适配器的状态?

在 udev 规则集中分配名称之前如何重置网络适配器的状态?

debian 6.1.0-20 内核更新后 USB3 网卡接口问题的第 4 部分。

请参阅此处的其他帖子:

抽象的: 最近使用内核 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 地址已被更改(手动或其他方式,例如:将接口设置为绑定从属)。这个规则不会触及这个(也不应该,也不会遇到这种情况)

  • 使用的文档

相关内容