AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 774865
Accepted
user3450548
user3450548
Asked: 2024-04-20 15:23:07 +0800 CST2024-04-20 15:23:07 +0800 CST 2024-04-20 15:23:07 +0800 CST

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

  • 772

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{address} 编写的所有 udev 规则(根据以下内容更改接口名称) mac 地址)不再起作用。

现在为什么写这篇文章:

  • 使用ATTRS{serial}确实有效,但我有 6 个适配器中的 3 个共享相同的“串行”属性,因此无法确定哪个是哪个。
  • 此时我尝试使用 USB 的ATTRS{busnum}和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+= 解决方案与此相关吗?

debian
  • 1 1 个回答
  • 29 Views

1 个回答

  • Voted
  1. Best Answer
    A.B
    2024-04-21T01:55:19+08:002024-04-21T01:55:19+08:00

    描述

    为了修复当前状态,按照OP的想法,我制定了一条udev规则:

    • 仅当满足所有这些条件时:

      • 添加
      • 网络设备
      • 带司机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
        

        如果接口已经启动(例如:通过NetworkManager等网络工具),则可能不需要检查其 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:)

      • eudev (Devuan, Gentoo ...):我不知道eudev从内部触发事件时的行为是否与systemd的udev相同。第三次运行可能需要改变。

    • 如果由于某种原因必须添加附加条件,因为...S匹配变体(对于父属性)必须全部是同一父属性的一部分,如果需要DRIVERS=="ax88179_178a",可以替换ATTRS{product}=="AX88179"为类似的效果(并且如果特定 USB 设备确实匹配)此属性)以从其他父级(例如ATTRS{serial})获取备用有用属性。

    • 至少addr_assign_type=3这似乎意味着 MAC 地址已被更改(手动或其他方式,例如:将接口设置为绑定从属)。这个规则不会触及这个(也不应该,也不会遇到这种情况)

    • 使用的文档

      • udev(7)
      • udevadm(8)
      • /lib/udev/rules.d/作为示例的文件
    • 2

相关问题

  • GRUB 配置以识别同一 Linux 发行版的不同桌面环境(安装)

  • astyle 不会更改源文件格式

  • 接收有关全新 Debian 的电子邮件

  • Debian Stretch:libgs_plugin_systemd-updates.so 中的 gnome-software 段错误

  • 如何在拼音输入法中输入ü?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve