网站搜索

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


Udev(用户空间/dev)是一个用于动态设备检测和管理的Linux子系统,从内核版本2.6开始。它是 devfshotplug 的替代品。

它在启动时或者添加设备到系统或从系统中删除设备。然后,它将有关设备的信息或对其状态的更改传播到用户空间。

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

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

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

了解 Linux 中 Udev 的基础知识

udev 守护进程 systemd-udevd(或 systemd-udevd.service)与内核通信并接收设备 uevents > 每次从系统中添加或删除设备,或者设备更改其状态时,都直接从中获取。

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

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

要创建设备节点文件,udev需要使用某些属性来标识设备,例如标签、序列号、使用的主设备号和次设备号、总线设备号等多得多。此信息由 sysfs 文件系统导出。

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

udev 的主要配置文件是 /etc/udev/udev.conf,要控制 udev 守护程序的运行时行为,您可以使用 udevadm 实用程序。

要显示接收到的内核事件 (uevents) 和 udev 事件(udev 在规则处理后发出的事件),请运行 udevadm > 使用监视命令。然后将设备连接到您的系统并从终端观察设备事件的处理方式。

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

udevadm monitor 

要查找分配给 USB 磁盘的名称,请使用 lsblk 实用程序读取 sysfs 文件系统和 udev db 来收集有关已处理设备的信息。

 
lsblk

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

udevadm info /dev/sdb1

如何在 Linux 中使用 Udev 规则

在本节中,我们将简要讨论如何编写 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"

在哪里 :

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

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

sudo udevadm control --reload

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

ls -l /tmp/scripts.log

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

cat /tmp/scripts.log

有关如何编写 udev 规则和管理 udev 的更多信息,请分别查阅 udevudevadm 手册条目,方法是运行:

man udev
man udevadm
概括

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

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