根本原因是/dev/sdX设备名重启后会漂移,直接chown仅临时生效;必须用udev规则基于scsi_id生成的唯一WWN绑定固定别名(如/dev/asmdiskc),并确保RAC双节点规则完全一致、权限属主为grid:asmadmin。
oracle 19c安装时asm磁盘权限不对,asmcmd lsdg看不到磁盘组、create diskgroup报ora-15025或ora-15031,基本就是/dev/sdx设备属主/权限没落到grid:asmadmin,或者设备名重启后漂移。直接改chown治标不治本,必须用udev规则固化。
为什么不能直接chown grid:asmadmin /dev/sdX
系统重启、多路径重载、内核模块重载后,/dev/sdX编号会变,你刚改完/dev/sdc的权限,下次启动它可能变成/dev/sdd,而真正该用的磁盘反而没权限。更糟的是,RAC双节点上设备名不同步,集群根本起不来。
-
scsi_id生成的WWN才是磁盘唯一标识,udev靠它绑定别名 - 裸设备(未分区)才能被ASM识别,分区后的
/dev/sdc1会被拒绝 - ASMLib在19c已弃用,官方只推荐udev或multipath规则
写udev规则前先确认磁盘真实ID
别凭lsblk猜,必须用scsi_id取SCSI设备唯一串。注意路径和参数:
- Oracle Linux 7/8、RHEL 7/8:用
/usr/lib/udev/scsi_id -g -u -d /dev/sdX - CentOS/RHEL 8.5+可能需加
--whitelisted参数,否则返回空 - 确保
/dev/sdX是裸盘(无分区表),fdisk -l /dev/sdX输出应显示“Disk /dev/sdX doesn't contain a valid partition table” - 同一磁盘在两个RAC节点上
scsi_id输出必须完全一致,否则规则失效
示例:/usr/lib/udev/scsi_id -g -u -d /dev/sdf 返回 3604fe8d100d5d230b888210a00000038
99-oracle-asmdevices.rules规则怎么写才生效
规则文件位置固定为/etc/udev/rules.d/99-oracle-asmdevices.rules,内容必须严格匹配设备属性,且顺序不能错:
- 必须包含
ENV{DEVTYPE}=="disk",过滤掉分区和LVM设备 -
PROGRAM调用scsi_id要带完整路径,且RESULT值必须与实际输出一字不差(含空格) -
RUN+里用mknod创建/dev/asmdiskX,不能直接chown /dev/sdX - 每行末尾不能有空格,等号两侧不留空格,引号用英文双引号
正确示例(替换3604fe8d100d5d230b888210a00000038为你自己的ID):
KERNEL=="sd*", ENV{DEVTYPE}=="disk", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d %N", RESULT=="3604fe8d100d5d230b888210a00000038", RUN+="/bin/sh -c 'mknod /dev/asmdiskc %M %m; chown grid:asmadmin /dev/asmdiskc; chmod 0660 /dev/asmdiskc'"
写完运行udevadm control --reload-rules && udevadm trigger --subsystem-match=block,再检查ls -l /dev/asmdisk*是否属主正确。
常见失败点:RAC节点间规则不一致
两台节点的99-oracle-asmdevices.rules必须完全相同,但很多人复制时漏掉某一行,或scsi_id在节点二返回不同值(说明存储多路径没配好)。验证方法:
- 两边都执行
udevadm info --name=/dev/sdf | grep ID_SERIAL,比对是否一致 - 两边都运行
ls -l /dev/asmdisk*,确保所有asmdiskX设备存在且权限为brw-rw---- 1 grid asmadmin - 任意节点执行
su - grid -c "asmcmd lsdsk -k",应列出所有/dev/asmdiskX,状态为candidate或provisioned
如果asmcmd lsdsk仍为空,重点查udevadm test /sys/class/block/sdf输出里有没有“failed to execute”或“no rule matches”字样——那说明规则语法或路径写错了。











