Oracle ASMFD(ASM Filter Driver)

Oracle ASMFD(ASM Filter Driver)

适用版本:Oracle Database 12.2 / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

ASMFD(ASM Filter Driver) 是 12.2 引入的内核模块[1],为 ASM 磁盘提供过滤保护:

核心特性

  • 防止非 Oracle 进程访问 ASM 磁盘
  • 替代 ASMLib
  • 简化磁盘管理
  • 支持 UDEV 集成
  • 集群范围一致性

与 ASMLib 对比

维度ASMLibASMFD
内核模块oracleasmoracleafd
磁盘标识stamplabel
保护强(Filter)
集成独立与 Grid 集成
推荐新(12.2+)

2. ASMFD 工作原理

2.1 过滤机制

应用/工具 I/O 请求

+----------------------+
| ASMFD Filter Driver  |  ← 拦截 I/O
+----------------------+
    │              │
    │ Oracle 进程   │ 非Oracle 进程
    ▼              ▼
  允许           拒绝

2.2 保护范围

  • 防止 dd 误写 ASM 磁盘
  • 防止文件系统格式化
  • 防止其他 Oracle 实例误用
  • 防止非 Oracle 进程 I/O

3. ASMFD 安装

3.1 加载模块

# 加载 ASMFD 模块
modprobe oracleafd

# 验证
lsmod | grep oracleafd

# 配置开机加载
echo "oracleafd" >> /etc/modules-load.d/oracleafd.conf

3.2 配置 ASMFD

# 设置 ASMFD 路径
$ORACLE_HOME/bin/asmcmd afd_label data1 /dev/sdb1 --init

# 或通过 Grid Infrastructure
$ORACLE_HOME/bin/crsctl pin css -n hostname
$ORACLE_HOME/bin/asmcmd afd_init

4. 磁盘标签管理

4.1 标签磁盘

# 标签磁盘
asmcmd afd_label DATA1 /dev/sdb1

# 多磁盘
asmcmd afd_label DATA2 /dev/sdc1
asmcmd afd_label DATA3 /dev/sdd1

4.2 查看标签

# 查看所有标签
asmcmd afd_lsdsk

# 输出:
# --------------------------------------------------------------------------------
# Label                     Filtering Path
# --------------------------------------------------------------------------------
# DATA1                        ENABLED  /dev/sdb1
# DATA2                        ENABLED  /dev/sdc1
# DATA3                        ENABLED  /dev/sdd1

4.3 取消标签

# 卸载标签
asmcmd afd_unlabel DATA1

4.4 检查磁盘

# 检查磁盘是否可用
asmcmd afd_dsget

# 检查标签状态
asmcmd afd_lsdsk --label DATA1

5. 启用/禁用 Filter

5.1 启用 Filtering

# 启用所有磁盘的过滤
asmcmd afd_filter -e

# 或指定磁盘
asmcmd afd_filter -e /dev/sdb1

5.2 禁用 Filtering

# 禁用
asmcmd afd_filter -d

# 指定磁盘
asmcmd afd_filter -d /dev/sdb1

5.3 查看状态

asmcmd afd_lsdsk
# Filtering 列显示 ENABLED / DISABLED

6. 使用 ASMFD 磁盘

6.1 创建 Disk Group

-- 使用 ASMFD 标签的磁盘
CREATE DISKGROUP data EXTERNAL REDUNDANCY
  DISK 'AFD:DATA1', 'AFD:DATA2', 'AFD:DATA3'
  ATTRIBUTE 'au_size'='4M';

6.2 添加磁盘

-- 添加新磁盘
asmcmd afd_label DATA4 /dev/sde1
ALTER DISKGROUP data ADD DISK 'AFD:DATA4';

6.3 查看磁盘

SELECT 
  group_number, 
  disk_number, 
  mount_status, 
  header_status, 
  path
FROM v$asm_disk
WHERE path LIKE 'AFD:%';

7. ASMFD 与 ASMLib 迁移

7.1 迁移步骤

# 1. 停止 ASM
srvctl stop asm -n hostname

# 2. 卸载 ASMLib
oracleasm exit

# 3. 标签 ASMFD
asmcmd afd_label DATA1 /dev/sdb1

# 4. 启动 ASM
srvctl start asm -n hostname

# 5. 验证
asmcmd lsdsk

7.2 修改磁盘路径

-- 1. 停止使用磁盘的数据库
-- 2. Dismount 磁盘组
ALTER DISKGROUP data DISMOUNT;

-- 3. 修改 ASMFD 参数
-- 4. Mount 磁盘组
ALTER DISKGROUP data MOUNT;

8. ASMFD 与 UDEV

8.1 UDEV 规则示例

# /etc/udev/rules.d/99-oracle-asmfd.rules
KERNEL=="sdb1", OWNER="oracle", GROUP="dba", MODE="0660"
KERNEL=="sdc1", OWNER="oracle", GROUP="dba", MODE="0660"

8.2 重新加载 UDEV

udevadm control --reload-rules
udevadm trigger

9. 集群范围 ASMFD

9.1 所有节点配置

# 每个节点加载模块
modprobe oracleafd

# 每个节点标签磁盘(共享磁盘只需标签一次)
# 但每个节点都要看到标签
asmcmd afd_lsdsk

9.2 集群一致性

# 在任一节点标签后,所有节点可见
asmcmd afd_label DATA1 /dev/sdb1

# 节点 2 检查
asmcmd afd_lsdsk

10. 常见坑与排错

10.1 ORA-15137: ASMFD 模块未加载

修复

# 加载模块
modprobe oracleafd

# 检查
lsmod | grep oracleafd

# 配置开机加载
echo "oracleafd" > /etc/modules-load.d/oracleafd.conf

10.2 磁盘标签失败

修复

# 1. 检查磁盘
ls -l /dev/sdb1

# 2. 检查权限
chown oracle:dba /dev/sdb1
chmod 660 /dev/sdb1

# 3. 重新标签
asmcmd afd_label DATA1 /dev/sdb1

10.3 Filter 不生效

修复

# 启用过滤
asmcmd afd_filter -e

# 检查状态
asmcmd afd_lsdsk

10.4 集群节点间标签不同步

修复

# 1. 检查 ASMFD 配置
asmcmd afd_state

# 2. 重新初始化
asmcmd afd_init

# 3. 每个节点重新扫描
asmcmd afd_scan

10.5 ASMFD 替换 ASMLib 失败

修复

# 1. 完全卸载 ASMLib
systemctl stop oracleasm
systemctl disable oracleasm
rpm -e oracleasm-support

# 2. 清除 ASMLib 标签
dd if=/dev/zero of=/dev/sdb1 bs=1M count=10

# 3. 加载 ASMFD
modprobe oracleafd

# 4. 标签
asmcmd afd_label DATA1 /dev/sdb1

11. 最佳实践

  1. 12.2+ 使用 ASMFD:替代 ASMLib
  2. 生产用 ASMFD:磁盘保护更强
  3. 统一磁盘命名:DATA1, DATA2, …
  4. UDEV + ASMFD:权限管理
  5. Filter 默认启用:保护磁盘
  6. 所有节点一致:集群同步
  7. 定期检查标签:afd_lsdsk
  8. 监控 ASMFD 日志:/var/log/messages
  9. 避免与 ASMLib 共存:单一选择
  10. 生产前测试:迁移验证

12. 参考资料

[1] Oracle ASM Administrator’s Guide 19c, “Managing Oracle ASM Filter Driver” https://docs.oracle.com/en/database/oracle/oracle-database/19/ostmg/managing-oracle-asm-filter-driver.html

[2] Oracle Grid Infrastructure Installation Guide 19c, “Configuring ASMFD” https://docs.oracle.com/en/database/oracle/oracle-database/19/cwlin/