数据管理应用程序编程接口

AIX提供数据管理应用程序编程接口 (DMAPI),它是 "系统管理:数据存储管理(XDSM)API "X/Open 标准,由 The Open Group 发布。

DMAPI 允许软件销售商使用 POSIX 兼容系统中没有的一组函数和语义开发数据管理应用程序。 它不向最终用户提供直接功能。 完整的 DMAPI 文档可以在 The Open Group Web 站点的 Publications 部分找到。

AIX 提供的 DMAPI 是通用实现。 可选接口和功能的支持级别由底层文件系统实现确定并且对特定文件系统记录在不同的部分中。

DMAPI 的目的是在任何单一文件系统中支持单一产品。 DMAPI 不排除来自不同销售商的不同产品在同一文件系统上操作,但不建议这样做。 有关事件传递,DMAPI 完全支持不同文件系统上的不同产品,受到以下限制:
  • 多个会话无法为同一对象上的同一事件注册处置。
  • 事件消息以会话为目标并根据会话排列;事件与特定进程之间没有显式的针对性。
  • 如果没有会话为除了安装事件外的特别事件注册处置,那么 DMAPI 将不会生成事件并且允许进程继续(就好像没有启用任何事件一样)。 如果没有会话为始终启用的安装注册处置,那么 DMAPI 会使事件失败并且不允许安装文件系统。

DMAPI 在 AIX内的抽象层中实现,允许任何底层文件系统定义其个别级别的支持和实现选项。 日志文件系统 (JFS) 不提供任何对 DMAPI 的支持。 增强型日志文件系统的 DMAPI 注意事项中概述了由 X/Open 标准描述的实现选项,限制和其他细节的增强型日志文件系统 (JFS2) 行为。

如果AIXDMAPI 初始化正确,"dm_init_service函数返回 0;如果初始化失败,则返回-1。 初始化失败后任何其他 DMAPI 函数的使用也将会失败。

AIX DMAPI 不支持以下可选 DMAPI 功能:
  • dm_downgrade_right
  • dm_upgrade_right
  • dm_obj_ref_* 系列
  • dm_pending
其他可选接口可能不受底层的文件系统实现的支持并且在特定文件系统的 DMAPI 文档中指示。

当数据管理 (DM) 应用程序指示要阻塞直到正确的可用为止时,DM 应用程序会被不停地阻塞。

AIX 允许多个非重叠的持久受管区域。 仅常规文件允许具有受管域。 受管域是否重新排序或合并由底层的文件系统实现确定。

如果未注册任何会话以接收已启用对象的特定事件,并且发生了会触发该事件的活动,那么 AIX 不会生成该事件并允许进程继续操作,就像未启用任何事件一样。

执行 dm_set_eventlist 函数会导致随对象一起存储持久事件列表。 如果先前为整个文件系统设置了事件列表,并且该文件系统中的对象后续事件列表包括为文件系统设置的事件,那么事件将根据文件系统的事件列表继续生成直到事件被禁用的时间为止,在这种情况下对象的事件列表将起作用。

如果生成事件的进程在等待来自 DM 应用程序的响应时被阻塞,那么休眠可中断。

AIX 采用合理可靠的异步消息传递模型。 未传递的异步消息数量通过在系统上配置的可用内存(实际或虚拟)的数量来限制。 如果消息的数量超过可用内存的数量,将会丢失未传递的异步消息。 名称空间事件消息的异步传递由底层的文件系统实现确定。

对于 AIX, DM_SESSION_INFO_LEN 为 256 , DM_ATTR_NAME_SIZE 为 8。

对于 DMAPI 接口(将数据返回到用户缓冲区和用缓冲区结果大小填充用户变量),当接口以 E2BIG 除外的错误而失败时,缓冲区的内容和用户大小变量都是没有定义的。 对于任何这样的错误,必须忽略用户缓冲区的内容。 当接口失败并且错误号为 E2BIG 时,将设置用户大小变量的内容来指示要求的大小,在这种情况下应用程序可以用重新调整大小的缓冲区重试接口。

增强型日志文件系统的 DMAPI 注意事项

注: 内部快照不能与 DMAPI 管理的文件系统配合使用。

除了 DMAPI 的常规 AIX 实现所提供的功能外, JFS2 实现还提供以下功能和限制。

dm_get_config 函数针对 JFS2 实现选项和限制返回以下值:
DM_CONFIG_BULKALL
支持
DM_CONFIG_LEGACY
支持
DM_CONFIG_PERS_ATTRIBUTES
支持
DM_CONFIG_PERS_EVENTS
支持
DM_CONFIG_PERS_INHERIT_ATTRIBS
支持
DM_CONFIG_PERS_MANAGED_REGIONS
支持
DM_CONFIG_PUNCH_HOLE
支持
DM_CONFIG_WILL_RETRY
支持
DM_CONFIG_CREATE_BY_HANDLE
不受支持
DM_CONFIG_LOCK_UPGRADE
不受支持
DM_CONFIG_OBJ_REF
不受支持
DM_CONFIG_PENDING
不受支持
DM_CONFIG_DTIME_OVERLOAD
TRUE
DM_CONFIG_MAX_ATTR_ON_DESTROY
128
DM_CONFIG_MAX_ATTRIBUTE_SIZE
4072
DM_CONFIG_MAX_HANDLE_SIZE
32
DM_CONFIG_MAX_MANAGED_REGIONS
167
DM_CONFIG_MAX_MESSAGE_DATA
65536
DM_CONFIG_TOTAL_ATTRIBUTE_SPACE
4072

在 JFS2 实现中,所有 DM 属性值共享同一分配。 因此,任何一个属性的值大小不能超过 DM_CONFIG_MAX_ATTRIBUTE_SIZE,并且受到与对象(该对象也限制为 DM_CONFIG_MAX_ATTRIBUTE_SIZE)关联的所有 DM 属性的值大小的和的进一步限制。

除了 AIX不支持的可选接口外, JFS2 实现不支持可选的 DMAPI 取消和首次事件,也不支持其他可选的 dm_getall_dmattrdm_create_by_handledm_symlink_by_handle 功能。

由于 JFS2的扩展属性支持的当前实现, dm_set_region 函数会导致修改文件的 ctime。 JFS2 不尝试重新排序也不尝试合并受管域。

JFS2 为所有相应操作生成异步名称空间事件消息,无论它们成功或失败。

JFS2 提供允许对文件系统内的元数据进行预分配和直接控制的接口。 以 MM_ALLOC 或 MM_RECORD 方式使用这些接口将以指定的位移和长度生成 DMAPI 写事件。

如果未对 dm_get_bulkalldm_get_bulkattrdm_get_dirattrsdm_get_fileattr 函数 (即,设置为零) 的掩码指定值,那么 JFS2 将返回 dm_stat 结构中的所有字段。 如果掩码设为特定值,那么仅返回掩码请求的字段;掩码未指定的字段的值并没有定义。

JFS2 不使用 dm_respond_event 函数的 respbufp 参数。 如果指定,当函数返回时,缓冲区的内容并没有定义。

由于 JFS2 会重载 dm_ctime 和 dm_dtime (即, DM_CONFIG_DTIME_OVERLOAD 为 true) ,因此将忽略 dm_set_dmattr 函数的 setdtime 参数。

在映射文件时 (即,执行 mmap(2) 调用时) ,文件的任何非驻留部分都必须由 DM 应用程序驻留。 要通知映射的应用程序,JFS2 将生成与正被映射的方式和区域相对应的读或写事件。

在 JFS2 文件系统上激活 DMAPI

要在 JFS2 文件系统上激活 DMAPI,请输入以下内容:
chfs -a managed=yes mountpoint

如果当前在发出 chfs 命令时安装了文件系统,那么在设置了 managed 参数时,必须有支持 DMAPI 的应用程序侦听并响应安装事件; chfs 命令是否成功将取决于应用程序如何响应安装事件。

要取消激活 JFS2 文件系统上的 DMAPI,请输入以下内容:
chfs -a managed=no mountpoint

如果在发出 chfs 命令时当前安装了文件系统,那么当设置了 managed 参数时,必须有支持 DMAPI 的应用程序侦听并响应预卸载事件。 chfs 命令的成功取决于应用程序如何响应预卸载事件。

在 JFS2 加密文件系统上使用 DMAPI

在 JFS2 加密文件系统中的加密文件上执行不可视的 I/O 操作时,将应用相同的位移和长度对齐限制,就像在文件上执行原始方式 I/O 一样。 特别是,必须根据文件系统的块大小对 I/O 的位移和长度进行块对应。 已加密数据的大小总是为文件系统块的倍数,即使解密文件大小不是该倍数也是如此;如果文件大小不对应于块,那么文件包含的加密数据超出了文件大小。
注: stat 子例程和 DMAPI 接口 (例如 dm_get_fileattr 函数) 报告明文 (解密) 文件大小, 当您将 STX_EFSRAW 作为 command 参数传递时, statx 子例程将报告块对齐的加密数据大小。
dm_read_invis 函数和 dm_write_invis 函数必须符合以下要求才能使操作成功:
dm_read_invis
对于加密文件,offlen 参数必须对应于文件系统块大小,否则操作将失败,并带有 EINVAL 错误代码。
dm_write_invis
对于加密文件,offlen 参数必须对应于文件系统的块大小并且操作不得尝试扩展文件,否则操作将失败,并带有 EINVAL 错误代码。

在AIX®工作负载分区上使用 DMAPI

您必须将 PV_FS_DMAPI 特权添加到特权集,并将其分配给工作负载分区 (WPAR) 中运行的进程,以在 WPAR 中运行 DMAPI 应用程序。 您可以在创建 WPAR 时为其添加或分配特权集,也可以稍后修改特权集。

示例
mkwpar -S privs+=PV_FS_DMAPI -n wparname
chwpar -S privs+=PV_FS_DMAPI wparname

缺省情况下,仅根进程获取用于在 WPAR 中运行的特权。 在禁用 root 用户的系统 (缺省情况下禁用 root 用户) 中,非 root 用户进程通过在全局或 WPAR 系统中使用 privcmds 表来获取此特权。 有关更多信息,请参阅 RBAC 特权