udev规则匹配不到/dev/sdX应改用ID_WWN等稳定标识,ASMLib需在udev生效后执行scandisks且避免与udev混用。
udev规则里设备名匹配不到 /dev/sdX 怎么办
udev 规则失效最常见原因是内核设备名不稳定,比如重启后 /dev/sdx 变成 /dev/sdy,导致 asm 启动失败或磁盘组无法挂载。别直接写 subsystem=="block", kernel=="sd[a-z]" 这种宽泛规则——它会匹配所有 scsi 磁盘(包括系统盘),容易误绑。
- 优先用
scsi_id获取唯一 WWID:/usr/lib/udev/scsi_id -g -u -d /dev/sdb(注意加-g和-u,否则可能返回空) - 规则中必须用
ENV{ID_SERIAL}或ENV{ID_WWN}匹配,不能依赖KERNEL;例如:ENV{ID_WWN}=="0x5000c500a1234567", SYMLINK+="asm-disk1" - 测试规则前先运行:
udevadm control --reload-rules && udevadm trigger --subsystem-match=block,再用udevadm info --name=/dev/sdb | grep ID_WWN确认环境变量已注入
ASMLib 为什么启动后找不到 disk(如 oracleasm listdisks 为空)
ASMLib 不是 udev 的替代品,而是另一套设备抽象层;它要求底层设备在加载 oracleasm 模块时已存在且权限正确。如果 udev 规则生成的软链接(如 /dev/asm-disk1)没被 ASMLib 扫描到,listdisks 就一定为空。
- 确保
oracleasm init在 udev 规则生效之后执行(检查systemctl list-dependencies oracleasm,应排在udev-settle.service之后) - 扫描命令必须指定原始块设备路径,不是软链接:
oracleasm createdisk DATA /dev/sdb1(不是/dev/asm-disk1) - ASMLib 默认只扫描
/dev/sd*和/dev/hd*,若你用了 NVMe 或 multipath 设备,得手动改/etc/sysconfig/oracleasm中的ORACLEASM_SCANORDER和ORACLEASM_SCANEXCLUDE
ASM 启动报错 ORA-15032 / ORA-15017:磁盘组无法挂载
错误本质是 ASM 实例找不到可用磁盘,根源常在设备路径不一致或权限不对。尤其当 udev 和 ASMLib 混用时,ASM 可能同时看到原始路径、udev 软链、ASMLib 封装名,但只认其中一种。
- 确认 ASM 使用的设备发现方式:
asm_diskstring参数决定搜什么;设为'/dev/asm-*'就只认 udev 规则生成的链接,设为'ORCL:*'才走 ASMLib - 检查权限:
ls -l /dev/asm-*必须属组asmadmin,且asm_diskstring中路径的父目录(如/dev)需对grid用户可读 - 避免混用:要么全用 udev +
asm_diskstring='/dev/asm-*',要么全用 ASMLib +asm_diskstring='ORCL:*';混合会导致 ASM 认出重复磁盘或漏掉磁盘
重启后 udev 规则生效但 ASMLib 仍不识别新盘
ASMLib 的磁盘注册信息存在内核模块状态和 /var/lib/oracleasm/disks/ 下的元数据文件里,它不会自动重新扫描 udev 新建的软链接——哪怕链接指向同一物理分区。
- 每次新增 udev 规则并 reload 后,必须显式执行:
oracleasm scandisks(不是init) - 如果之前用过 ASMLib 创建过盘但后来删了 udev 规则,旧元数据残留会导致
scandisks报 “already exists” 错误;此时要先oracleasm deletedisk XXX清理,再createdisk - 注意时间点:
scandisks必须在oracleasm start之后执行,否则模块未加载,命令直接失败
udev 和 ASMLib 的设备生命周期管理是两套逻辑,一个管“怎么叫这个名字”,一个管“怎么让 ASM 认这个名”。名字对了,ASM 不一定认;ASM 认了,也不代表名字持久。真正稳的方式,是选一边到底,别在中间切来切去。










