asmfd可完全替代udev规则,但须在停机窗口分步操作,且必须执行afd_configure(root权限初始化afd模块)和afd_label(显式打标并加--init清空旧签名),否则磁盘无法识别、crs启动失败;还需执行asmcmd dsset切换磁盘搜索路径并重启crs。

直接上结论:ASMFD 可以完全替代 udev 规则,但必须在停机窗口内分步操作,且不能跳过 afd_configure 和 afd_label 两步;否则磁盘无法被 ASM 识别,CRS 启动失败。
afd_configure 必须以 root 执行且仅需一次
afd_configure 不是“安装驱动”,而是初始化 AFD 内核模块并注册设备过滤链路。它依赖 $ORACLE_HOME 环境变量指向 Grid Infrastructure 安装路径,且只在首次启用时需要运行。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 如果执行
asmcmd afd_configure提示ASMCMD-9521: AFD is already configured,说明模块已加载,不要重复执行 - 若提示
ASMCMD-9520: The AFD driver is not installed,需先确认 GI 是否完整安装(crsctl check crs应报错或未运行),再检查acfsdriverstate -orahome $ORACLE_HOME supported输出是否为supported - RHEL/CentOS 7+、Oracle Linux 7/8/9 均原生支持,但 kernel 版本低于 3.10 的系统不兼容(如 OL6 默认 kernel 2.6.32)
afd_label 是迁移成败的关键动作
Udev 方式下磁盘路径(如 /dev/oracleasm/disks/mpathj)只是软链接,而 ASMFD 要求每个物理设备被显式打标(label),标签名将成为 ASM 中的唯一设备标识符。
- 标签名必须全大写、无特殊字符、长度 ≤ 30 字符(如
DATA01),且不能与现有 ASM 磁盘组名或别名冲突 - 每个磁盘必须单独执行
asmcmd afd_label <label> <device_path> --init</device_path></label>,例如:asmcmd afd_label DATA01 /dev/mapper/mpathj --init
-
--init参数不可省略:它会清空设备头原有 udev 或 ASMLib 签名,并写入 AFD 专用头标识 - 若漏掉
--init,后续afd_lslbl显示状态为DISABLED,ASM 无法挂载该磁盘
dsset 配置决定 ASM 能否发现 AFD 磁盘
ASM 实例启动时,通过 asmcmd dsget 获取的搜索路径来定位磁盘。默认路径是 udev 下的 /dev/oracleasm/disks/*,必须显式切换为 AFD 模式。
- 以
grid用户执行:asmcmd dsset '/dev/oracleasm/disks/*','AFD:*'
- 这条命令实际修改的是
+ASM实例的隐式参数_asm_diskstring,等效于 SQL 中:ALTER SYSTEM SET "_asm_diskstring"='AFD:*' SCOPE=SPFILE;
- 修改后必须重启 CRS(
crsctl stop crs -f && crsctl start crs),否则 ASM 仍按旧路径扫描,v$asm_disk中看不到 AFD 标签磁盘
最容易被忽略的三个点
- AFD 标签名一旦写入设备头,就永久绑定该物理设备;换路径、改 multipath 别名、甚至重映射 LUN,只要底层 SCSI ID 不变,AFD 仍能识别——这点比 udev 更稳定,但也意味着误标后不能“撤回”,只能用
afd_unlabel(需确保磁盘未被 ASM 使用) - 多节点 RAC 环境中,
afd_label必须在每个节点单独执行,但标签名要一致;否则同一磁盘在不同节点显示不同标签,CRS 启动时校验失败 -
afd_state显示LOADED仅代表内核模块就绪,不等于过滤已生效;真正起作用的是filtering is 'ENABLED',若为DISABLED,需检查是否遗漏afd_configure或系统 SELinux 强制策略拦截了模块加载










