最稳的设备唯一标识是ID_WWN,其次为ID_SERIAL;必须用udevadm或scsi_id获取真实值,禁用/dev/sdX等易变名称,规则中PROGRAM路径、RESULT值、OWNER/GROUP/MODE权限项及/etc/udev/rules.d/99-asm.rules路径均需严格匹配系统版本要求。
udev 绑定不是配完就完事的步骤,而是 ASM 磁盘组空间规划能否落地的前提。没绑对,后续所有空间计算、冗余策略、扩容动作都会卡在“盘不可见”或“权限拒绝”上。
怎么选最稳的设备唯一标识?别碰 /dev/sdX 顺序名
直接用 sdb、sdc 这类名字写规则等于埋雷:加一块盘、换 hba 卡、重启,顺序全变,asm 实例一启动就报 ora-15018 或找不到盘。
真正可靠的只有两个字段,优先级明确:
-
ID_WWN:世界唯一名称,由磁盘固件生成,不随系统识别路径变化。查法:udevadm info --name=/dev/sdb --query=property | grep ID_WWN -
ID_SERIAL:次选,但必须确认不含空格或特殊字符(否则规则解析失败)。查法:udevadm info --name=/dev/sdb --query=property | grep ID_SERIAL
ID_PATH 和 BUS==scsi 这类拓扑相关字段,换插槽或控制器就失效,别用。
scsi_id 命令路径和参数在不同系统版本差异很大
RHEL/CentOS 7+ 和 Oracle Linux 7+ 中,scsi_id 不再在 /sbin/ 下,也不认 --whitelisted 参数。错用会直接导致规则不触发。
正确用法(以 /dev/sdb 为例):
- 先确认命令位置:
find /usr -name scsi_id 2>/dev/null,常见路径是/usr/lib/udev/scsi_id或/lib/udev/scsi_id - 获取 WWN/serial:
/usr/lib/udev/scsi_id -g -u -d /dev/sdb(注意是-d /dev/sdb,不是-s /block/sdb) - 规则中 PROGRAM 字段必须与实际路径完全一致,且
RESULT==的值要和上面输出一字不差(含大小写)
常见错误:PROGRAM=="/sbin/scsi_id ..." 在 OL7+ 上返回空,规则永远不匹配。
ASM 规则里三个权限项一个都不能少,且大小写敏感
Oracle ASM 启动时会严格校验设备节点的属主、组、权限。漏掉或写错任意一项,asmca 里看不到盘,sqlplus / as sysasm 创建磁盘组直接报错。
-
OWNER="grid":必须是运行 ASM 实例的 OS 用户。不是oracle,除非你真把 ASM 配给 oracle 用户跑 -
GROUP="asmadmin":组名必须和getent group asmadmin输出完全一致,大小写敏感;提前创建好,别等规则生效了才发现组不存在 -
MODE="0660":不能是0600(ASM 拒绝访问),也不能是0664(某些安全加固策略会拦截)
建议加上 SYMLINK+="asm-disk1",方便后续在 asmca 图形界面里按名字选盘,比翻 /dev/sd* 直观得多。
规则文件放哪、怎么加载才真正生效?
写完规则不等于生效。很多问题出在路径、命名、重载方式这三步上。
- 路径必须是:
/etc/udev/rules.d/99-asm.rules(数字前缀确保执行顺序靠后,避免被其他规则覆盖) - 后缀必须是
.rules,不能是.txt或无后缀 - 重载命令只用这两个:
udevadm control --reload-rules&&udevadm trigger --subsystem-match=block -
start_udev在 RHEL7+ 已废弃,执行了也白执行
验证是否生效:ls -l /dev/asm-disk* 看属主/组/权限;udevadm info --name=/dev/asm-disk1 | grep -E "(OWNER|GROUP|MODE)" 看规则变量是否赋值成功。如果 ls 没输出,说明规则根本没命中——回头检查 PROGRAM 路径和 RESULT 值。
scsi_id 命令也跑通了,但 RESULT 值里混入了不可见空格或换行。复制粘贴时尤其危险。务必用 echo "xxx" | od -c 检查。


















