You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 22.04测试Linux强制文件锁失败,如何获取强制锁?

Ubuntu 22.04.2 LTS 配置Linux强制锁(Mandatory Locking)的问题与解决

问题描述

在Ubuntu 22.04.2 LTS系统中测试Linux强制锁,执行了以下操作:

  • 挂载分区并启用强制锁:mount /dev/vgg1/lvv11 /u03 -o mand
  • 设置文件组SGID位:chmod g+s /u03/datafile.dbf
  • 移除文件组执行权限:chmod g-x /u03/datafile.dbf

随后通过C代码调用fcntl设置区域写锁:

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查看锁信息时,显示锁类型为POSIX而非预期的强制锁:

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

需要明确:如何正确配置并验证强制锁生效?

解决说明

首先要明确:强制锁(Mandatory Locking)是基于POSIX锁机制的内核强制管控逻辑,lslocks仍会将其标注为POSIX类型,不能仅通过TYPE字段判断是否为强制锁,需验证实际的阻塞效果。

若强制锁未实际生效,需检查以下几点:

1. 确认文件系统支持强制锁

并非所有文件系统默认支持强制锁,以ext4为例,需确保挂载时已添加mand参数,可通过以下命令验证:

mount | grep /u03

输出中需包含mand关键字。同时检查内核配置是否开启强制锁支持:

zcat /proc/config.gz | grep CONFIG_MANDATORY_FILE_LOCKING

结果应为CONFIG_MANDATORY_FILE_LOCKING=y,否则需重新编译内核开启该选项。

2. 验证文件权限配置正确性

强制锁要求文件同时满足:

  • 组SGID位(g+s)已设置
  • 组执行权限(g-x)已移除

执行以下命令查看文件权限:

ls -l /u03/datafile.dbf

正确的权限格式应显示为-rw-r-Sr--(大写S表示SGID位存在但无组执行权限)。

3. 验证强制锁的实际生效效果

强制锁的核心是内核阻止其他进程访问被锁定的区域,验证步骤:

  1. 启动进程A运行你的加锁代码,保持进程处于运行状态(不退出);
  2. 打开新终端,运行进程B尝试写入被锁定的区域:
    dd if=/dev/zero of=/u03/datafile.dbf bs=1 count=12 seek=40
    
  3. 若进程B被阻塞(无输出且无法终止,需用Ctrl+C中断),说明强制锁已生效;若进程B直接完成写入,则强制锁未生效。

额外注意事项

  • 强制锁仅对普通文件生效,不支持目录、设备文件等特殊文件;
  • 仅本地文件系统支持强制锁,NFS等网络文件系统无法使用;
  • 若使用O_TRUNC标志打开文件,会清除已存在的强制锁;
  • 强制锁的优先级低于文件权限,若进程对文件无读写权限,即使无锁也无法访问。

内容的提问来源于stack exchange,提问作者tahzibi.jafar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:42:48