不能直接用/etc/fstab挂载asm磁盘,因asm非标准文件系统,不走vfs层,需由oracle grid infrastructure的asm实例在运行时扫描管理裸设备;fstab无法识别"asm"类型,且asm依赖设备路径稳定、权限正确(grid:asmadmin)、就绪时机精准,而非传统挂载逻辑。

为什么不能直接用 /etc/fstab 挂载 ASM 磁盘
ASM 磁盘不是普通文件系统(如 ext4、xfs),它不通过内核 VFS 层挂载,而是由 Oracle Grid Infrastructure 的 asm 实例在运行时扫描并管理裸设备或分区。试图在 /etc/fstab 中写入类似 /dev/sdb1 /mnt/asm ext4 defaults 0 0 的条目会失败——系统根本无法识别该“文件系统类型”,mount -a 会报 unknown filesystem type "asm" 或直接跳过。
必须确保磁盘在 ASM 实例启动前就“就绪”
ASM 实例启动时依赖两个关键前提:磁盘路径可被访问,且权限正确。否则 asmcmd lsdg 显示空,或 CREATE DISKGROUP 报 ORA-15018。这和开机自动挂载无关,而是“设备就绪时机”问题:
-
udev规则必须在oracleasm(已弃用)或asmtool之前生效,确保磁盘名稳定(如/dev/oracleasm/disks/DATA01或保持/dev/sdb1不变) - Oracle 用户(通常是
grid)必须对磁盘有rw权限:ls -l /dev/sdb1应显示brw-rw---- 1 grid asmadmin;若为root:disk,需用udev规则修正 - 磁盘不能被其他服务占用:
fuser -v /dev/sdb1必须无输出;常见冲突来自mdadm、lvm或残留的dd进程 - 若使用多路径(如 RAC 环境),
multipathd必须先启动,且wwid绑定正确,否则lsblk看到的是mpatha而非原始sdb,导致asm_diskstring扫不到
正确的开机自动“就绪”流程:udev + asmtool + systemd 依赖
现代 Oracle Linux(7.8+)、OEL8+ 或 UEK6+ 环境中,应完全放弃 oracleasm 内核模块。推荐组合是:udev 固化设备名 → asmtool 标记(仅需一次)→ systemd 服务确保 grid 用户权限和 ASM 实例启动顺序:
- 用
/usr/lib/udev/scsi_id -g -u /dev/sdb1获取磁盘唯一标识,写入/etc/udev/rules.d/99-oracle-asm.rules,例如:KERNEL=="sd[b-z]1", SUBSYSTEM=="block", PROGRAM="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", SYMLINK+="oracleasm/disks/DATA01" - 手动运行一次
sudo udevadm control --reload-rules && sudo udevadm trigger,确认/dev/oracleasm/disks/DATA01存在且属主为grid:asmadmin - 用
asmtool -c /dev/sdb1 -l DATA01写入 ASM 头(仅首次需要;注意:不是每次开机都执行) - 检查
grid用户的asm_diskstring参数是否包含实际路径,例如:ALTER SYSTEM SET asm_diskstring='/dev/oracleasm/disks/*','/dev/sd*';(asm_diskstring是 ASM 实例启动时扫描的依据,不是挂载点) - 确保
oracle-grid-infra.service(或ora.asm)在multi-user.target后启动,且依赖udev-settle.service或multipathd.service(如有)
最容易被忽略的坑:iSCSI 或云盘场景下设备名延迟出现
在 Oracle Cloud、AWS 或 iSCSI 环境中,存储块设备(如 /dev/sdc)可能比根文件系统晚几秒才出现在 /dev/ 下。此时即使 udev 规则正确,ASM 实例启动时也扫不到设备,导致磁盘组 DISMOUNTED。解决方法不是加 sleep,而是:
- 在
/etc/iscsi/iscsid.conf中设node.startup = automatic,并确保iscsid服务启用:sudo systemctl enable iscsid - 对 iSCSI 设备,在
udev规则中加入ENV{ID_BUS}=="scsi"和ENV{ID_PATH}==...等更严格匹配,避免误触发 - 在 ASM 实例的 systemd unit 文件(如
/etc/systemd/system/ora.asm.service)中添加:ExecStartPre=/bin/sh -c 'while [ ! -b /dev/sdc1 ]; do sleep 2; done'—— 这比全局systemd依赖更精准
真正要“自动挂载”的从来不是磁盘本身,而是让 ASM 实例在它能看见设备的时候,刚好启动并完成磁盘组加载。时机、权限、路径稳定性,三者缺一不可。











