文档来源: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 等换行、制表符;通配符支持:* 匹配任意字符、? 匹配单个字符、[] 范围匹配。
五、匹配键
匹配键是规则的筛选核心,用于精准锁定目标设备,避免多设备误匹配。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环境变量,用于多规则联动。
六、赋值操作
所有匹配条件命中后,即可执行对应的赋值操作,完成设备权限、别名、脚本、标签的自定义配置。OWNER="用户名":指定设备归属系统用户,解锁读写权限;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、序列号);八、专属排查命令
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"
SUBSYSTEM=="video4linux"ATTRS{idVendor}=="xxxx"ATTRS{idProduct}=="xxxx"SYMLINK+="my_camera"
systemd-udevd.service(8)、udevadm(8)、systemd.link(5)