udev规则配置共享存储持久化名称的两种方法对比
文件1:
cat /etc/udev/rules.d/99-dm-asmdevices.rules
KERNEL=="sd*",SUBSYSTEM=="block",PROGRAM=="/lib/udev/scsi_id -g -u -d /dev/$name",RESULT=="3638eb471005847e5ef58bb3400000032",SYML1NK+="dsc/asmdcr",OWNER="dmdba",GROUP="dinstall",MODE="0660"
KERNEL=="sd*",SUBSYSTEM=="block",PROGRAM=="/lib/udev/scsi_id -g -u -d /dev/Sname",RESULT=="3638eb471005847e5ef58bb3400000036",SYML1NK+="dsc/asmvote",OWNER="dmdba",GROUP="dinstall",MODE="0660"
KERNEL=="sd*",SUBSYSTEM=="block",PROGRAM=="/lib/udev/scsi_id -g -u -d /dev/$name",RESULT=="3638eb471005847e5ef58d65b0000003c",SYMLINK+="dsc/asmlog",OWNER="dmdba",GROUP="dinstall",MODE="0660"
KERNEL=="sd*",SUBSYSTEM=="block",PROGRAM=="/lib/udev/scsi_id -g -u -d /dev/$name",RESULT=="3638eb471005847e5edfcc2a500000034",SYMLINK+="dsc/asmdata01",OWNER="dmdba",GROUP="dinstall",MODE="0660"
文件2:
cat /etc/udev/rules.d/70-persistent-ipoib.rules
ACTION=="add", ENV{MAJOR}=="253", ENV{MINOR}=="3",RUN+="/bin/raw /dev/raw/raw1 %M %m"
ACTION=="add", ENV{MAJOR}=="253", ENV{MINOR}=="4",RUN+="/bin/raw /dev/raw/raw2 %M %m"
ACTION=="add", ENV{MAJOR}=="253", ENV{MINOR}=="5",RUN+="/bin/raw /dev/raw/raw3 %M %m"
ACTION=="add", ENV{MAJOR}=="253", ENV{MINOR}=="6",RUN+="/bin/raw /dev/raw/raw4 %M %m"
这两个 udev 规则文件展示了在 Linux 系统中为共享存储设备配置持久化名称的两种不同思路:一种是为达梦数据库集群(DSC)的 ASM 磁盘创建符号链接(现代方法),另一种是通过 raw 命令绑定裸设备(传统方法)。下面从目标、匹配机制、结果、可靠性和适用场景等方面详细对比。
1. 规则文件概览
文件 1:/etc/udev/rules.d/99-dm-asmdevices.rules
1 | KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/lib/udev/scsi_id -g -u -d /dev/$name", |
- 目标:为达梦 DSC 集群的 ASM 磁盘(DCR、VOTE、LOG、DATA)创建友好的持久化名称。
- 匹配方式:通过 SCSI 设备的 WWID(全球唯一标识符)识别具体 LUN。
- 动作:创建符号链接(
SYMLINK),并设置文件所有者和权限。
文件 2:/etc/udev/rules.d/70-persistent-ipoib.rules
1 | ACTION=="add", ENV{MAJOR}=="253", ENV{MINOR}=="3", |
- 目标:将特定的块设备绑定到传统的裸设备接口(
/dev/raw/rawN)。 - 匹配方式:根据设备的主设备号(MAJOR)和次设备号(MINOR)识别设备。
- 动作:执行外部命令
/bin/raw创建裸设备映射。
2. 核心区别详解
(1) 匹配机制的差异:唯一性 vs 易变性
文件1 使用 WWID
scsi_id -g -u获取的 WWID 是存储 LUN 的硬件固化标识,只要 LUN 不变,WWID 就永远不变。即使设备路径(如/dev/sdb)因重启或扫描顺序变化,udev 依然能准确匹配。这是真正意义上的持久化命名。文件2 使用主次设备号
ENV{MAJOR},ENV{MINOR}是内核分配给设备的临时编号。例如,同一块盘下次启动可能变成253:4而非253:3。因此这种规则不具备持久性,一旦设备顺序变化,raw 绑定就会指向错误的磁盘,可能导致数据错乱或集群无法启动。
(2) 生成结果的差异:块设备符号链接 vs 字符设备
文件1 创建符号链接(SYMLINK)
规则执行后,在/dev/dsc/下生成指向实际块设备(如/dev/dm-0或/dev/sdb)的符号链接。数据库直接使用这些链接(如/dev/dsc/asmdcr),本质仍是块设备,支持多路径、缓存等特性。文件2 创建裸设备(raw device)
raw命令将块设备绑定到/dev/raw/rawN字符设备。应用程序通过字符设备访问磁盘,绕开文件系统缓存,实现直接 I/O。这是早期的 Oracle 数据库常用方式,但现在已被视为过时。
(3) 可靠性与维护性
文件1
- 规则依赖 WWID,即使更换 HBA 卡、调整 SAN 交换机,只要 LUN 不变,名称不变。
- 权限和属主直接在规则中设置,无需额外脚本。
- 配合多路径软件时,可以匹配多路径设备(如
DM_UUID),避免使用底层路径。
文件2
- 主次号不稳定,重启后可能映射到错误的磁盘。
- 需要确保 raw 设备在系统启动时正确绑定,通常依赖启动顺序。
- 管理不便:每个 LUN 都需要手动分配 raw 设备号,扩展困难。
- 现代 Linux 内核已不再推荐使用 raw 设备,RHEL 7 之后甚至移除了 raw 服务。
(4) 适用场景
文件1:
适用于达梦、Oracle 等数据库的 ASM 或直接 ASM 磁盘,需要持久化名称和稳定权限的共享存储环境,特别是使用了多路径的 SAN 存储。文件2:
适用于老旧应用或数据库版本,如 Oracle 10g 之前依赖裸设备的场景,或某些特殊软件要求必须使用字符设备。在达梦 DSC 集群中,官方文档推荐直接使用块设备符号链接(类似文件1),而非 raw 设备。
(5) 文件命名暗示的问题
99-dm-asmdevices.rules:数字99表示最后执行,避免被其他规则覆盖;文件名明确用于达梦 ASM。70-persistent-ipoib.rules:通常用于 InfiniBand IP over IB 的网络接口持久化命名(如网卡),但这里却用来绑定 raw 设备,可能是管理员误用或临时添加。这种命名混乱会给后续维护带来困惑。
3. 为什么现代环境更倾向于文件1的方式?
- 持久性:WWID 匹配是真正的持久化方案,主次号不可靠。
- 简洁性:直接使用块设备,无需 raw 中间层,减少故障点。
- 兼容性:多路径软件(multipath)本身已提供稳定设备名(如
/dev/mapper/),udev 只需创建友好链接。 - 性能:现代数据库使用异步 I/O 直接访问块设备,与 raw 设备性能相当,且无需额外配置。
4. 潜在风险与建议
如果系统同时使用了这两种方式,可能遇到问题:
- 文件2 依赖的主次号可能与文件1 匹配的块设备不一致,导致 raw 设备指向错误的 LUN。
- 达梦 DSC 如果配置为使用
/dev/raw/rawN,而实际映射的磁盘并非预期的 DCR/VOTE,集群将无法启动。
建议:
- 若使用达梦 DSC,应遵循官方最佳实践:通过 udev 为 ASM 磁盘创建符号链接(类似文件1),直接使用这些链接作为
dminit的磁盘路径。 - 废弃 raw 设备方式(文件2),删除该规则文件,避免混淆。
总结对比表
| 特性 | 文件1 (99-dm-asmdevices.rules) | 文件2 (70-persistent-ipoib.rules) |
|---|---|---|
| 匹配依据 | SCSI WWID (硬件唯一标识) | 主次设备号 (临时分配) |
| 稳定性 | 永久不变,不受重启/扫描顺序影响 | 极易变化,不可靠 |
| 最终设备类型 | 块设备符号链接 (/dev/dsc/xxx) | 字符设备 (/dev/raw/rawN) |
| 动作 | 创建 SYMLINK + 设置权限 | 执行外部 raw 命令 |
| 适用场景 | 现代 ASM/数据库直接访问 | 老式应用依赖裸设备 |
| 维护复杂度 | 低,规则一次性配置即可 | 高,需确保 raw 绑定顺序 |
| 推荐度 | ✅ 强烈推荐 | ❌ 不推荐(仅用于遗留系统) |
通过对比可以看出,文件1 的方式更符合当前 Linux 和数据库的实践要求,而文件2 是基于旧时代的临时方案,应尽量避免在生产环境混合使用。





