如何在 Linux 中使用 Udev 进行设备检测和管理

乌德夫(用户空间/dev)是一个用于动态设备检测和管理的Linux子系统,自内核版本2.6。它的替代品是开发文件系统热插拔

它动态创建或删除设备节点(设备驱动程序的接口,出现在文件系统中,就好像它是普通文件一样,存储在/dev目录)在启动时或者在系统中添加或删除设备时。然后,它将有关设备的信息或对其状态的更改传播到用户空间。

它的功能是 1) 向系统应用程序提供设备事件,2) 管理设备节点的权限,3) 可以在/dev用于访问设备的目录,甚至重命名网络接口。

的优点之一乌德夫其优点是它可以使用持久设备名称来保证重新启动后设备命名的一致性,无论其发现顺序如何。此功能非常有用,因为内核只是根据发现顺序分配不可预测的设备名称。

在这篇文章中,我们将学习如何使用乌德夫用于 Linux 系统上的设备检测和管理。请注意,大多数(如果不是全部)主流现代 Linux 发行版都附带乌德夫作为默认安装的一部分。

了解 Linux 中 Udev 的基础知识

乌德夫守护进程,系统d-udevd(或者systemd-udevd.service) 与内核通信并接收设备事件每次从系统中添加或删除设备或设备更改其状态时,都可以直接从中获取信息。

乌德夫基于规则——它的规则灵活且非常强大。每个收到的设备事件都会与从位于以下位置的文件中读取的规则集进行匹配/lib/udev/rules.d/run/udev/rules.d

您可以在以下位置编写自定义规则文件/etc/udev/rules.d/目录(文件应以.rules扩展名)来处理设备。请注意,该目录中的规则文件具有最高优先级。

要创建设备节点文件,乌德夫需要使用某些属性来识别设备,例如标签,、其使用的主要和次要编号、总线设备编号等等。该信息由系统文件系统文件系统。

每当您将设备连接到系统时,内核都会检测并初始化它,并在下创建一个具有设备名称的目录/系统/存储设备属性的目录。

udev的主要配置文件是/etc/udev/udev.conf,并控制 udev 守护程序的运行时行为,您可以使用乌德瓦德姆公用事业。

显示接收到的内核事件事件) 和udev事件(udev 在规则处理后发出),运行乌德瓦德姆与监视器命令。然后将设备连接到您的系统并从终端观察设备事件的处理方式。

以下屏幕截图显示了摘录添加将USB闪存盘连接到测试系统后发生的事件:

$ udevadm monitor 
在 Linux 中监控设备事件

要查找分配给 USB 磁盘的名称,请使用其中读取系统文件系统文件系统和udev数据库收集有关已处理设备的信息。

 
$ lsblk
列出 Linux 中的块设备

从上一个命令的输出中,USB 磁盘被命名为sdb1(绝对路径应该是/dev/sdb1)。要从 udev 数据库查询设备属性,请使用信息命令

$ udevadm info /dev/sdb1
在 Linux 中从 Udev DB 查询设备属性

如何在 Linux 中使用 Udev 规则

在本节中,我们将简要讨论如何编写乌德夫规则。规则由一个或多个键值对的逗号分隔列表组成。规则允许您从默认名称重命名设备节点、修改设备节点的权限和所有权、在创建或删除设备节点时触发程序或脚本的执行等。

我们将编写一个简单的规则,以便在添加 USB 设备以及从正在运行的系统中删除该设备时启动脚本。

让我们首先创建两个脚本:

$ sudo vim /bin/device_added.sh

在中添加以下行device_added.sh脚本。

#!/bin/bash
echo "USB device added at $(date)" >>/tmp/scripts.log

打开第二个脚本。

$ sudo vim /bin/device_removed.sh

然后将以下行添加到device_removed.sh脚本。

#!/bin/bash
echo "USB device removed  at $(date)" >>/tmp/scripts.log

保存文件,关闭并使两个脚本可执行。

$ sudo chmod +x /bin/device_added.sh
$ sudo chmod +x /bin/device_removed.sh

接下来,我们创建一个规则来触发上述脚本的执行,名为/etc/udev/rules.d/80-test.rules

$ vim /etc/udev/rules.d/80-test.rules

在其中添加以下两条规则。

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device",  RUN+="/bin/device_added.sh"
SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_removed.sh"

在哪里:

  • "==": 是比较相等性的运算符。
  • "+=": 是一个运算符,用于将值添加到保存条目列表的键中。
  • 子系统:匹配事件设备的子系统。
  • 行动:与事件操作的名称匹配。
  • 环境{DEVTYPE}:与设备属性值匹配,在本例中为设备类型。
  • 跑步:指定作为事件处理的一部分执行的程序或脚本。

保存文件并关闭它。然后以root身份告诉系统d-udevd通过运行来重新加载规则文件(这也会重新加载其他数据库,例如内核模块索引)。

$ sudo udevadm control --reload

现在将 USB 驱动器连接到您的机器并检查是否device_added.sh脚本已执行。首先是文件脚本日志应该创建在/tmp

$ ls -l /tmp/scripts.log
添加USB后检查脚本日志

然后该文件应该有一个条目,例如“USB 设备已于 date_time 删除”,如屏幕截图所示。

$ cat /tmp/scripts.log
移除 USB 后检查脚本日志

有关如何编写 udev 规则和管理 udev 的更多信息,请参阅乌德夫乌德瓦德姆通过运行以下命令分别手动输入:

$ man udev
$ man udevadm
概括

乌德夫是一个出色的设备管理器,它提供了一种动态方式来设置设备节点/dev目录。它确保设备在插入并发现后立即进行配置。它将有关已处理设备的信息或其状态更改传播到用户空间。

如果您对此主题有任何问题或想法要分享,请使用反馈表。