DLMFS

一个通过虚拟文件系统实现的最小DLM用户空间接口。

dlmfs与OCFS2一起构建,因为它需要其大部分基础设施。

项目网页:

http://ocfs2.wiki.kernel.org

工具网页:

https://github.com/markfasheh/ocfs2-tools

OCFS2邮件列表:

https://subspace.kernel.org/lists.linux.dev.html

所有代码版权归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 的更多信息。