NFS의 로컬 파일 잠금은 Linux 커널에 의존합니다.

NFS의 로컬 파일 잠금은 Linux 커널에 의존합니다.

NFS를 통해 파일을 처리해야 하는 python2 애플리케이션이 있습니다. 안타깝게도 애플리케이션은 다음 lock() 잠금을 사용합니다.

#!/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()작동합니다. 하지만 이것은 단지 테스트 코드일 뿐입니다. 나할 수 없다프로덕션 애플리케이션의 코드를 변경합니다. 이것은아니요코드 문제이므로 여기에 속한다고 생각합니다.

nolockNFS 공유를 사용 및/또는 마운트했습니다 local_lock=all.
~에 따르면네트워크 파일 시스템(5):

nolock 옵션을 사용하면 애플리케이션이 파일을 잠글 수 있지만 이러한 잠금은 동일한 클라이언트에서 실행 중인 다른 애플리케이션에 대해서만 제외 기능을 제공합니다.

(D10도 참조하세요.여기)

그리고:

클러스터 및 POSIX 잠금 메커니즘 중 하나 또는 둘 다에 대해 로컬 잠금을 사용할지 여부를 지정합니다. [...]Linux NFS 클라이언트는 로컬로 잠금을 수행하는 방법을 제공합니다. 이는 응용 프로그램이 파일을 잠글 수 있지만 이러한 잠금은 동일한 클라이언트에서 실행 중인 다른 응용 프로그램에 대한 제외만을 제공한다는 것을 의미합니다.

차이점이 무엇인지 잘 모르겠지만 이러한 옵션을 사용하면 로컬 전용 잠금(나에게는 괜찮음)을 활성화하고 IO 오류를 방지하면 안 됩니까?

무리(2)설명하다:

2.6.11 이전의 Linux 커널에서는 Flock()이 NFS를 통해 파일을 잠그지 않았습니다(즉, 잠금 범위가 로컬 시스템으로 제한되었습니다). [...] Linux 2.6.12부터 NFS 클라이언트는 FC를 전체 파일에 대한 바이트 범위 잠금으로 에뮬레이션하여 Flock() 잠금을 지원합니다.

NFS 서버와 NFS 클라이언트가 모두 실행 중입니다.ScientificLinux7.4(CentOS와 매우 유사), 커널 3.10.
커널 3.10은 fancy()를 사용하여 NFS 파일을 잠글 수 없어야 합니까?

Ubuntu 16.04(커널 4.4.0) 호스트에 NFS 공유를 마운트하려고 시도했는데 잠금이 제대로 작동했습니다!
그런 다음 Scientific Linux 클라이언트를 커널 4.4.91로 업데이트했는데도 작동했습니다!
이것이 훌륭하지만 나는훨씬 더스톡 커널 3.10을 사용하여 프로덕션 클라이언트를 쉽게 실행할 수 있습니다.

질문: 작동하는 로컬 잠금을 사용하여 공유를 마운트하는 방법(아니요기존 커널 3.10에서 커널 업데이트)?

보너스nolocklocal_lock=all: 왜 및 마운트 옵션 이 말한 대로 작동 하지 않습니까 ? 제가 맨페이지를 잘못 이해한 걸까요? 매뉴얼 페이지에는 작동한다고 나와 있는데
왜 커널 > 2.6.11에서는 작동하지 않습니까 ? 커널 4.4로 업그레이드하면 이 문제가 해결되는 이유는 무엇입니까?flock()

답변1

나는 이 행동을 RedHat에 보고했습니다. 이는 실제로 RedHat 커널의 버그로 인해 발생하며 kernel-3.10.0-693.18.1.el7에서 수정되었습니다. 적어도 NFSv3의 경우는 그렇습니다. NFSv4의 경우 이는 원하는 동작인 것 같습니다.

RedHat 구독이 있는 경우 티켓을 찾을 수 있습니다.티켓 01951116

관련 정보