flock () / BSD 잠금을 사용하여 여러 클라이언트에서 사용되는 파일을 잠그려고하는데 파일이 손상되었습니다. 어떻게 오세요? A. flock () / BSD 잠금은 2.6.12 이전의 Linux NFS 클라이언트에서만 로컬로 작동합니다. fcntl () / POSIX 잠금을 사용하여 파일 잠금이 다른 클라이언트에 표시되도록하십시오.
NFS 파일에 대한 액세스를 직렬화하는 몇 가지 방법이 있습니다.
fcntl () / POSIX 잠금 API를 사용하십시오. 이 유형의 잠금은 NLM 프로토콜 또는 NFSv4를 통해 여러 클라이언트에서 바이트 범위 잠금을 제공합니다. 별도의 잠금 파일을 사용하고 하드 링크를 작성하십시오. creat (2) 매뉴얼 페이지의 O_EXCL 섹션에있는 설명을 참조하십시오. 2.6 커널 초기까지 O_EXCL 생성은 Linux NFS 클라이언트에서 원자 적이 지 않았다는 점에 주목할 가치가 있습니다. 2.6.5보다 최신 커널을 실행하지 않는 한 O_EXCL을 사용하지 말고 여러 NFS 클라이언트간에 원자 동작을 예상하십시오.
Perl이 기본적으로 flock () / BSD 잠금을 사용하는 것은 알려진 문제입니다. 이로 인해 Solaris와 같은 다른 운영 체제에서 포팅 된 프로그램이 POSIX 잠금처럼 작동 할 것으로 예상되는 프로그램이 중단 될 수 있습니다.
Linux에서 하드 링크 대신 파일 잠금을 사용하면 서버와 클라이언트의 캐시를 검사 점으로 지정할 수 있다는 이점이 있습니다. 파일 잠금이 확보되면 클라이언트는 해당 파일에 대한 페이지 캐시를 플러시하므로 이후의 모든 읽기가 서버에서 새 데이터를 가져옵니다. 파일 잠금이 해제되면 잠금을 해제하기 전에 해당 클라이언트의 파일에 대한 모든 변경 사항이 서버로 다시 플러시되므로 해당 파일을 잠금을 대기중인 다른 클라이언트가 변경 사항을 볼 수 있습니다.
2.6.12의 NFS 클라이언트는 POSIX 바이트 범위 잠금 측면에서 BSD 스타일 잠금을 에뮬레이트하여 NFS 파일에서 flock () / BSD 잠금을 지원합니다. 동일한 에뮬레이션 메커니즘을 사용하거나 fcntl () / POSIX 잠금을 사용하는 다른 NFS 클라이언트는 Linux NFS 클라이언트와 동일한 잠금을 보게됩니다.
로컬 Linux 파일 시스템에서 POSIX 잠금과 BSD 잠금은 서로 보이지 않습니다. 따라서이 에뮬레이션으로 인해 Linux NFS 서버에서 실행되는 응용 프로그램은 클라이언트의 응용 프로그램이 BSD 스타일을 사용하든 POSIX- 스타일 잠금. 서버 응용 프로그램이 flock () BSD 잠금을 사용하는 경우 NFS 클라이언트가 사용하는 잠금을 볼 수 없습니다.