摘要
Linux 内核 2.6 为具有永久设备名称的动态设备目录 /dev 引入了一个新的用户空间解决方案: udev。它只为实际存在的设备提供文件。它创建或去除的设备节点文件通常位于 /dev 目录中,并且它能够重命名网络接口。以前使用 devfs 实施动态 /dev 已替换为由 udev 实施。
以前,设备节点都被储存在 Linux 系统的 /dev 目录中。无论设备是否实际存在于系统中,每个可能的设备类型都有一个节点。因此,此目录包含大量不使用的文件。在可使用新添加的子系统或内核设备之前,需要使用特殊应用程序来创建相应的节点。devfs 文件系统具有重大改进,因为 /dev 中只向真正存在且内核已知的设备提供设备节点。
udev 引入一种创建设备节点的新方法。内核会在 sysfs 中导出其内部状态,每次内核识别设备时,它都会更新 sysfs 中的信息并向用户空间发送事件。通过 sysfs 获得的信息,udev 会使用提供的设备特性来匹配简单的规则语法并创建或除去相应的设备节点。
用户无需为新设备创建任何 udev 规则。如果连接了设备,就将自动创建适当的设备节点。但是,使用规则使定义设备命名策略成为可能。这样可以方便地将隐藏的设备名称替换为容易记住的名称,并且还可以具有持久的设备名称(相同类型的两个设备已同时连接)。
假设您有两台打印机,一台高质量的彩色激光打印机和一台黑白喷墨打印机,都通过 USB 连接。它们会显示为 /dev/usb/lpX,其中 X 是一个数字,它取决于打印机连接的顺序。使用 udev 来创建自定义 udev 规则,该规则将一台打印机命名为 /dev/colorlaser,将另一台打印机命名为 /dev/inkprinter。由于这些设备节点是 udev 根据设备特征来创建的,因此它们始终指向正确的设备而不管连接顺序或状态。
udev 在 /dev 下创建设备节点之前,会按字母顺序读取 /etc/udev/rules.d 中后缀为 .rules 的所有文件。它将使用适合此设备的第一条规则,即使其他规则也适合此设备。备注以井号 (#) 开头。规则采用以下形式:
key, [key,...] NAME [, SYMLINK]
必须指定至少一个关键字,因为需要根据这些关键字将规则指派给设备。还必须指定名称。在 /dev 中创建的设备节点将采用此名称。可选 symlink 参数允许在其他位置创建节点。用于打印机的规则可以采用以下形式:
BUS=="usb", SYSFS{serial}=="12345", NAME="lp_hp", SYMLINK+="printers/hp"
本例中有两个关键字 BUS 和 SYSFS{serial}。udev 将此序列号与连接到 USB 总线的设备的序列号进行比较。要将名称 lp_hp 指派给 /dev 目录中的设备,所有关键字都必须相同。此外,还创建了指向设备节点的符号链接 /dev/printers/hp。同时还自动创建 printers 目录。随后可以将打印作业发送到 /dev/printers/hp 或 /dev/lp_hp。