首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NFS上的本地文件锁定与Linux内核相关

NFS上的本地文件锁定与Linux内核相关
EN

Unix & Linux用户
提问于 2017-10-08 18:33:48
回答 1查看 3.5K关注 0票数 3

我有一个python2应用程序,它需要处理NFS上的文件。不幸的是,应用程序使用了flock()锁,如下所示:

代码语言:javascript
复制
#!/usr/bin/env python2

import fcntl

print('Opening')
foo = open('file/on/NFS/share')
print('Locking')
fcntl.flock(foo, fcntl.LOCK_EX)
print('Closing')
foo.close()

这是失败的:

代码语言:javascript
复制
Opening
Locking
Traceback (most recent call last):
  File "./flock_lock.py", line 8, in <module>
    fcntl.flock(foo, fcntl.LOCK_EX)
IOError: [Errno 9] Bad file descriptor

如果我将fcntl.flock()更改为fcntl.fcntl(),则锁定工作。然而,这只是测试代码。我不能从生产应用程序中更改任何代码。这不是代码问题,所以我认为它属于这里。

我已经用nolock和/或local_lock=all挂载了NFS共享。

根据nfs(5)的说法:

当使用nolock选项时,应用程序可以锁定文件,但是这种锁只对运行在同一客户端上的其他应用程序提供排除。

(另见D10 这里)

以及:

指定是对群集和POSIX锁定机制中的任何一种还是两种使用本地锁定。Linux客户端...提供了一种本地锁的方法。这意味着应用程序可以锁定文件,但这种锁只对运行在同一客户端上的其他应用程序提供排除。

我不太清楚它们之间有什么区别,但是这些选项不应该启用本地锁(这对我来说很好)并防止IO错误吗?

羊群(2)说:

在2.6.11以下的Linux内核中,flock()不会在NFS上锁定文件(即锁的范围仅限于本地系统)。从Linux2.6.12开始,NFS客户端支持... ()锁,方法是在整个文件上将它们模拟为字节范围锁。

NFS服务器和NFS客户端都使用内核3.10运行科学Linux 7.4 (非常类似于CentOS)。

内核3.10不应该能够用flock()锁定NFS文件吗?

我试着在Ubuntu16.04(Kernel4.4.0)主机上挂载NFS共享,锁工作正常!

然后,我将科学Linux客户端更新为4.4.91内核,它也能工作!

虽然这很好,但我更愿意使用它的库存内核3.10运行生产客户端。

问:我如何在股票内核3.10上安装使用本地锁(不更新内核)的共享?

额外好处:为什么nolocklocal_lock=all挂载选项不按他们说的做呢?我是不是误解了手册页?

为什么flock()不能在内核> 2.6.11上工作,即使手册页说它可以呢?

为什么升级到内核4.4会解决这个问题?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2018-04-13 08:49:39

我向RedHat报告了这种行为。它实际上是由RedHat内核中的一个bug引起的,并且在内核中得到了修正-3.10.0-693.18.1.el7。至少对NFSv3来说是这样。对于NFSv4来说,这似乎是所期望的行为。

如果您有RedHat订阅,您可以查找票证:01951116票

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/396886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档