数据管理应用程序编程接口
AIX提供数据管理应用程序编程接口 (DMAPI),它是 "系统管理:数据存储管理(XDSM)API "X/Open 标准,由 The Open Group 发布。
DMAPI 允许软件销售商使用 POSIX 兼容系统中没有的一组函数和语义开发数据管理应用程序。 它不向最终用户提供直接功能。 完整的 DMAPI 文档可以在 The Open Group Web 站点的 Publications 部分找到。
AIX 提供的 DMAPI 是通用实现。 可选接口和功能的支持级别由底层文件系统实现确定并且对特定文件系统记录在不同的部分中。
- 多个会话无法为同一对象上的同一事件注册处置。
- 事件消息以会话为目标并根据会话排列;事件与特定进程之间没有显式的针对性。
- 如果没有会话为除了安装事件外的特别事件注册处置,那么 DMAPI 将不会生成事件并且允许进程继续(就好像没有启用任何事件一样)。 如果没有会话为始终启用的安装注册处置,那么 DMAPI 会使事件失败并且不允许安装文件系统。
DMAPI 在 AIX内的抽象层中实现,允许任何底层文件系统定义其个别级别的支持和实现选项。 日志文件系统 (JFS) 不提供任何对 DMAPI 的支持。 增强型日志文件系统的 DMAPI 注意事项中概述了由 X/Open 标准描述的实现选项,限制和其他细节的增强型日志文件系统 (JFS2) 行为。
如果AIXDMAPI 初始化正确,"dm_init_service函数返回 0;如果初始化失败,则返回-1。 初始化失败后任何其他 DMAPI 函数的使用也将会失败。
- dm_downgrade_right
- dm_upgrade_right
- dm_obj_ref_* 系列
- dm_pending
当数据管理 (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 的常规 AIX 实现所提供的功能外, 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_dmattr, dm_create_by_handle和 dm_symlink_by_handle 功能。
由于 JFS2的扩展属性支持的当前实现, dm_set_region 函数会导致修改文件的 ctime。 JFS2 不尝试重新排序也不尝试合并受管域。
JFS2 为所有相应操作生成异步名称空间事件消息,无论它们成功或失败。
JFS2 提供允许对文件系统内的元数据进行预分配和直接控制的接口。 以 MM_ALLOC 或 MM_RECORD 方式使用这些接口将以指定的位移和长度生成 DMAPI 写事件。
如果未对 dm_get_bulkall, dm_get_bulkattr, dm_get_dirattrs和 dm_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
chfs -a managed=yes mountpoint
如果当前在发出 chfs 命令时安装了文件系统,那么在设置了 managed 参数时,必须有支持 DMAPI 的应用程序侦听并响应安装事件; chfs 命令是否成功将取决于应用程序如何响应安装事件。
chfs -a managed=no mountpoint
如果在发出 chfs 命令时当前安装了文件系统,那么当设置了 managed 参数时,必须有支持 DMAPI 的应用程序侦听并响应预卸载事件。 chfs 命令的成功取决于应用程序如何响应预卸载事件。
在 JFS2 加密文件系统上使用 DMAPI
- dm_read_invis
- 对于加密文件,off 和 len 参数必须对应于文件系统块大小,否则操作将失败,并带有 EINVAL 错误代码。
- dm_write_invis
- 对于加密文件,off 和 len 参数必须对应于文件系统的块大小并且操作不得尝试扩展文件,否则操作将失败,并带有 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 特权。