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 集群基础架构到位。请从上面的网址下载 ocfs2-tools 并配置集群。

您需要在一个您的锁定空间中的所有节点都可以访问的卷上启动心跳。最简单的方法是通过 ocfs2_hb_ctl(与 ocfs2-tools 一起分发)。目前它要求 OCFS2 文件系统到位,以便它可以自动找到其心跳区域,尽管它最终将支持针对原始磁盘的心跳。

请参阅与 ocfs2-tools 一起分发的 ocfs2_hb_ctl 和 mkfs.ocfs2 手册页。

一旦您进行心跳,DLM 锁“域”可以很容易地创建/销毁,并且可以访问其中的锁。

锁定

用户可以通过标准文件系统调用访问 dlmfs,或者他们可以使用“libo2dlm”(与 ocfs2-tools 一起分发),它抽象了文件系统调用并呈现更传统的锁定 API。

dlmfs 自动为用户处理锁缓存,因此对已获取锁的锁请求不会生成另一个 DLM 调用。假定用户空间程序处理它们自己的本地锁定。

支持两个级别的锁 - 共享读取和独占。也支持尝试锁定操作。

有关 libo2dlm 接口的信息,请参阅与 ocfs2-tools 一起分发的 o2dlm.h。

可以通过 read(2) 从资源读取锁值块,并通过 write(2) 写入,针对通过 open(2) 调用获得的 fd。目前支持的最大 LVB 长度为 64 字节(尽管这是 OCFS2 DLM 的限制)。通过这种机制,dlmfs 的用户可以在他们的节点之间共享少量数据。

mkdir(2) 向 dlmfs 发出加入域的信号(该域将具有与结果目录相同的名称)

rmdir(2) 向 dlmfs 发出离开域的信号

给定域的锁由域目录内的常规 inode 表示。对它们的锁定是通过 open(2) 系统调用完成的。

open(2) 调用将不会返回,直到您的锁已获得或发生错误,除非它已被指示执行 trylock 操作。如果锁成功,您将获得一个 fd。

open(2) 与 O_CREAT 一起使用以确保创建资源 inode - dlmfs 不会自动为现有锁资源创建 inode。

打开标志

锁定请求类型

O_RDONLY

共享读取

O_RDWR

独占

打开标志

结果锁定行为

O_NONBLOCK

尝试锁定操作

您必须提供 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 的更多信息。