Oracle RAC中ASM磁盘识别不稳主因是udev规则错误或未生效,须按系统版本选用正确scsi_id路径与参数,用WWID或DM_NAME绑定设备并确保多节点规则同步、权限一致。
oracle rac 中 asm 无法稳定识别磁盘,90% 是因为 udev 规则没写对或没生效 —— 不是设备没找到,而是设备节点在重启后路径、权限、属主全乱了,asm 实例直接报 ora-15018 或扫描不到盘。
怎么确认 scsi_id 命令和 WWID 获取方式是否匹配系统版本
不同 Linux 版本的 scsi_id 路径、参数、依赖项都不一样,硬套旧文档会直接导致 RESULT=="" 匹配失败,规则完全不触发。
- RHEL/OEL 5:用
/sbin/scsi_id -g -u -s /block/sdb(注意-s后是/block/,不是/dev/) - RHEL/OEL 6:必须用
/sbin/scsi_id -g -u -d /dev/sdb(-d指定设备路径,-s已废弃) - RHEL/OEL 7+:
scsi_id移到/usr/lib/udev/scsi_id,且默认要求/etc/scsi_id.config存在并含options=-g - 若用 EMC PowerPath 或 IBM SVC,得换设备名:把
/dev/sdb换成/dev/emcpowera或/dev/svc0,再跑对应scsi_id
验证是否拿到有效 WWID:运行 /sbin/scsi_id -g -u -d /dev/sdb 输出应是一串无空格字符串(如 3600c0ff0001001cd78cdaa4e02000000),如果返回空或报错,先查 /etc/scsi_id.config 和命令路径。
为什么不能直接用 KERNEL=="sdb" 写死设备名
裸写 KERNEL=="sdb" 看似简单,但 RAC 多节点环境下,同一块盘在 node1 可能是 sdb,在 node2 就变成 sdc —— 这是内核探测顺序决定的,不受控制。ASM 要求所有节点上设备路径绝对一致,否则 OCR/voting disk 认证失败、集群起不来。
-
KERNEL=="sdb"匹配的是底层 SCSI 设备,路径不稳定;而PROGRAM+RESULT匹配的是盘的 WWID,物理唯一、永不变化 - 别用
NAME="asm-disk1"(旧版 udev),RHEL6+ 必须用SYSFS{device/vendor}==...或更推荐的SYMLINK+="asm-disk1",否则新内核下规则静默失效 - 分区级绑定(如
KERNEL=="sdb1")可行,但必须确保 LUN 本身只划一个分区,且所有节点分区表一致,否则sdb1在某节点可能根本不存在
udev 规则文件怎么写才真正生效
规则放错位置、没重载、权限不对,都会让 /dev/asm-disk1 始终不出现。最简可靠写法是:
创建 /etc/udev/rules.d/99-oracle-asmdevices.rules,内容示例(以 RHEL7 为例):
ENV{ID_SERIAL_SHORT}=="3600c0ff0001001cd78cdaa4e02000000", SYMLINK+="asm-disk1", OWNER="grid", GROUP="asmadmin", MODE="0660"
ENV{ID_SERIAL_SHORT}=="3600c0ff0001001cd78cdaa4e02000001", SYMLINK+="asm-disk2", OWNER="grid", GROUP="asmadmin", MODE="0660"
- 优先用
ID_SERIAL_SHORT(来自 udev 自动提取的 WWID)替代PROGRAM调用scsi_id,性能更好、无外部依赖、兼容性更强 - 文件名必须是
99-*.rules,数字够大才能确保在 multipath 规则之后执行;不能叫10-*.rules,否则被覆盖 - 写完立刻验证:
udevadm control --reload-rules→udevadm trigger --subsystem-match=block→ls -l /dev/asm*,不要重启机器 - 检查是否真应用:运行
udevadm info --name /dev/sdb | grep ID_SERIAL_SHORT,确认输出与规则中一致
Multipath + udev 混合部署时最关键的陷阱
如果用了 multipath(比如 Oracle 11g RAC 标准推荐),就绝不能只靠 multipath.conf 的 alias,否则 ASM 启动必挂。
-
multipath -ll显示的mpatha (36001405...)是动态生成的,/dev/mapper/mpatha权限归root:root,ASM 无法裸 I/O - 必须用 udev 基于
DM_NAME绑定:ENV{DM_NAME}=="ocr1", SYMLINK+="asm-disk-ocr", OWNER="grid", GROUP="asmadmin", MODE="0660" - 规则必须放在
/etc/udev/rules.d/99-asm.rules(独立文件),且确保multipathd已启动、multipath -ll能看到 alias,否则DM_NAME根本不暴露给 udev - 多节点间务必用
scp同步规则文件,再逐节点udevadm control --reload-rules,不能只配一个节点
最易被忽略的一点:grid 用户必须对 /dev/asm-* 有读写权限,且该设备节点的主次设备号(ls -l 第二三列)在所有节点上必须完全一致 —— 这只有 udev 基于 WWID 或 DM_NAME 绑定时才能保证,任何依赖 /dev/sdX 顺序的方式都不可靠。


















