我想在 linux (Ubuntu 22.04.2 LTS) 中测试强制锁定,我执行以下步骤
1-
mount /dev/vgg1/lvv11 /u03 -o mand
2-
chmod g+s /u03/datafile.dbf
3-
chmod g-x /u03/datafile.dbf
然后执行以下代码:
struct flock lock;
.....
fd = open("/u03/datafile.dbf", O_RDWR);
lock.l_type = F_WRLCK;
lock.l_start = 40;
lock.l_whence = SEEK_SET;
lock.l_len = 12;
err=fcntl(fd, F_SETLK, &lock);
但是作为 lslocks 的输出,如下所示,表明锁定类型不是强制性的!
COMMAND PID TYPE SIZE MODE M START END PATH
llock 466440 POSIX 378B WRITE 0 40 51 /u03/datafile.dbf
cron 130607 FLOCK 7B WRITE 0 0 0 /run/crond.pid
如何获取强制锁?
此选项,当它存在时,是必需的,如文档所述,以使用
-o mand
挂载文件系统,并设置setgid且未设置execute。 OP 做了所有这些。
但正如记录的那样,此功能在 Linux 上始终存在问题。文档的第一段 (0.) 解释了为什么应该避免强制锁定,并给出了一个示例结果,其中在进程获得强制锁定后,由于竞争条件,数据仍然可以由其他进程写入,从而违反了合同强制锁定。
这个功能(出现在内核 4.5 中)在内核 5.15 中通过此提交被完全删除了:
事实上,如果您在第一次使用fs:删除强制文件锁定支持
我们在 2015 年添加了 CONFIG_MANDATORY_FILE_LOCKING,不久之后就转向了 Fedora 和 RHEL8 中已关闭。其他几个发行版也纷纷效仿。[...]
此补丁彻底取消了强制锁定支持 内核,以及 Kconfig 选项 和文档文件。它 还将挂载代码更改为忽略“mand”挂载选项 错误,并抛出一个又大又难看的警告。
dmesg
选项后运行
-o mand
,您应该会收到一条大的多行警告消息,告知支持已被删除。使用 Linux 的系统自启动后未使用
-o mand
的示例:
# mkdir /tmp/test
# mount -t tmpfs tmpfs -o mand /tmp/test
# dmesg | tail -n5
[1788215.604544] =======================================================
WARNING: The mand mount option has been deprecated and
and is ignored by this kernel. Remove the mand
option from the mount to silence this warning.
=======================================================
因此,您必须运行启用此功能的旧版内核才能使用它。 仍然(但不会长期)支持启用此功能的 Linux 发行版的示例
CONFIG_MANDATORY_FILE_LOCKING=y
。
直到 2025-04)
附带内核 5.4.x 和CONFIG_MANDATORY_FILE_LOCKING=y
。 注意:20.04.0x LTS 可能使用较新的内核。 5.11 20.04.5 LTS 使用 5.15,因此不符合资格。
CONFIG_MANDATORY_FILE_LOCKING=y