Tôi đang cố gắng sử dụng khóa flock () / BSD để khóa các tệp được sử dụng trên nhiều máy khách, nhưng các tệp bị hỏng. Làm thế nào mà? Các khóa A. flock () / BSD chỉ hoạt động cục bộ trên các máy khách Linux NFS trước 2.6.12. Sử dụng khóa fcntl () / POSIX để đảm bảo rằng các tệp khóa được hiển thị cho các máy khách khác.
Dưới đây là một số cách để tuần tự hóa quyền truy cập vào tệp NFS.
Sử dụng API khóa fcntl () / POSIX. Kiểu khóa này cung cấp khóa phạm vi byte trên nhiều máy khách thông qua giao thức NLM hoặc qua NFSv4. Sử dụng một lockfile riêng và tạo các liên kết cứng đến nó. Xem mô tả trong phần O_EXCL của trang man (2). Điều đáng chú ý là cho đến đầu 2,6 hạt nhân, O_EXCL tạo ra không phải là nguyên tử trên các máy khách NFS của Linux. Không sử dụng O_EXCL tạo và mong đợi hành vi nguyên tử giữa nhiều máy khách NFS trừ khi bạn đang chạy kernel mới hơn 2.6.5.
Theo mặc định, Perl sử dụng khóa flock () / BSD. Điều này có thể phá vỡ các chương trình được chuyển từ các hệ điều hành khác, chẳng hạn như Solaris, dự kiến các khóa bầy / BSD sẽ hoạt động giống như khóa POSIX.
Trên Linux, sử dụng khóa tệp thay vì liên kết cứng có thêm lợi ích là kiểm tra bộ đệm của máy khách với máy chủ. Khi có được khóa tệp, máy khách sẽ xóa bộ đệm trang cho tệp đó để mọi lần đọc tiếp theo nhận được dữ liệu mới từ máy chủ. Khi khóa tệp được giải phóng, mọi thay đổi đối với tệp trên máy khách đó sẽ được chuyển trở lại máy chủ trước khi khóa được giải phóng để các máy khách khác đang chờ khóa tệp đó có thể thấy các thay đổi.
Máy khách NFS trong 2.6.12 cung cấp hỗ trợ cho khóa flock () / BSD trên các tệp NFS bằng cách mô phỏng các khóa kiểu BSD theo các khóa phạm vi byte POSIX. Các máy khách NFS khác sử dụng cùng một cơ chế mô phỏng hoặc sử dụng các khóa fcntl () / POSIX, sau đó sẽ thấy các khóa tương tự mà máy khách NFS của Linux nhìn thấy.
Trên các hệ thống tệp Linux cục bộ, khóa POSIX và khóa BSD là vô hình với nhau. Do đó, do mô phỏng này, các ứng dụng chạy trên máy chủ Linux NFS sẽ vẫn thấy các tệp bị khóa bởi các máy khách NFS bị khóa bằng khóa fcntl () / POSIX, cho dù ứng dụng trên máy khách đang sử dụng kiểu BSD hay POSIX- khóa kiểu. Nếu ứng dụng máy chủ sử dụng khóa BSD flock (), nó sẽ không thấy các khóa mà máy khách NFS sử dụng.