当前位置:首页>Linux>Linux udev 规则文件详解

Linux udev 规则文件详解

  • 2026-10-10 14:04:14
Linux udev 规则文件详解
文档来源:freedesktop / systemd 官方手册
规则文件是systemd-udevd自定义硬件管控的配置清单。systemd-udevd收到内核 uevent 时,逐条执行规则,决定硬件落地效果。没有规则文件,系统就只使用 devtmpfs 原生默认权限、随机设备名;规则文件能实现硬件个性化管控。

udev 所有自定义配置,全部依赖 .rules 规则文件,整体逻辑只有一句话:匹配硬件条件 → 执行自定义操作。

一、规则文件加载优先级
udev 规则文件加载遵循高优先级目录覆盖低优先级目录的机制,日常自定义配置只需使用最高优先级目录,严禁修改系统默认规则。规则目录优先级(由高至低)
/etc/udev/rules.d用户自定义目录(日常配置首选、永久生效)
/run/udev/rules.d  临时运行规则(系统重启失效)
/usr/lib/udev/rules.d  系统预装默认规则,升级会覆盖

二、基础语法规范

规则文件名后缀必须为 .rules,否则无法识别;
#开头为注释内容,空行不生效、不参与匹配;
多规则文件:按文件名的字典序依次执行(例:10-custom.rules 优先 99-device.rules);
单条规则逻辑:多条件必须全部匹配成功才会执行赋值、权限、脚本操作,条件缺一不生效。
文件内容由多行“键 操作符 值”,注释组成。

三、常用操作符

“==”:相等匹配,用于设备条件判断

“!=”:不相等匹配,排除指定设备条件

“=”:覆盖赋值,清空设备原有对应参数

“+=”:追加内容,多用于软链接、设备标签新增

“:=”:锁定赋值,后续所有规则无法修改该参数

四、值

"xxx":普通字符串,不转义特殊字符,常规匹配首选;
e"xxx":开启转义,支持解析 \n、\t 等换行、制表符;
i"xxx":忽略大小写匹配,仅用于条件判断;
通配符支持:* 匹配任意字符、? 匹配单个字符、[] 范围匹配。

五、匹配键

匹配键是规则的筛选核心,用于精准锁定目标设备,避免多设备误匹配。
ACTION:匹配设备事件,常用3个值,add表示设备插入、remove表示设备拔除、change表示状态变更。
KERNEL:匹配内核原生设备名,例:ttyUSB0、eth0、sdb。
SUBSYSTEM:匹配设备子系统,精准分类设备类型,block表示磁盘/U盘存储设备,usb表示通用USB外设,net表示网卡网络设备,input表示键鼠、手柄等输入设备,video4linux表示摄像头视频设备。
ATTR{xxx}:读取当前设备 /sys 硬件属性,常用用法:ATTR{idVendor}(厂商VID)、ATTR{idProduct}(产品PID)、ATTR{serial}(硬件唯一序列号)。
ATTRS{xxx}:向上递归匹配父设备属性,USB串口、复合外设专用,解决子设备匹配失效问题。
ENV{变量名}:匹配自定义udev环境变量,用于多规则联动。
TAG:匹配系统设备标签,用于批量筛选同类硬件。

六、赋值操作

所有匹配条件命中后,即可执行对应的赋值操作,完成设备权限、别名、脚本、标签的自定义配置。
OWNER="用户名":指定设备归属系统用户,解锁读写权限;
GROUP="组名":指定设备归属用户组;
MODE="0660":设置设备八进制权限,按需开放读写执行权限。
SYMLINK+="自定义设备名",支持多链接、内置变量嵌套:解决经典痛点——设备重启、插拔后 ttyUSB0/1、sdb/sdc 设备名随机跳动。通过自定义软链接,生成永久固定设备路径,适配自动化脚本、固定设备业务场景。
ENV{key}=value:自定义环境变量,供后续规则、自动化脚本读取调用;
TAG+=xxx:给设备打自定义标签,方便系统服务批量管理、筛选硬件。
RUN+="程序绝对路径 执行参数":设备插拔自动化脚本。官方明确限制,属于必须遵守的避坑规范,违规会导致系统热插拔异常:
  • 仅支持短时同步脚本(几秒内执行完毕);
  • 禁止后台常驻、联网、长时间阻塞任务,会导致全局硬件热插拔失效;
  • 常驻程序、长期服务必须通过 systemd 服务拉起,严禁在 RUN 中后台运行进程。

七、内置动态变量

udev 内置动态变量,可在规则中直接调用,无需手动解析硬件信息,大幅简化规则编写,适配各类插拔场景:
%k / $kernel:内核原始设备名(sdb、ttyUSB0等);
%p / $devpath:设备在 /sys 下的完整硬件路径;
$attr{xxx}:动态读取设备硬件属性(VID、PID、序列号);
$env{xxx}:读取自定义udev环境变量;
%M/%m:设备主、次设备号;
%N:设备完整路径 /dev/xxx。

八、专属排查命令

udevadm 是 udev 专属运维工具集,独立于内核事件,专注规则调试、设备信息查询、规则重载生效,是日常配置排错的必备命令:
udevadm monitor:实时打印 udev 规则匹配、设备处理事件(规则调试首选);
udevadm info /dev/xxx:查询设备全量硬件信息(VID、PID、序列号、环境变量,用于适配规则);
udevadm reload:重载所有udev规则,无需重启系统、无需重启进程;
udevadm trigger:重放系统所有硬件事件,一键让新规则对已有设备生效。

九、样例规则

在 /etc/udev/rules.d/ 目录新建 99-custom-device.rules 文件,写入对应规则后,执行以下命令一键重载生效:
udevadm reloadudevadm trigger
案例1:固化USB串口设备(解决ttyUSB乱序)通过设备 VID、PID 精准匹配硬件,固定串口设备名称、开放串口权限,彻底解决多串口设备插拔乱序问题。
ACTION=="add"SUBSYSTEM=="tty"ATTRS{idVendor}=="0403"ATTRS{idProduct}=="6001"SYMLINK+="usb_serial"GROUP="dialout"MODE="0666"
案例2:固化U盘设备盘符(解决sdb/sdc乱跳)通过U盘唯一硬件序列号精准匹配,不受设备插拔顺序、磁盘序号影响,永久固定自定义盘符别名。
ACTION=="add"SUBSYSTEM=="block"ATTRS{serial}=="你的U盘硬件序列号"SYMLINK+="my_udisk"
案例3:U盘插入触发短时自定义脚本U盘插入后自动触发脚本,可实现自动挂载、数据备份、日志记录等短时任务,严格规避常驻进程,符合官方规范。
ACTION=="add"SUBSYSTEM=="block"KERNEL=="sd1"RUN+="/usr/local/bin/usb_auto_run.sh %N"
案例4:固化USB摄像头设备名
SUBSYSTEM=="video4linux"ATTRS{idVendor}=="xxxx"ATTRS{idProduct}=="xxxx"SYMLINK+="my_camera"
十、官方参考手册:
systemd-udevd.service(8)、udevadm(8)、systemd.link(5)

最新文章

随机文章