文件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
2
3
4
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/lib/udev/scsi_id -g -u -d /dev/$name", 
RESULT=="3638eb471005847e5ef58bb3400000032", SYMLINK+="dsc/asmdcr",
OWNER="dmdba", GROUP="dinstall", MODE="0660"
...
  • 目标:为达梦 DSC 集群的 ASM 磁盘(DCR、VOTE、LOG、DATA)创建友好的持久化名称。
  • 匹配方式:通过 SCSI 设备的 WWID(全球唯一标识符)识别具体 LUN。
  • 动作:创建符号链接(SYMLINK),并设置文件所有者和权限。

文件 2:/etc/udev/rules.d/70-persistent-ipoib.rules

1
2
3
ACTION=="add", ENV{MAJOR}=="253", ENV{MINOR}=="3", 
RUN+="/bin/raw /dev/raw/raw1 %M %m"
...
  • 目标:将特定的块设备绑定到传统的裸设备接口(/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 是基于旧时代的临时方案,应尽量避免在生产环境混合使用。