A.3. Device Mapper 支持 udev 设备管理器

udev 设备管理器的主要任务是在 /dev 目录中提供设置节点的动态方法。在用户空间中使用udev 程序规则创建这些节点。在由内核直接发送的 udev 事件中执行这些规则即可添加、删除或者更改具体设备。这为热插拔支持提供了方便且集中的机制。
除创建实际节点外,udev 设备管理器还可以创建用户可命名的任意符号链接,必要时为用户提供在 /dev 目录中自由选择自定义命名和目录结构。
每个 udev 事件都包含有关要处理设备的基本信息,比如名称、所属子系统、设备类型、使用的主号码和副号码以及事件类型。因此,如果能够访问 /sys 命令中的所有信息,就是说也可以使用 udev 规则访问,则用户就可以利用基于此信息的简单过滤器,并根据此信息有条件地运行这些规则。
udev 设备管理器还提供集中设置节点权限的方法。用户可轻松添加自定义规则组来为任意设备定义权限,所有设备都是由处理该事件时可用的字节信息指定。
还可在 udev 规则中直接添加程序钩。udev 设备管理器可调用这些程序以便进一步提供处理该事件的过程。另外,该程序还可导出环境变量作为这个过程的结果。任意给出的结果都可进一步作为信息补充资源的规则使用。
任意使用 udev 的程序库的软件都可接受并处理带全部可用信息的 udev 事件,因此该进程不只是与 udev 守护进程绑定。

A.3.1. 使用 Device Mapper 的 udev 整合

Device Mapper 提供对 udev 整合的直接支持。这样就将 Device Mapper 与所有与 Device Mapper 设备关联的 udev 进程同步,包括 LVM 设备。需要同步是因为 udev 守护进程中的规则程序与设备更改源的程序形成并行处理(比如 dmsetup 和 LVM)。没有这个支持,那么当用户尝试删除仍被前一个更改事件形成的 udev 规则打开并处理的设备时通常就会出问题,尤其在对那个设备的两次更改时间间隔非常短的时候。
Red Hat Enterprise Linux 为 Device Mapper 设备以及 LVM 提供官方支持的 udev 规则。表 A.1 “Device-Mapper 设备的 udev 规则” 中总结了这些规则,它们安装在 /lib/udev/rules.d 目录中。

表 A.1. Device-Mapper 设备的 udev 规则

文件名描述
10-dm.rules
包含基本/常规 Device Mapper 规则,并在 /dev/mapper 中使用 /dev/dm-N 目标创建符号链接,其中 N 是内核动态分配给设备的数字(/dev/dm-N 是一个节点)。
备注:/dev/dm-N 节点绝不可用于访问该设备的脚本,因为 N 数字是动态分配的,并根据设备激活的顺序改变。因此应使用 /dev/mapper 目录中的真实名称。这个布局是为支持创建节点/符号链接的 udev 要求。
11-dm-lvm.rules
包含可用于 LVM 设备并为卷组逻辑卷创建符号链接的规则。该符号链接是在 /dev/vgname 目录中使用 /dev/dm-N 目标创建。
备注:要保持为 Device Mapper 子系统命名所有未来规则使用统一的标准,udev 规则应采用以下格式:11-dm-subsystem_name.rules。所有提供 udev 规则的 libdevmapper 用户都应采用这个标准。
13-dm-disk.rules包含一般适用于所有 Device Mapper 设备以及在 /dev/disk/by-id/dev/disk/by-uuid/dev/disk/by-uuid 目录中创建符号链接的规则。
95-dm-notify.rules包含使用 libdevmapper 通知等待进程的规则(与 LVM 和 dmsetup 类似)。通知在所有之前的规则实施后执行以确定完成所有 udev 进程。然后恢复通知的进程。
69-dm-lvm-metad.rules包含可触发 LVM 在系统中新出现块设备中进行扫描的挂钩,并在可能时执行所有 LVM 自动激活。这个挂钩支持 lvmetad 守护进程,后者是使用 lvm.conf 文件的 use_lvmetad=1 设定。在集群环境中不支持 lvmeetad 守护进程及自动激活。
可以使用 12-dm-permissions.rules 文件添加额外的自定义权限规则。该文件安装在 /lib/udev/rules 目录中,它位于 /usr/share/doc/device-mapper-version 目录。12-dm-permissions.rules 文件是包含如何设置权限提示的模板,它是根据示例中给出的匹配规则生成的。该文件包含一些常见情况的示例。您可以编辑这个文件并手动将其放在 /etc/udev/rules.d 目录中,在此文件不会受更新的影响,因此可保留其设置。
这些规则设定所有可在处理事件的过程中被其它规则使用的基本变量。
以下是在 10-dm.rules 中设定的变量:
  • DM_NAME:Device Mapper 设备名称
  • DM_UUID:Device Mapper 设备 UUID
  • DM_SUSPENDED:Device Mapper 的挂起状态
  • DM_UDEV_RULES_VSNudev 规则版本(这主要用于检查之前提到变量的所有其它规则,这些变量直接由官方 Device Mapper 规则设定)
以下是在 11-dm-lvm.rules 中设置的变量:
  • DM_LV_NAME:逻辑卷名称
  • DM_VG_NAME:卷组名称
  • DM_LV_LAYER:LVM 层名称
所有这些变量都可用于 12-dm-permissions.rules 文件,来为具体 Device Mapper 设备定义权限,如 12-dm-permissions.rules 文件所述。

A.3.2. 支持 udev 的命令和界面

表 A.2 “支持 udev 的 dmsetup 命令”总结了支持 udev 整合的 dmsetup 命令。

表 A.2. 支持 udev 的 dmsetup 命令

命令描述
dmsetup udevcomplete用于通知 udev 已经完成规则处理并解锁等待的进程(从 95-dm-notify.rulesudev 规则调用)。
dmsetup udevcomplete_all用于在调整过程中手动解锁所有等待进程。
dmsetup udevcookies用于在 debug 过程中显示所有现有 cookies(系统范围的信号)。
dmsetup udevcreatecookie用于手动创建 cookie(信号)。这在同一同步资源中运行多个进程时有用。
dmsetup udevreleasecookie用于等待所有与同步 cookie 中的所有进程关联的 udev 进程。
支持 udev 整合的 dmsetup 选项如下。
--udevcookie
需要为所有我们要加入 udev 事务的所有 dmsetup 进程定义。它可与 udevcreatecookieudevreleasecookie 合用:
COOKIE=$(dmsetup udevcreatecookie)
  dmsetup command --udevcookie $COOKIE ....
  dmsetup command --udevcookie $COOKIE ....
  ....
  dmsetup command --udevcookie $COOKIE ....
dmsetup udevreleasecookie --udevcookie $COOKIE
除使用 --udevcookie 选项外,还可以只将该变量导出到该进程的环境中:
export DM_UDEV_COOKIE=$(dmsetup udevcreatecookie)
  dmsetup command ...
  dmsetup command ...
  ...
  dmsetup command ...
--noudevrules
禁用 udev 规则。libdevmapper 自己会生成节点/符号链接(老方法)。如果 udev 无法正常工作,则使用这个选项调试。
--noudevsync
禁用 udev 同步。这也可用于调试。
有关 dmsetup 命令及其选项的详情请参考 dmsetup(8) man page。
LVM 命令支持以下支持 udev 整合的选项:
  • --noudevrules:在 dmsetup 命令中禁用 udev 规则。
  • --noudevsync:在 dmsetup 命令中禁用 udev 同步。
lvm.conf 文件包含以下支持 udev 整合的选项:
  • udev_rules:为所有 LVM2 命令在全局启用/禁用 udev_rules
  • udev_sync:为所有 LVM 命令在全局启用/禁用 udev 同步。
有关 lvm.conf 文件选项的详情请查看 lvm.conf 文件的行间注释。