Linux 内核通过 uevent 向用户空间报告设备变化。在许多现代发行版上,systemd-udevd 使用 udev 规则和设备数据库处理这些事件。它与由内核填充的 devtmpfs 共同产生应用程序在 /dev 周围看到的所有权、权限、属性和符号链接。
设备 · 第 5 课
udev
学习 udev 如何处理内核设备事件,以应用策略、权限和持久链接。
从内核事件到设备策略
添加、更改、移动或移除设备时,udev 可以:
- 从 sysfs 和事件属性读取信息
- 将所有者、组和模式策略应用到设备节点
- 添加
/dev/disk/by-id/...等稳定符号链接 - 为其他服务标记设备
- 运行范围有限的辅助处理
内核仍负责实际设备及其驱动程序。从 /dev 删除节点不会在物理上移除硬件,使用 mknod 手动创建设备节点也不会让不受支持的硬件凭空出现或绑定驱动程序。
什么通常会触发 udev 处理设备变化?
规则位置与优先级
规则通常位于:
/usr/lib/udev/rules.d/:厂商或软件包提供的规则/run/udev/rules.d/:易失的运行时规则/etc/udev/rules.d/:本地管理员策略
文件按文件名的词法顺序处理;根据已安装 udev 实现的规则,高优先级目录中的同名文件会替换低优先级版本。本地规则应使用经过考虑的文件名,并匹配稳定属性,而不是枚举名称。
一条规则可能影响所有匹配设备,因此要仔细测试作用范围。当本地覆盖规则或补充规则足以满足需求时,不要直接编辑软件包提供的规则。
哪个目录用于存放持久的本地管理员 udev 规则?
使用 `udevadm` 检查设备
查询现有节点的 udev 属性:
$ udevadm info --query=all --name=/dev/sda
应使用当前系统上实际存在的节点。udevadm info --attribute-walk --name=... 可以显示 sysfs 父级链上的属性,有助于构造规则。udevadm monitor --kernel --udev --property 会观察内核事件和处理后的事件;输出可能暴露设备标识符,因此要妥善处理捕获内容。
udevadm info --query=all --name=/dev/sda 请求什么?
谨慎应用规则变更
重新加载规则文件会影响未来的事件处理,但不会自动重建每个现有设备的状态。手动触发事件可能影响许多设备和服务,因此应缩小目标范围,并查阅已安装 udevadm 的文档。测试命令可以模拟规则评估,但可能无法重现真实事件的每项副作用。
更改权限或名称前,应备份本地规则、验证语法、观察一个已知测试设备,并保留恢复通道。不要直接在 udev 事件处理中运行耗时工作;应将其交给适当的服务。
重新加载 udev 规则主要会改变什么?
可通过在 Linux 中探索硬件设备,在受控环境中关联 udevadm 属性、sysfs 路径和 /dev 链接。
课程已完成
你已完成 udev
现在,你可以把 udev 置于内核事件与用户空间设备策略之间来理解。
理解 uevent 和 sysfs 属性与 udev 规则匹配的关系。
区分厂商、运行时和本地规则位置。
使用
udevadm检查属性和事件流。仅在范围明确且经过测试时重新加载并触发规则。