首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【udev用户空间设备管理】udev规则文件

【udev用户空间设备管理】udev规则文件

作者头像
byte轻骑兵
发布2026-01-21 20:08:09
发布2026-01-21 20:08:09
7560
举报

博主简介:byte轻骑兵,现就职于国内知名科技企业,专注于嵌入式系统研发。深耕 Android、Linux、RTOS、通信协议、AIoT、物联网及 C/C++ 等领域,乐于技术交流与分享。欢迎技术交流。 主页地址byte轻骑兵-CSDN博客 微信公众号:「嵌入式硬核研究所」 邮箱:byteqqb@163.com 声明:本文为「byte轻骑兵」原创文章,未经授权禁止任何形式转载。商业合作请联系作者授权。


在 Linux 系统的世界里,设备管理是一个重要的环节。而 udev 作为 Linux 用户空间的设备管理器,在其中扮演着关键角色。今天,我们就来深入了解一下 udev 规则文件,看看它是如何工作的,以及我们该如何运用它来更好地管理设备。


一、udev 是什么

小伙伴们,你们知道在 Linux 系统里,设备是怎么被管理的吗?其实有个叫 udev 的家伙在帮忙呢。它就像一个设备管家,能动态地处理设备的连接和断开,还能给设备起名字,是不是很厉害?

udev 运行在用户空间,它可以根据系统内核发出的 uevent 事件来动态管理 /dev 目录下的设备节点。意味着当你插入一个 USB 设备、连接一个外部硬盘或者其他硬件时,udev 会迅速做出反应,创建相应的设备节点,让系统能够识别和使用这些设备。

与传统的设备管理方式相比,udev 有很多优势。传统方式下,设备节点是静态创建的,不管设备是否连接,对应的节点都存在,这不仅浪费资源,还可能导致一些混淆。而 udev 是动态创建设备节点的,只有当设备连接到系统时,才会创建相应的节点,设备断开后,节点也会被移除,非常高效和整洁。

二、udev 规则文件的重要性

udev 的强大功能很大程度上依赖于其规则文件。udev 规则文件就像是给 udev 制定的操作手册,告诉 udev 当特定设备出现时该如何处理。通过编写规则文件,我们可以自定义设备的命名、设置设备的权限、指定设备的符号链接等等。

比如说,你有多个 USB 设备,每次插入时系统给它们分配的设备名可能不一样,这会给我们使用带来麻烦。但有了 udev 规则文件,我们就可以为每个 USB 设备设置固定的设备名,这样不管你什么时候插入,它的名字都是固定的,是不是很方便?

三、udev 规则文件的位置

udev 规则文件通常存放在两个主要的目录下,不同的 Linux 发行版基本都遵循这个规范。

一个是/lib/udev/rules.d/,这个目录下的规则文件是系统默认的,由系统或软件包安装时自动创建。这些规则文件负责处理系统中大部分常见设备的管理,一般情况下我们不要去修改它们,以免影响系统的正常运行。

另一个是/etc/udev/rules.d/,这个目录是给用户自定义规则文件用的。我们自己编写的规则文件就放在这里,而且用户自定义的规则文件优先级比/lib/udev/rules.d/目录下的要高,当两者有冲突时,会以用户自定义的为准。

四、udev 规则文件的命名规则

udev 规则文件的命名是有讲究的,通常的格式是 “数字 + 文件名 +.rules”。这里的数字决定了规则文件的执行顺序,数字越小,执行越早。

比如说,10-udev-test.rules会比20-udev-test.rules先执行。这样的命名规则可以让我们控制规则的执行顺序,避免不同规则之间出现冲突。

我们在命名自己的规则文件时,要根据规则的重要性和依赖关系来选择合适的数字。如果你的规则需要在系统默认规则之前执行,就可以选择一个较小的数字;如果需要在之后执行,就选择一个较大的数字。

五、udev 规则文件的基本结构

udev 规则文件由一系列规则组成,每条规则由多个键值对构成,键值对之间用逗号分隔。这些键分为匹配键和赋值键,匹配键用于匹配特定的设备,赋值键则用于对匹配到的设备进行设置。

5.1 匹配键

常见的匹配键有很多,下面给大家介绍几个常用的:

  • KERNEL:匹配设备的内核设备名,比如sda、ttyUSB0等。
  • SUBSYSTEM:匹配设备所属的子系统,比如usb、block、tty等。
  • ATTR{attribute}:匹配设备的属性,属性是设备在 sysfs 文件系统中的属性值。例如ATTR{size}=="1000000"表示匹配大小为 1000000 的设备。
  • ENV{variable}:匹配环境变量,这些环境变量是由内核或 udev 之前的规则设置的。

5.2 赋值键

赋值键用于对匹配到的设备进行各种设置,常用的有:

  • NAME:设置设备节点的名称。需要注意的是,并不是所有设备都可以设置 NAME,对于一些块设备等,可能需要使用 SYMLINK。
  • SYMLINK:为设备节点创建符号链接。比如SYMLINK+="myusb",就会在 /dev 目录下创建一个指向该设备节点的 myusb 符号链接。
  • MODE:设置设备节点的权限,比如MODE="0666"表示允许所有用户读写该设备。
  • OWNER:设置设备节点的所有者。
  • GROUP:设置设备节点的所属组。

下面来看一个简单的规则示例:

代码语言:javascript
复制
SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", SYMLINK+="myusbdevice"

这条规则的意思是:当子系统为 usb,且设备的 idVendor 为 1234,idProduct 为 5678 时,为该设备创建一个名为 myusbdevice 的符号链接。

六、规则文件中的通配符和特殊字符

在 udev 规则文件中,还可以使用通配符和特殊字符来增强规则的灵活性。

6.1 通配符

  • *:匹配任意长度的任意字符。比如KERNEL=="sda*"可以匹配sda、sda1、sda2等。
  • ?:匹配任意单个字符。例如KERNEL=="ttyUSB?"可以匹配ttyUSB0到ttyUSB9。
  • []:匹配指定范围内的字符。比如KERNEL=="ttyUSB[0-3]"可以匹配ttyUSB0、ttyUSB1、ttyUSB2、ttyUSB3。

6.2 特殊变量

  • %k:表示内核设备名,也就是 KERNEL 匹配到的值。
  • %n:表示设备的编号,比如对于sda1,% n 就是 1。
  • %p:表示设备在 sysfs 中的路径。

例如,SYMLINK+="usb/%k"会创建一个指向该设备节点的符号链接,路径为 /dev/usb/ 内核设备名。

七、编写 udev 规则的步骤

编写 udev 规则并不是一件难事,按照以下步骤来做,就能轻松搞定。

1. 确定设备属性

首先,我们需要获取要匹配设备的属性信息,这可以通过udevadm info命令来实现。

比如,我们要获取一个 USB 设备的信息,可以先插入设备,然后执行以下命令:

代码语言:javascript
复制
udevadm info -a -p /sys/class/usb_device/设备路径

其中,设备路径可以通过ls /sys/class/usb_device/来查看。

执行命令后,会输出该设备的详细属性信息,包括 KERNEL、SUBSYSTEM、ATTR 等,这些信息将作为我们编写规则的依据。

2. 编写规则

根据获取到的设备属性,结合我们的需求,编写相应的规则。在编写过程中,要注意使用正确的匹配键和赋值键,以及通配符和特殊变量。

3. 测试规则

规则编写完成后,我们需要测试一下规则是否有效。可以使用udevadm test命令来测试:

代码语言:javascript
复制
udevadm test /sys/class/设备类/设备名

如果测试过程中没有报错,并且达到了我们预期的效果,说明规则编写成功。

4. 重新加载规则

当我们修改了规则文件后,需要重新加载规则才能生效,可以使用以下命令:

代码语言:javascript
复制
udevadm control --reload-rules

然后可以拔插设备,看看规则是否起作用。

八、udev 规则文件应用示例

1. 为 USB 设备设置固定的设备名

假设我们有一个 USB 设备,其 idVendor 为 0483,idProduct 为 5750,我们想给它设置一个固定的设备名myusb。

首先,通过udevadm info获取设备属性,确认其 SUBSYSTEM 为usb,idVendor 和 idProduct 分别为 0483 和 5750。

然后,在/etc/udev/rules.d/目录下创建一个规则文件,比如99-usb-naming.rules,在文件中写入以下内容:

代码语言:javascript
复制
SUBSYSTEM=="usb", ATTR{idVendor}=="0483", ATTR{idProduct}=="5750", SYMLINK+="myusb"

保存文件后,执行udevadm control --reload-rules重新加载规则,然后拔插 USB 设备,在 /dev 目录下就会看到myusb这个符号链接了。

2. 根据设备属性设置权限

如果我们想让某个串口设备(比如ttyUSB0)允许所有用户读写,可以编写如下规则:

创建99-serial-permissions.rules文件,内容为:

代码语言:javascript
复制
KERNEL=="ttyUSB0", MODE="0666"

重新加载规则后,该串口设备的权限就会被设置为 0666。

3. 自动挂载 USB 设备

虽然 udev 本身不直接负责挂载文件系统,但它可以配合 mount 命令来实现自动挂载。

比如,我们想在插入一个特定的 USB 硬盘(假设其 UUID 为 1234-5678)时,自动将其挂载到/mnt/usbdisk目录。

首先,创建挂载点:

代码语言:javascript
复制
mkdir /mnt/usbdisk

然后创建规则文件99-usb-mount.rules,内容为:

代码语言:javascript
复制
SUBSYSTEM=="block", ENV{ID_FS_UUID}=="1234-5678", ACTION=="add", RUN+="/bin/mount /dev/%k /mnt/usbdisk"
SUBSYSTEM=="block", ENV{ID_FS_UUID}=="1234-5678", ACTION=="remove", RUN+="/bin/umount /mnt/usbdisk"

这里,SUBSYSTEM=="block"表示匹配块设备,ENV{ID_FS_UUID}=="1234-5678"通过 UUID 来匹配设备,ACTION=="add"表示设备添加时执行挂载命令,ACTION=="remove"表示设备移除时执行卸载命令。

不过需要注意的是,使用 RUN 执行命令时要确保命令的路径正确,并且尽量使用绝对路径。另外,对于复杂的挂载需求,可能还需要考虑文件系统类型等因素。

九、udev 规则文件的管理和调试

1. 查看已有的规则

我们可以使用ls命令查看/lib/udev/rules.d/和/etc/udev/rules.d/目录下的规则文件,了解系统中已有的规则。

2. 调试规则

如果规则没有按照预期工作,可以通过查看 udev 的日志来进行调试。udev 的日志通常保存在/var/log/udev或通过journalctl -u systemd-udevd命令查看。

在日志中,我们可以看到 udev 处理设备事件的过程,以及规则的执行情况,从而找出规则存在的问题。

3. 禁用不需要的规则

如果某些系统默认的规则我们不需要,可以在/etc/udev/rules.d/目录下创建一个同名的规则文件(但数字更大),在文件中写入ENV{UDevRuleOverride}="1"来覆盖原规则,或者直接删除原规则文件(不推荐,可能会影响系统更新)。

十、udev 规则文件核心内容

通过以上的介绍,相信大家对 udev 规则文件有了更深入的了解。udev 规则文件为我们管理 Linux 设备提供了强大的灵活性,只要我们掌握了它的基本用法,就能够根据自己的需求自定义设备的管理方式,让 Linux 系统更好地为我们服务。希望这篇文章能对你有所帮助,快去动手试试编写自己的 udev 规则吧!


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-09-11,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 一、udev 是什么
  • 二、udev 规则文件的重要性
  • 三、udev 规则文件的位置
  • 四、udev 规则文件的命名规则
  • 五、udev 规则文件的基本结构
    • 5.1 匹配键
    • 5.2 赋值键
  • 六、规则文件中的通配符和特殊字符
    • 6.1 通配符
    • 6.2 特殊变量
  • 七、编写 udev 规则的步骤
  • 八、udev 规则文件应用示例
  • 九、udev 规则文件的管理和调试
  • 十、udev 规则文件核心内容
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档