oracle 11g rac中multipath默认不提供asm所需的稳定设备路径,因asm要求设备主次号固定、节点路径一致(如/dev/asm-disk1)且grid用户有权限,而/dev/mapper/mpathx权限为root:root、节点映射可能不一致、创建不可控;必须通过udev规则基于dm_name创建统一符号链接并设权限。
oracle 11g rac 中,multipath 本身不提供 asm 可用的稳定设备路径 —— 仅靠 /dev/mapper/mpathx 或 multipath.conf 的 alias 就启动 asm,大概率会报 ora-15032、ora-15017,集群起不来。
为什么 multipath -ll 显示正常但 ASM 扫不到盘?
因为 ASM 在 11g 不认 /dev/mapper/xxx 这类 device-mapper 块设备节点,它要求:① 设备主次号固定;② 所有节点路径完全一致(如统一为 /dev/asm-disk1);③ grid 用户有读写权限。而 multipath 默认生成的 /dev/mapper/ 下设备满足不了这三点 —— 权限是 root:root,创建时机不可控,且不同节点上 mpatha 可能对应不同物理盘。
-
multipath.conf中的alias只影响/dev/mapper/下软链接名,不控制属主、权限、设备节点创建行为 - RAC 多节点重启后,
multipath -ll输出顺序可能变化,mpatha在 node1 和 node2 上实际指向不同 WWN - ASM 启动时调用裸 I/O,若设备节点不存在或权限不对,直接失败,不会降级尝试
必须用 udev 规则绑定 DM_NAME 创建 /dev/asm-* 设备
核心是捕获内核事件,用 DM_NAME(即你在 multipath.conf 里定义的 alias)作为匹配条件,在 /dev/asm-* 下创建固定符号链接,并设好属主和权限。规则必须放在 /etc/udev/rules.d/99-asm.rules(数字够大,确保在 multipath 自带规则之后执行)。
- 先确认 multipath 已识别 alias:
multipath -ll | grep "mpath.*alias",例如输出含mpatha (36001405...) alias db1 - 验证 DM_NAME 是否生效:
udevadm info --name /dev/mapper/db1 | grep DM_NAME,应返回E: DM_NAME=db1 - 写规则(以
db1映射为/dev/asm-disk1):ENV{DM_NAME}=="db1", SYMLINK+="asm-disk1", OWNER="grid", GROUP="asmadmin", MODE="660" - 不要用
NAME=或匹配/dev/sdX—— 底层路径随时变;必须基于DM_NAME或DM_UUID
如何验证 udev 规则是否真正生效?
别等重启,用命令逐级触发验证。90% 的“规则不生效”问题,其实是没 reload 或没 trigger。
- 重载规则:
udevadm control --reload-rules - 触发设备事件:
udevadm trigger --subsystem-match=block --action=add - 检查结果:
ls -l /dev/asm-disk1应存在,属主为grid:asmadmin,权限crw-rw---- - 确认主次设备号一致:
stat /dev/asm-disk1对比各节点输出,Device字段(如253,1)必须完全相同 - 最后用
kfod disk=asm或oracleasm listdisks看是否能列出该盘
multipath.conf 配置的关键陷阱
配置文件写错,multipathd 会静默忽略所有 LUN,表面看服务 running,实际没做任何 multipath 映射。
- 必须校验语法:
multipathd -t,有报错就别启动服务 -
defaults段里user_friendly_names yes是方便调试,但生产环境必须配合multipaths段显式绑定wwid+alias -
devices段的vendor和product必须与存储真实型号严格匹配(如DELL|MD36xxi),照搬别人配置却不改这两项,multipathd 直接跳过识别 - RHEL/CentOS 7+ 默认屏蔽部分 scsi 设备,检查
/etc/udev/rules.d/99-redhat.rules是否有blacklist误伤了你的盘
最易被忽略的一点:RAC 所有节点的 /etc/multipath.conf 中,同一块盘的 wwid 和 alias 必须字符级一致,包括大小写和空格 —— 差一个字母,ASM 就认为是两块不同的盘。











