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. 验证强制锁的实际生效效果
强制锁的核心是内核阻止其他进程访问被锁定的区域,验证步骤:
- 启动进程A运行你的加锁代码,保持进程处于运行状态(不退出);
- 打开新终端,运行进程B尝试写入被锁定的区域:
dd if=/dev/zero of=/u03/datafile.dbf bs=1 count=12 seek=40 - 若进程B被阻塞(无输出且无法终止,需用Ctrl+C中断),说明强制锁已生效;若进程B直接完成写入,则强制锁未生效。
额外注意事项
- 强制锁仅对普通文件生效,不支持目录、设备文件等特殊文件;
- 仅本地文件系统支持强制锁,NFS等网络文件系统无法使用;
- 若使用
O_TRUNC标志打开文件,会清除已存在的强制锁; - 强制锁的优先级低于文件权限,若进程对文件无读写权限,即使无锁也无法访问。
内容的提问来源于stack exchange,提问作者tahzibi.jafar
相关产品推荐
相关产品推荐

