Oracle 19c ASM无法识别磁盘主因是udev规则错误或未生效:scsi_id获取的WWN不匹配、使用已弃用字段(如BUS=="scsi")、规则未基于PROGRAM+RESULT匹配、未清空磁盘头、AU大小不一致或可用空间不足56GB。

Oracle 19c 安装时 ASM 无法识别磁盘,绝大多数情况是 udev 规则没写对或没生效 —— 不是磁盘没共享,也不是权限没改,而是 scsi_id 拿到的 WWN 没匹配上,或者规则里用了已弃用的字段(比如 BUS=="scsi" 在 RHEL 7+/OL 8+ 上根本无效)。
确认磁盘是否为裸设备且可被 scsi_id 识别
ASM 只认未分区的块设备(如 /dev/sdb),不认 /dev/sdb1 或 LVM 逻辑卷。必须用 scsi_id 获取真实 SCSI 设备唯一标识,不能靠 lsblk 或 fdisk -l 猜。
-
/usr/lib/udev/scsi_id -g -u -d /dev/sdb(RHEL 7+/OL 8+ 路径)或/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/sdb(RHEL 6)必须返回非空字符串,例如3600c0ff00015c7b70253c05001000000 - 如果返回空,检查是否启用了多路径(
multipath -ll),此时应针对/dev/mapper/mpatha运行scsi_id,而非底层/dev/sd* - 若磁盘是虚拟机环境(如 VirtualBox/Vmware),需确认启用 SCSI 透传,否则
scsi_id会失败
编写 99-oracle-asmdevices.rules 的关键点
规则文件必须放在 /etc/udev/rules.d/,文件名建议以数字开头(如 99-)确保加载顺序;内容必须基于 PROGRAM + RESULT 匹配,不能用 ATTR{wwn} 或 SYMLINK 替代。
- 正确写法(RHEL 7+/OL 8+):
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d $devnode", RESULT=="3600c0ff00015c7b70253c05001000000", SYMLINK+="asm-disk1", OWNER="grid", GROUP="asmadmin", MODE="0660" - 错误写法:
BUS=="scsi"(已被废弃)、NAME="asm-disk1"(NAME在新版 udev 中禁用,会导致规则静默失败)、KERNEL=="sd*1"(匹配的是分区,不是裸设备) - 多个磁盘要分别写独立规则行,不要用循环生成后直接追加到文件末尾——容易混入 shell 变量未展开的残留文本
加载规则并验证设备节点是否就绪
规则写完不等于生效。udev 不会自动 reload,必须手动触发,且验证必须落到实际设备节点,不能只看 ls /dev/asm*。
- 执行
udevadm control --reload-rules && udevadm trigger --subsystem-match=block(注意:不用start_udev,它在 RHEL 7+ 已移除) - 强制重新应用:对单个设备运行
udevadm test /sys/class/block/sdb,查看输出中是否命中你的规则、是否设置了OWNER/GROUP/SYMLINK - 验证结果:
ls -l /dev/asm*应显示brw-rw---- 1 grid asmadmin;file /dev/asm-disk1应返回 “block special”;oracleasm listdisks不再需要(ASMLib 已弃用),直接用ls /dev/asm*或asmcmd lsdsk(需已启动 ASM 实例)
Oracle 19c ASM 安装前必须检查的三个硬性条件
即使 udev 规则完全正确,以下任一条件不满足都会导致安装界面卡在“发现磁盘”或报错 ORA-15018: diskgroup cannot be created。
- 所有 ASM 磁盘的 AU(Allocation Unit)大小必须一致:建盘前用
oracleasm createdisk已不可用,改用dd if=/dev/zero of=/dev/asm-disk1 bs=4k count=100清空头部,再确认无残留 ASM 头(hexdump -C /dev/asm-disk1 | head -20第 100h 行不应是ORCLASM) - 总可用空间 ≥ 56GB:这是 Oracle 19c GI 安装程序内置校验阈值,低于该值 GUI 直接禁用“下一步”,命令行也会报
INS-35354 - Grid 用户对所有
/dev/asm*设备有读写权限:仅靠 udev 设置OWNER不够,还需确认grid用户属于asmadmin组,且该组未被/etc/group中其他条目覆盖
最容易被忽略的是:udev 规则中 $devnode 的写法必须和 scsi_id 命令实际调用路径完全一致;少一个 / 或多一个空格,RESULT 就为空,整条规则形同虚设。别信“试几次就能通”,先用 udevadm test 看输出,再操作。











