如何不重新启动就重新加载udev规则?


209

一个应该如何重新加载udev规则,以便新创建的规则可以起作用?

我正在运行Arch Linux,udevstart这里没有命令。

还检查了/etc/rc.d,那里没有udev服务。


1
请注意,udev的最新版本已放弃对inotify的支持,因此这些天更经常需要重新加载更改规则。
Colin Guthrie

什么udev啊 是的经理/dev吗?
桑德堡

1
@Sandburg是的,它可以在Linux系统上处理即插即用功能。
亚伦·D·马拉斯科

Answers:


229
# udevadm control --reload-rules && udevadm trigger

4
udevtrigger之后需要吗?
尼尔斯2012年

38
@Nils实际上,您可能需要代替udevtrigger(或udevadm trigger在大多数发行版中)(将其插入设备或插回设备)。--reload-rules几乎总是无用的,因为它会自动发生。
吉尔斯2013年

12
udevadm trigger为我做了CentOS 6上的技巧。
astrostl

3
udevtriggerudevadm trigger没有为我工作。我发现某些设备在卸载和加载相同模块后会工作(假设它是可加载模块)。我发现的是不必重启系统。例如,对于网络设备,我做rmmod ixgbermmod tg3rmmod e1000然后modprobe ixgbemodprobe tg3modprobe e1000取决于类型的网络驱动程序。

1
答案中提到的所有内容均不适用于Debian Jessie(8.0)。这里ip link set $oldname name $newname提到起作用的东西。就我而言,我需要用桥接的iface(对于KVM)替换一个名为iface的iface,因此原来的iface(现在是基础的)必须重新获得其旧名称。因此,诀窍是:1)降低iface;2)修复网络配置;3)更新udev命名规则文件;4)使用重命名iface ;5)架起桥梁。laneth1ip link...
kostix

69

Udev使用inotify机制监视库和本地配置树(通常位于/lib/udev/rules.d和中/etc/udev/rules.d)中的rules目录中的更改。因此,大多数情况下,更改规则文件时无需执行任何操作。

如果您执行异常操作,例如,如果您的规则包含在另一个目录中的文件,则只需显式通知udev守护程序。然后,您可以使用通常的约定要求守护程序重新加载其配置:发送SIGHUPpkill -HUP udevd)。或者,您可以使用以下udevadm命令:udevadm control --reload-rules

但是,请注意,不同版本的udev历来具有触发自动重新加载规则的不同触发器。因此,如有疑问,请致电udevadm control --reload-rules:它不会对您造成任何伤害。

udev规则仅在添加设备时适用。如果要将规则重新应用到已连接的设备,则需要通过udevadm trigger使用正确的选项进行调用以匹配配置已更改的设备(例如)来明确地执行此操作udevadm trigger --attr-match=vendor='Yoyodyne' --attr-match=model='Frobnicator 300'


1
systemd udev是否使用inotify监视规则更改?
克雷格·麦昆

inotify机制并不总是捕获udev规则文件的更改。例如,当我cat > 10-name.rules通过粘贴内容来更改规则文件时,必须使用手动重新加载规则udevadm。经过Raspbian Stretch测试。
Daniel K.

@DanielK。最近改变了吗?IIRC在发布此答案时,我同时检查了systemd udev和非systemd udev,并且都使用了inotify,因此--reload-rules仅在罕见情况下才需要。
Gilles

@Gilles:也许我上面的示例(使用Shell重定向覆盖现有规则文件)可以被视为“不常见的情况”。当我通过编辑器(例如vi)修改此文件时,该inotify机制起作用了。
Daniel K.

@DanielK。啊,很高兴知道。这种情况并不罕见:有些编辑器会通过重写来保存文件(使用Vim和Emacs,这取决于它们的配置方式)。奇怪的是,udev只处理其中一种情况-对我来说似乎是个错误,因为我想不出将它们区别对待的理由。
Gilles

19

我添加这个是因为有一天我会再次需要它。

有时您会错误地匹配以太网设备编号和MAC地址。有时,这确实很重要,例如在VM中运行并将每个设备分配给不同的VLAN时。

  1. 关闭网络接口,然后
  2. 修改/etc/udev/rules.d/70-persistent-net.rules(或其等效项)
  3. 重新加载 udevadm control --reload-rules
  4. 重新触发 udevadm trigger --attr-match=subsystem=net
  5. 打开网络接口。

我很惊讶这工作得如何。


6
在Red Hat上:service network stop && udevadm control --reload-rules; udevadm trigger --attr-match=subsystem=net; service network start
Alexander Torstling

1
在Debian测试中,“ udevadm触发器--attr-match = subsystem = net”不起作用。我只需要拔出并插入USB以太网卡,然后udev触发新规则。
Trismegistos

Trismegistos,我愿意打赌,按照Clayton Dukes的回答,拔出/插入类似于删除并重新加载网络驱动程序。
Mike S

12

我不确定这是否适用,这绝对是较旧的文章,但是在我的网络上搜索udev信息的比例很高,所以我想我可能会分享一些知识。

您可以手动触发特定设备的udev规则。这仅适用于与Redhat相关的发行版(centos fedora等,等等)

在规则文件(/etc/udev/rules.d/whateveryoucalledyourrules)中进行了相关更改后,您可以回change显设备的uevent。

echo change > /sys/block/devname/partname1/uevent

这将强制仅此设备读取udev规则。我认为这要好得多,而且更有针对性。


4

对我而言,以下命令序列已按需工作。

我做/etc/udev/rules.d/70-persistent-net.ruleseth一些修改,以更改数量并重新加载它们而无需重新启动。

/etc/init.d/networking stop
/etc/init.d/udev stop
udevadm control --reload-rules
/etc/init.d/udev start
/etc/init.d/networking start

通过执行此操作,它已在运行时成功加载,而无需重新启动计算机。

对此有任何建议或欢迎,因为我是通过阅读手册页自行发现的。


2

我在这里添加了正确的答案,因为花了一段时间我才注意到@enthusiasticgeek的评论。您需要做的所有事情(假设您在服务器的控制台上-显然,如果要使用ssh'd,这样做不好!):

  1. 获取正在使用的接口模块的列表:

cat /etc/udev/rules.d/70-persistent-net.rules | grep "PCI device" | perl -pe 's/.*\((\w+)\).*/$1/g'| uniq

在我的情况下,它是igb,因此它仅打印出来。

  1. 类型sudo rmmod igb(替换igb为从步骤1获得的卡驱动程序。

接下来,/etc/udev/rules.d/70-persistent-net.rules根据需要进行编辑,然后使用modprobe igb再次加载模块,再次替换igb为您的模块。


这与Otheus的答案相结合,是使我无需重新启动计算机即可修复Mellanox网卡配置的秘密武器。我相信驱动程序的加载以及对persistent-net.rules文件的udevadm读取大致类似于系统在启动时所做的工作。
Mike S

0

如果有多个网络

cat /etc/udev/rules.d/70-persistent-net.rules | grep "PCI device" | awk '{print $NF}'|sed -e 's/(//g' -e 's/)//g'| uniq > /tmp/listnet
rm -rf /etc/udev/rules.d/70-persistent-net.rules 
for i in $(cat /tmp/listnet); do rmmod $i; modprobe $i;done
service network restart
rm -rf /tmp/listnet
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.