DLMFS¶
一个通过虚拟文件系统实现的最小DLM用户空间接口。
dlmfs与OCFS2一起构建,因为它需要其大部分基础设施。
- 项目网页:
- 工具网页:
- OCFS2邮件列表:
所有代码版权归2005年Oracle所有,除非另有说明。
鸣谢¶
部分代码取自ramfs,其版权归© 2000 Linus Torvalds和Transmeta Corp所有。
Mark Fasheh <mark.fasheh@oracle.com>
注意事项¶
目前它仅适用于OCFS2 DLM,但对其他DLM实现的支持应该不是主要问题。
挂载选项¶
无
用法¶
如果您只对OCFS2感兴趣,请参阅OCFS2 文件系统。本文档的其余部分将面向那些希望使用dlmfs在用户空间中轻松设置和使用集群锁的人。
设置¶
dlmfs 要求 OCFS2 集群基础设施到位。请从上述 URL 下载 ocfs2-tools 并配置一个集群。
您需要在锁空间中的所有节点都可以访问的卷上启动心跳。最简单的方法是通过 ocfs2_hb_ctl(与 ocfs2-tools 一起分发)。目前,它要求 OCFS2 文件系统到位,以便它可以自动找到其心跳区域,但它最终将支持针对原始磁盘的心跳。
请参阅与 ocfs2-tools 一起分发的 ocfs2_hb_ctl 和 mkfs.ocfs2 手册页。
一旦您正在进行心跳,就可以轻松创建/销毁 DLM 锁“域”,并访问其中的锁。
锁机制¶
用户可以通过标准文件系统调用访问 dlmfs,也可以使用“libo2dlm”(与 ocfs2-tools 一起分发),该库抽象了文件系统调用并呈现了更传统的锁 API。
dlmfs 会为用户自动处理锁缓存,因此对已获取的锁的锁请求不会生成另一个 DLM 调用。假定用户空间程序处理其自己的本地锁。
支持两种级别的锁 - 共享读和独占。 还支持 Trylock 操作。
有关 libo2dlm 接口的信息,请参阅 o2dlm.h,与 ocfs2-tools 一起分发。
可以通过对通过 open(2) 调用获得的 fd 进行 read(2) 和 write(2) 操作来读取和写入资源的锁值块 (LVB)。目前支持的最大 LVB 长度为 64 字节(但这 是 OCFS2 DLM 限制)。通过此机制,dlmfs 的用户可以在其节点之间共享少量数据。
mkdir(2) 向 dlmfs 发出加入域的信号(其名称将与生成的目录相同)
rmdir(2) 向 dlmfs 发出离开域的信号
给定域的锁由域目录内的常规 inode 表示。 对其进行锁操作是通过 open(2) 系统调用完成的。
open(2) 调用将不会返回,直到您的锁被授予或发生错误,除非它被指示执行 trylock 操作。 如果锁成功,您将获得一个 fd。
使用 O_CREAT 的 open(2) 确保创建资源 inode - dlmfs 不会自动为现有锁资源创建 inode。
打开标志 |
锁请求类型 |
---|---|
O_RDONLY |
共享读 |
O_RDWR |
独占 |
打开标志 |
产生的锁行为 |
---|---|
O_NONBLOCK |
Trylock 操作 |
您必须准确提供 O_RDONLY 或 O_RDWR 中的一个。
如果也提供了 O_NONBLOCK 并且 trylock 操作有效但无法锁定资源,则 open(2) 将返回 ETXTBUSY。
close(2) 释放与您的 fd 关联的锁。
传递给 mkdir(2) 或 open(2) 的模式在本地遵守。本地也支持 Chown。这意味着您可以使用它们来限制对仅在本地节点上通过 dlmfs 访问的资源的访问。
可以通过 read(2) 系统调用从 fd 中以共享读或独占模式读取资源 LVB。仅在以独占模式打开时才能通过 write(2) 写入。
写入后,获取资源只读或更高级别锁的其他节点将可以看到 LVB。
另请参阅¶
http://opendlm.sourceforge.net/cvsmirror/opendlm/docs/dlmbook_final.pdf
有关 VMS 分布式锁 API 的更多信息。