重新启动 udev 的正确方法是什么?

重新启动 udev 的正确方法是什么?

我已将接口名称更改eth1eth0。现在如何udev重新读取配置?

service udev restart

udevadm control --reload-rules

没有帮助。那么除了重启之外还有其他有效的方法吗?(是的,重启有助于解决这个问题)

  • 是的,我知道我应该在命令前面加上sudo,但是我上面发布的任何一个命令都不会改变输出ifconfig -a:我仍然看到eth1,而不是eth0

  • 我刚刚更改了NAMEudev-rule 行的属性。不知道这为什么无效。

没有任何错误执行我上面发布的两个命令时,它们只是没有改变ifconfig -a输出中的实际接口名称。如果我执行重新启动 - 那么接口名称就会按预期更改。

为了开发目的,我编写了一些脚本来克隆虚拟机(VirtualBox 驱动)并以某种方式预先设置它们。

因此,我执行命令来克隆虚拟机,启动它,只要网络接口 MAC 发生变化 - 就会udev将第二条规则添加到网络持久规则中。机器首次启动后,有 2 条规则:

  • eth0,不存在,只要它存在于原始 VM 映像 MAC 中
  • eth1,它存在,但所有文件中的所有配置都引用了eth0,所以对我来说不是那么好

因此,我sed删除了带有 的行eth0(在克隆的图像中它已过时且无用)并替换eth1为。因此,目前我有有效的持久规则,但中eth0仍然存在。eth1/dev

问题是:我不想重新启动机器(这将花费另一段时间,这对于构建 VM 阶段来说不是一件好事)而只想使用/dev一些命令重建它,这样我就可以使用 VM 而无需重新启动。

答案1

我不知道这是否有助于重新加载网络配置,但当我修改/etc/udev/rules.d/70-persistent-cd.rules以更正 DVD 设备链接/dev/dvd1/dev/dvd,我必须运行

sudo udevadm trigger

以获得新的链接创建。

答案2

您必须按照正确的顺序组合这里给出的所有建议:

  1. 破坏网络service networking stop
  2. 从内核卸载驱动模块
    1. 找到模块的名称lspci -v并查找“正在使用的内核驱动程序:”
    2. modprobe -r <driver module>
  3. 重新加载 udev 规则udevadm control --reload-rules
  4. 触发新规则udevadm trigger
  5. 加载驱动程序modprobe <driver module>
  6. 重启网络service networking start
  7. (可选)重新运行启动之前iptables引用该接口名称的所有脚本。eth

我怀疑步骤 4 或步骤 5 并不是真正需要的,但这些步骤对我有用。您可以在步骤 4 之后检查步骤 2.1,看看触发命令是否已经执行了步骤 5,如果已经执行,请编辑此答案以反映您的发现。

答案3

我遇到了类似的问题。由于我不想花时间重新启动,所以我按照 Chris Wesseling 的建议运行了一个单行程序。

/etc/init.d/networking stop && modprobe -r tg3 && udevadm control --reload-rules && udevadm trigger && modprobe tg3 && /etc/init.d/networking start

在我使用 Ubuntu 12.04.02 服务器时,此方法有效。我的网卡使用的是 tg3 内核模块驱动程序,因此请将 tg3 更改为您的接口正在使用的模块。我在以下位置找到了我使用的模块/etc/udev/rules.d/70-persistent-net.rules

PCI 设备 0x14e4:/sys/devices/pci0000:00/0000:00:1c.4/0000:02:00.1 (tg3) <-网卡的内核模块驱动程序

我遇到的一个问题是路线不好,我用一个简单的路线添加命令解决了这个问题。感谢 Chris 的帮助!

答案4

sudo /etc/init.d/udev restart应该可以解决问题。您尝试过的一些命令,如果使用 运行sudo,可能也会有效。

相关内容