linux对文件加锁的强制加锁

问题描述 投票:0回答:1

我想在 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

如何获取强制锁?

c linux locking file-locking
1个回答
0
投票

此选项,当它存在时,是必需的,如文档所述,以使用

-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 发行版的示例

  • Debian 11(

    LTS 至 2026 年 6 月 30 日)

    附带内核 5.10.x 和

    CONFIG_MANDATORY_FILE_LOCKING=y

  • Ubuntu 20.04 LTS(

    直到 2025-04)

    附带内核 5.4.x 和

    CONFIG_MANDATORY_FILE_LOCKING=y

    。
    注意:20.04.0x LTS 可能使用较新的内核。 5.11 20.04.5 LTS 使用 5.15,因此不符合资格。

正如提交中所写,类似 RHEL 的发行版很早就放弃了支持,因此我不希望它们发布的任何内核具有

CONFIG_MANDATORY_FILE_LOCKING=y


如果您的软件预计在 Linux 上依赖此功能,则必须更改其代码。

© www.soinside.com 2019 - 2024. All rights reserved.