我有一个python2应用程序,它需要处理NFS上的文件。不幸的是,应用程序使用了flock()锁,如下所示:
#!/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()这是失败的:
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上安装使用本地锁(不更新内核)的共享?
额外好处:为什么nolock和local_lock=all挂载选项不按他们说的做呢?我是不是误解了手册页?
为什么flock()不能在内核> 2.6.11上工作,即使手册页说它可以呢?
为什么升级到内核4.4会解决这个问题?
发布于 2018-04-13 08:49:39
我向RedHat报告了这种行为。它实际上是由RedHat内核中的一个bug引起的,并且在内核中得到了修正-3.10.0-693.18.1.el7。至少对NFSv3来说是这样。对于NFSv4来说,这似乎是所期望的行为。
如果您有RedHat订阅,您可以查找票证:01951116票
https://unix.stackexchange.com/questions/396886
复制相似问题