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


46

我已将eth1界面名称更改为eth0udev现在如何要求重新读取配置?

service udev restart

udevadm control --reload-rules

不要帮忙 那么,除了重新启动之外,还有什么有效的方法吗?(是的,重新启动有助于解决此问题)

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

  • 我只是更改了NAMEudev-rule行的属性。不知道任何无效的原因。

我上面发布的两个命令的执行没有任何错误,但是它们只是不更改ifconfig -a输出中的实际接口名称。如果执行重新引导-接口名称将按预期更改。

出于开发目的,我编写了一些脚本来克隆虚拟机(由VirtualBox驱动)并以某种方式对其进行预先设置。

因此,我执行了一个命令来克隆VM,启动它,只要更改udev了网络接口MAC,就将第二条规则添加到网络持久性规则中。首次启动计算机后,有两个规则:

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

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

问题:我不想重新引导计算机(这将需要花费一些时间,这在构建VM阶段不是一件好事),只想/dev用某些命令重新构建我的现成的VM无需重新启动。


您如何更改eth1eth0?您刚刚重命名了设备文件吗?如果是这样,那不是一种有效的方法(您应该期望通过成功重新启动udev守护程序来还原更改)。如果您使用了其他方法,请对其进行详细描述,并提供运行尝试的命令(用于重新启动udev守护程序或重新加载其规则)时所看到的所有错误消息的完整和准确的文本。您可以编辑问题以提供此信息。
伊莱亚·卡根

@Eliah Kagan:已更新。ps:为什么要还原?它不应该;-)
zerkms 2011年

udev在中动态生成设备/dev。如果重新启动,它将根据其规则重新生成它们。一般来说,直接对它们进行的更改不是持久的。重启似乎udev正常,但您只是没有正确更改设备名称。
伊莱亚·卡根

@Eliah Kagan:udev 在找不到特定设备的规则时才添加(而不修改)新规则。如果存在匹配的规则,则无需修改即可。
zerkms 2011年

@Eliah Kagan:我正确地进行了更改。只相信我确实可以改变一行字符;-)(也可以重新启动helpes,这证明一切都符合规则)
zerkms 2011年

Answers:


29

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

sudo udevadm trigger

获得具有创建的新链接。


3
我认为这sudo udevadm trigger --action=change是更安全的方法,按照这封关于安全和不安全方法的电子邮件udevlists.ubuntu.com/archives/ubuntu-devel/2009-January/027260.html
Ehtesh Choudhury

确实如此,这就是所谓的/etc/udev/rules.d/70-persistent-net.rules
桑福德,2015年

在Ubuntu 15.04下udevadm trigger,我的X11会话被锁定,然后又回到登录屏幕。
伊恩·艾伦

20

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

  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步,请编辑此答案以反映您的发现。


1
Ubuntu 15.04中列出了所有设备/etc/network/interfaces(因此Network Manager不用理会它们):我要做的只是编辑/etc/udev/rules.d/70-persistent-net.rules然后执行#2,#3,#5。无需停止所有联网;不需要任何其他东西。
伊恩·艾伦

5

我有一个类似的问题。由于我不想花时间重新启动,因此我根据Chris Wesseling的建议跑了一个班轮。

/etc/init.d/networking停止&& modprobe -r tg3 && udevadm控制--reload-rules && udevadm触发器&& modprobe tg3 && /etc/init.d/网络启动

这对我使用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)<NIC的内核模块驱动程序

我遇到的一个问题是我使用简单的路由添加命令修复了一条错误的路由。感谢克里斯的帮助!




3

这应该安全地执行:

sudo reload udev

正如我使用此命令没有问题。


不,ifconfig -a仍显示我的老eth1界面
zerkms

1

我已经出于几乎相同的目的进行了一段时间的研究,但我还没有找到在实时系统中更改网络接口名称的方法。

我要解决的方法是删除模板中的/etc/udev/rules.d/70-persistent-net.rules文件,这意味着在下次启动时它将看到任何网卡为eth0。


1

您需要重新加载udev才能触发规则更改,但是除非卸载/重新加载驱动程序模块,否则设备不会重命名。

因此modprobe -r e1000 && modprobe e1000,udev重新加载后应该可以解决问题。当然,如果您需要网络并且只有e1000接口,请不要这样做。



0

因此,对于使用Ubuntu 12.04的VirtualBox来说,我经常在以太网和无线之间切换。

因此,当我的连接更改时,必须从“设备”>“网络设置”中选择“桥接适配器”。“ Intel 82579LM千兆网络连接”或“ Intel Centrino Ultimate-N 6300 AGN”。

完成此操作后,我可以运行

sudo modprobe -r e1000
sudo service udev restart
sudo modprobe e1000
ping google.com # To test I ran this between each command.

阅读以上所有答案后,这只是对我的结果的解释。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.