oracleasm listdisks返回空的主因是19c+弃用asmlib且默认跳过多路径设备;需停用asmlib、清除内核模块,改用asmfd并固化/dev/mapper/xxx路径。

oracleasm listdisks 返回空,不是磁盘坏了,是 ASMLib 根本没扫描到目标设备——它在 19c 及以后版本里已弃用,且默认扫描逻辑会跳过 multipath 设备,优先认 /dev/sdX 这类单路径盘,而真实共享存储几乎全是多路径映射出来的 /dev/mapper/xxx 或 /dev/dm-*。
ASMLib 在 19c 中默认不识别 multipath 磁盘
ASMLib 启动时按 ORACLEASM_SCANORDER 顺序扫描设备名前缀,默认为空,实际行为是先扫 /dev/sd*,再扫其他。但 RAC 共享磁盘经 multipath 映射后,真实可用路径是 /dev/mapper/datap1,而 /dev/sdX 是底层单路径,故障切换时必然中断。
- 查当前扫描配置:
grep -E "SCANORDER|SCANEXCLUDE" /etc/sysconfig/oracleasm,若仍是默认值(空或含sd),就注定漏掉 multipath 盘 - 强行加
ORACLEASM_SCANORDER="mpath dm"和ORACLEASM_SCANEXCLUDE="sd"仅对旧版有效;19c 中该机制与 ASMFD 冲突,不推荐继续用 -
lsmod | grep oracleasm若有输出,说明内核模块仍在加载——这在 OEL8+/RHEL8+ 上属于违规配置,必须清除
物理磁盘未被标记或标记已失效
ASMLib 不靠路径发现磁盘,而是读每个块设备的前几个扇区找 ASM 标签。如果磁盘被重分区、LVM 初始化、或用 dd 清过头,标签就没了;更常见的是,同一块盘在不同节点上被分别标记过,导致 listdisks 在某节点返回空。
- 确认磁盘是否裸盘:
fdisk -l /dev/sdf输出必须含Disk /dev/sdf doesn't contain a valid partition table - 检查标签是否存在:
kfed read /dev/sdf | grep kfbh.type,正常应为FKBTYP_DISKHEAD;若为FKBTYP_INVALID或无输出,说明标签丢失 - 不要在已用于 ASMFD 或 AFD 的盘上运行
oracleasm createdisk——会覆盖 AFD 头,引发KFED-00322错误
udev 规则缺失或节点间不一致
RAC 要求所有节点对同一磁盘的 WWID、设备路径、属主权限完全一致。ASMLib 依赖 /dev/oracleasm/disks/ 下的符号链接,而这些链接由 udev 规则生成。若节点 A 的规则文件缺失,或 scsi_id 输出不一致,链接就建不起来。
- 每个节点都执行:
/usr/lib/udev/scsi_id -g -u -d /dev/sdf,比对输出是否一字不差 - 检查规则文件是否存在且生效:
ls /etc/udev/rules.d/99-oracle-asm.rules,内容中SYMLINK+=行必须指向/dev/oracleasm/disks/DISK01,且OWNER为grid、GROUP为asmadmin - 重载规则后手动触发:
udevadm control --reload-rules && udevadm trigger --subsystem-match=block,再ls /dev/oracleasm/disks/看链接是否生成
SELinux 或权限阻止 ASMLib 读磁盘头
即使设备存在、规则正确,SELinux 的 oracleasm_exec_t 类型策略或 /dev/sdX 权限不足也会让 oracleasm scandisks 静默失败。
- 临时禁用 SELinux 验证:
setenforce 0,再跑oracleasm scandisks;若此时listdisks有输出,说明策略拦截 - 查设备权限:
ls -l /dev/sdf应为brw-rw----. 1 root disk;ASMLib 进程以 root 运行,但需disk组权限,usermod -a -G disk grid是必要动作 - 注意:19c 官方明确要求停用 ASMLib,改用 ASMFD;继续调试它,本质是在维护一个已被废弃的兼容层
oracleasm,清模块,切 ASMFD,用 udev 固化 /dev/mapper/xxx 路径。











