đàn (2) so với fcntl (2) trên một NFS


19

Tài liệu Perl 5.x nói rằng việc triển khai đàn (..) của nó sẽ sử dụng một trong các cuộc gọi riêng sau, bắt đầu từ 1 và làm việc tới 3 nếu không khả dụng:

  1. đàn (2)
  2. fcntl (2)
  3. khóa (3)

Đó là tốt. Tuy nhiên, bạn có thể nhận thấy từ chối trách nhiệm của họ rằng không nên sử dụng đàn (2) qua NFS. Tài liệu đề nghị sử dụng cờ -Ud_flock để buộc Perl sử dụng đàn (2). Trang man của đàn (2) (trên Redhat) nêu rõ sự từ chối tương tự về các vấn đề NFS.

Câu hỏi của tôi là, tại sao!?!? Tôi dường như không thể tìm thấy một bài viết chuyên sâu hoặc giải thích về TẠI SAO đàn (2) không an toàn trên NFS.

Tôi đã viết một số tập lệnh thử nghiệm bằng C và Perl, trên cả Redhat (nơi đàn chiên (2) đang được sử dụng) và trên Solaris (nơi fcntl (2) đang được sử dụng). Tôi đã chạy strace / truss để đảm bảo rằng Perl thực sự sử dụng bầy (2) và fcntl (2) tương ứng. Tôi không thể sao chép bất kỳ vấn đề nào mà khóa không được vinh danh! Đưa cái gì??

Câu trả lời:


3

Lennart Poettering gần đây đã thực hiện một số hành vi khóa hệ thống tập tin linux, điều này không vẽ ra một bức tranh đặc biệt màu hồng để khóa NFS (đặc biệt là phần tiếp theo mà anh ta liên kết ở cuối bài).

http://0pulum.de/blog/projects/locking.html


1
Đó là loại thông tin chính xác mà tôi đang tìm kiếm. Cảm ơn bạn! Sau vài tuần điều tra, đó là một giải pháp rất giống tôi đã tìm đến, nhưng thật tuyệt khi đọc một bài báo xác nhận sự nghi ngờ của tôi (và gợi ý những người khác). Các liên kết từ ý kiến của trang đó cũng là một tài liệu tham khảo tốt, và một bài viết tốt về POSIX và lịch sử của nó): samba.org/samba/news/articles/low_point/tale_two_stds_os2.html
Jmoney38

15

Tôi khá chắc chắn rằng bạn đang xem xét các mối quan tâm di sản. Hãy nhớ lại rằng hướng dẫn sử dụng Perl5 đã được phát hành vào năm 1994 và đó chỉ là một bản chỉnh sửa của hướng dẫn sử dụng Perl4 từ năm 1991. Trong những ngày đó, có thể nói về Hệ thống tập tin Nightmare có tên là "nó không phải là con gấu nhảy tốt như thế nào ngạc nhiên, nhưng nó nhảy múa cả ".

NFS2 trong kỷ nguyên 1991 đã dần dần bò ra khỏi Mặt trời vào các nền tảng khác và tương đối thô sơ. Mô hình bảo mật về cơ bản là không tồn tại (root trên máy khách có thể đọc toàn bộ nội dung của mount NFS) và khóa - thông qua nfs.lockd - là khía cạnh thử nghiệm này. Bạn sẽ thật ngu ngốc khi hy vọng ngữ nghĩa của đàn sẽ hoạt động tốt nếu ở giữa hai triển khai được cho là có thể tương tác khác nhau. Coax là Ethernet PHY chiếm ưu thế tại thời điểm mà nhiều người dùng mạng chưa bao giờ không hài lòng khi sử dụng (ý bạn là gì khi bạn quên đặt điện trở kết thúc 50𝛀?) Nếu điều đó giúp bạn hiểu rõ hơn về trạng thái mạng nội bộ.

Larry Wall và phi hành đoàn có mọi lý do để đưa ra các giả định bi quan về tính đúng đắn của các khóa NFS vào thời điểm đó, và đây là loại lập trình phòng thủ mà các jockey mã trong tương lai rất khó để loại bỏ vì rất khó để chứng minh sự thiếu sót của khiếm khuyết loại bỏ mã cũ được giới thiệu lại trong khả năng tương tác với một hệ thống cũ mà bạn chưa từng nghe đến.

Kể từ đó, NFS đã được cải thiện đáng kể và lockd đã di chuyển kịp thời sang một tính năng của nhân Linux 2.6. Đối với bộ sưu tập các hệ thống 2003+, khóa tệp NFS có thể đáng tin cậy, đặc biệt là nếu được kiểm tra tốt trong ứng dụng của bạn trên nhiều nền tảng mà nó có thể đang chạy.

Tất cả những điều trên đã được đưa vào bộ nhớ và có thể được chứng minh thông qua nghiên cứu (ví dụ: http://nfs.sourceforge.net/ ) nhưng bằng chứng - như họ nói - đang bị khóa và nếu bạn không kiểm tra nó , nó được coi là bị hỏng.


Đó là một phân tích tuyệt vời. Trong thực tế, tôi đã đi đến kết luận tương tự cho đến nay. Tôi đã đọc lại trang nfs sourceforge sau khi bạn đăng liên kết đó và cuối cùng tôi đã tìm thấy những gì tôi đang tìm kiếm! Đây là một phân tích chuyên sâu trực tiếp từ miệng ngựa!
Jmoney38

2
Rất tiếc, tôi nhấn enter ... đi đến nfs.sourceforge.net , phần D10 về phía dưới thảo luận chi tiết về vấn đề này.
Jmoney38

3

Một số khác, trực tiếp từ Câu hỏi thường gặp về Linux-NFS: nfs.sf.net

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.


Vì vậy, hai máy khách NFS chạy kernel 3.13. * Có thấy bầy () của nhau không?
Revierpost

Nếu tôi hiểu chính xác, câu trả lời là không. Trừ khi tôi bỏ lỡ một cái gì đó, flockkhông, không, và sẽ không khóa trên các nfs mount.
Daniel Farrell

Nó, ít nhất là trên NFS4.
rjh

3

Điều này đã hết hạn bây giờ. NFS4 hỗ trợ khóa bên trong giao thức (không yêu cầu cơ chế gọi lại RPC hoặc cơ chế gọi lại RPC) và flock()phương thức của Perl hoạt động tốt - chúng tôi đang sử dụng nó trong sản xuất.

Các phiên bản rất cũ của kernel được triển khai flock(tòa nhà chọc trời) dưới dạng không hoạt động trên NFS và các công cụ khác như khóa phạm vi byte không được hỗ trợ đúng cách. Đây là nơi hiềm khích đến từ.


Cảm ơn rất nhiều cho gợi ý. Gắn kết với NFS4 đã giải quyết vấn đề của tôi. Theo dõi access.redhat.com/documentation/en-us/red_hat_enterprise_linux/NH để có được cấu hình fstab ngay.
maraspin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.