NFS: Hệ thống tệp mạng. Cài đặt máy chủ NFS và máy khách NFS. importfs: quản lý các thư mục đã xuất

Giải pháp thuận tiện để truy cập hệ thống tệp phân tán

Một hệ thống tập tin là một điều cần thiết. Chúng tôi làm việc trên các máy tính có khả năng truy cập vào máy in, máy ảnh, cơ sở dữ liệu, cảm biến từ xa, kính thiên văn, trình biên dịch và điện thoại di động. Những thiết bị này có rất ít điểm chung - đặc biệt, nhiều thiết bị trong số chúng đã trở thành hiện thực sau khi Internet trở nên phổ biến (ví dụ: máy ảnh điện tử và thiết bị di động hoạt động như máy tính nhỏ). Tuy nhiên, tất cả họ đều cần một hệ thống tệp để lưu trữ và truy cập thông tin một cách an toàn.

Nói chung, chúng ta không quan tâm đến cách dữ liệu, ứng dụng sử dụng dữ liệu và giao diện hiển thị dữ liệu đó được lưu trữ trong máy tính. Hầu hết người dùng muốn xem (và đúng như vậy) hệ thống tệp như một bức tường ngăn cách chúng với kim loại trần lưu trữ các bit và byte. Do đó, ngăn xếp giao thức kết nối các hệ thống tệp có xu hướng vẫn là hộp đen đối với hầu hết người dùng và thực tế là cả các lập trình viên. Tuy nhiên, cuối cùng, việc tổ chức tương tác mạng của tất cả các thiết bị này lại cho phép trao đổi dữ liệu giữa các hệ thống tệp.

Hệ thống tập tin mạng và các nghi thức thiêng liêng khác

Theo nhiều cách, trao đổi dữ liệu không gì khác hơn là sao chép thông tin qua khoảng cách xa. Các giao thức mạng không phải là phương tiện duy nhất có thể thực hiện được việc trao đổi dữ liệu phổ quát. Suy cho cùng, mọi hệ thống máy tính đều phải chuyển đổi các datagram thành thứ gì đó mà hệ điều hành ở đầu bên kia có thể hiểu được. TCP là một giao thức truyền tải rất hiệu quả, nhưng nó không được tối ưu hóa để truy cập tệp nhanh hoặc để điều khiển phần mềm ứng dụng từ xa.

Máy tính phân tán và mạng

Các giao thức mạng truyền thống có rất ít khả năng tổ chức các tính toán được phân bổ giữa các máy tính và đặc biệt là giữa các mạng. Chỉ những lập trình viên liều lĩnh mới dựa vào các giao thức truyền dữ liệu và cáp quang để kích hoạt tính toán song song. Thông thường, chúng tôi dựa vào mô hình nối tiếp, trong đó, khi kết nối được thiết lập, các giao thức lớp liên kết bắt đầu hoạt động, thực hiện quy trình xin chào khá phức tạp giữa các card mạng. Hệ thống tệp phân tán và tính toán song song không còn phụ thuộc vào IP hoặc Ethernet. Hiện tại, chúng ta có thể đơn giản bỏ qua chúng khi nói về hiệu suất. Tuy nhiên, vấn đề bảo vệ lại là một vấn đề khác.

Một phần của câu đố là cách truy cập các tập tin trên hệ thống máy tính. Ngày nay, đối với một hệ thống truy cập các tệp, việc các tệp cần thiết có sẵn trên một máy tính hay chúng nằm trên một số máy tính vì một lý do nào đó là điều không quan trọng. Hiện tại, ngữ nghĩa hệ thống tệp và cấu trúc dữ liệu hệ thống tệp là hai chủ đề rất khác nhau. Ngữ nghĩa của hệ thống tệp Gói 9 hoặc hệ thống tệp phân tán kiểu AFS (Hệ thống tệp Andrew) ẩn cách tổ chức tệp hoặc cách hệ thống tệp được ánh xạ tới phần cứng và mạng. NFS không nhất thiết phải ẩn cách các tệp và thư mục được lưu trữ trên các hệ thống tệp từ xa, nhưng nó cũng không tiết lộ cách lưu trữ các hệ thống tệp, thư mục và tệp thực tế bằng phần cứng.

NFS: Giải quyết vấn đề UNIX

Tuy nhiên, việc truy cập một hệ thống tệp phân tán chỉ cần một vài lệnh để cho phép người dùng gắn một thư mục nằm trên một máy tính khác trên mạng. Sun Microsystems đã gặp phải vấn đề này vài năm trước khi họ bắt đầu phân phối một thứ gọi là Cuộc gọi thủ tục từ xa(RPC) và NFS.

Vấn đề chính mà Sun đang cố gắng giải quyết là cách kết nối nhiều máy tính UNIX để tạo ra một môi trường làm việc phân tán duy nhất mà không cần phải viết lại ngữ nghĩa của hệ thống tệp UNIX và thêm quá nhiều cấu trúc dữ liệu dành riêng cho các hệ thống tệp phân tán - tính toàn vẹn của mỗi hệ thống phải được bảo toàn, đồng thời cho phép người dùng làm việc với danh mục trên một máy tính khác mà không gây ra sự chậm trễ hoặc hạn chế không mong muốn trong quy trình làm việc của họ.

Tất nhiên, NFS không chỉ cung cấp quyền truy cập vào các tệp văn bản. Bạn cũng có thể phân phối các ứng dụng "đang chạy" qua NFS. Các quy trình bảo mật được sử dụng để bảo vệ mạng khỏi sự can thiệp độc hại của các tệp thực thi. Nhưng chính xác thì điều này xảy ra như thế nào?

NFS là RPC

NFS được định nghĩa theo truyền thống là một ứng dụng RPC yêu cầu TCP cho máy chủ NFS và TCP hoặc giao thức thân thiện với mạng khác cho máy khách NFS. Lực lượng đặc nhiệm kỹ thuật Internet (IETF) đã xuất bản Yêu cầu nhận xét (RFC) cho RPC trong RFC 1832. Một tiêu chuẩn quan trọng khác đối với chức năng triển khai NFS mô tả các định dạng dữ liệu được NFS sử dụng; nó được xuất bản trong RFC 1831 dưới dạng tài liệu "Trình bày dữ liệu bên ngoài" (XDR).

Các RFC khác xử lý các thuật toán bảo mật và mã hóa được sử dụng để trao đổi thông tin xác thực trong các phiên NFS, nhưng trước tiên chúng tôi sẽ đề cập đến các cơ chế cơ bản. Một trong những giao thức mà chúng tôi quan tâm là Giao thức gắn kết, được mô tả trong Phụ lục 1 của RFC 1813.

RFC này mô tả những giao thức nào cho phép NFS hoạt động, nhưng nó không mô tả cách thức hoạt động của NFS trong Hiện nay. Bạn đã học được một điều quan trọng, cụ thể là các giao thức NFS được ghi lại dưới dạng tiêu chuẩn IETF. Sau khi phiên bản mới nhất của NFS bị đình trệ ở mức 3, các giao thức RPC đã không phát triển vượt ra ngoài giai đoạn thông tin RFC và phần lớn được coi là nằm trong lợi ích của nhóm làm việc kỹ thuật khổng lồ (được cho là) ​​của Sun Microsystems và các phiên bản độc quyền của UNIX. Từ năm 1985, Sun đã phát hành một số phiên bản NFS, phiên bản này có trước hầu hết các hệ thống tệp hiện đại vài năm. Sun Microsystems đã chuyển quyền kiểm soát NFS cho IETF vào năm 1998 và hầu hết công việc trên NSF phiên bản 4 (NFSv4) được thực hiện dưới sự bảo trợ của IETF.

Nghĩa là, khi bạn làm việc với RPC và NFS ngày nay, bạn đang làm việc với một phiên bản phản ánh lợi ích của các công ty và nhóm bên ngoài Sun. Tuy nhiên, nhiều kỹ sư của Sun vẫn quan tâm sâu sắc đến việc phát triển NFS.

NFS phiên bản 3

NFS hiện thân là phiên bản 3 (NFSv3) không giữ lại trạng thái của nó (không có trạng thái), nhưng NFSv4 thì có. Biểu hiện cơ bản này hầu như không làm ai ngạc nhiên ngày nay, mặc dù thế giới TCP/IP mà NFS được xây dựng trên đó phần lớn là không trạng thái - một thực tế giúp các công ty phần mềm bảo mật và phân tích lưu lượng cảm thấy khá tốt.

Giao thức NFSv3 phải dựa vào một số giao thức bổ sung để gắn kết các thư mục trên các máy tính từ xa một cách trong suốt, để không phụ thuộc vào cơ chế hệ thống tệp được sử dụng trên chúng. NFS không phải lúc nào cũng thành công trong việc này. Một ví dụ điển hình là giao thức Mount gọi ID tệp ban đầu, trong khi giao thức Network Lock Manager đảm nhiệm việc khóa tệp. Cả hai hoạt động đều cần trạng thái hiện tại mà NFSv3 không cung cấp. Do đó, có những tương tác phức tạp giữa các lớp giao thức không phản ánh các cơ chế luồng dữ liệu tương tự. Ngoài ra, khi bạn thêm một thực tế là việc tạo tệp và thư mục trong Microsoft® Windows® được thực hiện hoàn toàn khác so với trong UNIX, tình hình càng trở nên phức tạp hơn.

Giao thức NFSv3 được yêu cầu sử dụng các cổng để cung cấp một số giao thức hỗ trợ của nó; điều này tạo ra một bức tranh khá phức tạp về các cổng, cấp độ giao thức và các vấn đề bảo mật đi kèm với tất cả. Ngày nay, mô hình hoạt động này đã bị loại bỏ và tất cả các hoạt động trước đây được thực hiện bằng cách triển khai giao thức phụ trợ thông qua các cổng riêng lẻ đều được quản lý bởi giao thức NFSv4 thông qua một cổng phổ biến duy nhất.

Giao thức NFSv3 cũng sẵn sàng hoạt động với các hệ thống tệp nhận biết Unicode, một lợi thế vẫn còn mang tính lý thuyết cho đến cuối những năm 1990. Nó rất phù hợp với ngữ nghĩa của hệ thống tệp UNIX và là lý do tạo ra các triển khai hệ thống tệp cạnh tranh như AFS và Samba. Không có gì đáng ngạc nhiên khi khả năng hỗ trợ của Windows rất kém, nhưng các máy chủ tệp Samba đã cung cấp tính năng chia sẻ tệp cho các hệ thống UNIX và Windows.

NFS phiên bản 4

Giao thức NFSv4, như chúng tôi đã lưu ý, là một giao thức có trạng thái. Một số thay đổi căn bản đã làm cho hành vi này có thể thực hiện được. Chúng tôi đã đề cập rằng các giao thức phụ trợ phải được gọi vì các quy trình cấp người dùng đã bị loại bỏ. Thay vào đó, tất cả các thao tác mở tệp và khá nhiều lệnh gọi RPC đã được triển khai dưới dạng các thao tác hệ thống tệp cấp hạt nhân.

Tất cả các phiên bản NFS đã xác định từng đơn vị công việc theo hoạt động của máy khách và máy chủ RPC. Mỗi yêu cầu NFSv3 yêu cầu một số lượng khá đáng kể các lệnh gọi RPC và các lệnh gọi cổng mở để tạo ra kết quả. Phiên bản 4 đã đơn giản hóa điều này bằng cách giới thiệu khái niệm về cái gọi là hỗn hợp(phức hợp) hoạt động, bao gồm một số lượng lớn các hoạt động trên các đối tượng hệ thống tệp. Tất nhiên, tác động trực tiếp là có ít cuộc gọi RPC hơn đáng kể và ít dữ liệu cần truyền qua mạng hơn, mặc dù về cơ bản mỗi cuộc gọi RPC mang nhiều dữ liệu hơn, thực hiện nhiều công việc hơn đáng kể. Người ta ước tính rằng các cuộc gọi RPC trong NFSv3 yêu cầu số lượng tương tác máy khách-máy chủ gấp năm lần so với các quy trình RPC phức hợp.

RPC thực sự không còn có tầm quan trọng đó nữa và về cơ bản đóng vai trò như một trình bao bọc cho một số hoạt động được gói gọn trong ngăn xếp NFSv4. Thay đổi này cũng làm cho ngăn xếp giao thức ít phụ thuộc hơn nhiều vào ngữ nghĩa của hệ thống tệp được sử dụng. Nhưng điều này không có nghĩa là các hoạt động hệ thống tệp của các hệ điều hành khác bị bỏ qua: ví dụ: việc chia sẻ tài nguyên Windows yêu cầu tính bền vững trạng thái giữa các lệnh gọi để mở một tài nguyên. Tính bền vững trạng thái không chỉ giúp phân tích lưu lượng dễ dàng hơn mà khi được triển khai ở cấp độ ngữ nghĩa của hệ thống tệp, nó giúp kiểm soát các hoạt động của hệ thống tệp dễ dàng hơn nhiều. Lệnh gọi mở tài nguyên trạng thái cho phép máy khách lưu vào bộ nhớ đệm dữ liệu và trạng thái của tệp - điều này lẽ ra sẽ xảy ra trên máy chủ. Trong thực tế (nơi các máy khách Windows có mặt ở khắp mọi nơi), việc làm cho máy chủ NFS hoạt động minh bạch và thống nhất với các tài nguyên được chia sẻ của Windows rất đáng để bạn dành thời gian thiết lập cấu hình NFS.

Sử dụng NFS

Việc cài đặt NFS nhìn chung cũng tương tự như cài đặt Samba. Về phía máy chủ, bạn xác định hệ thống tập tin hoặc thư mục để xuất hoặc chia sẻ; phía khách hàng gắn kết các thư mục này. Khi máy khách từ xa gắn thư mục NFS, thư mục đó sẽ có thể truy cập được giống như bất kỳ thư mục nào khác trên hệ thống tệp cục bộ. Thiết lập NFS trên máy chủ là một quá trình đơn giản. Tối thiểu, bạn nên tạo hoặc chỉnh sửa tệp /etc/exports và khởi động trình nền NFS. Để định cấu hình dịch vụ NFS an toàn hơn, bạn cũng nên chỉnh sửa các tệp /etc/hosts.allow và /etc/hosts.deny. Máy khách NFS chỉ yêu cầu lệnh mount. Thông tin và tùy chọn bổ sung được mô tả trong tài liệu trực tuyến Linux® (trang hướng dẫn).

máy chủ NFS

Các mục trong tệp /etc/exports có định dạng rõ ràng. Để chia sẻ hệ thống tệp, hãy chỉnh sửa tệp /etc/exports và mô tả hệ thống tệp (có tham số) theo định dạng chung sau:

thư mục (hoặc hệ thống tệp) client1 (option1, option2) client2 (option1, option2)

Thông số chung

Có một số tùy chọn chung có sẵn để định cấu hình triển khai NFS của bạn. Bao gồm các:

  • chắc chắn: Tùy chọn này (mặc định) sử dụng cổng TCP/IP có sẵn nhỏ hơn 1024 cho kết nối NFS. Việc chỉ định không an toàn sẽ vô hiệu hóa điều này.
  • ồ: Cài đặt này cho phép máy khách NFS truy cập đọc/ghi. Quyền truy cập mặc định là chỉ đọc.
  • không đồng bộ: Tùy chọn này có thể cải thiện hiệu suất nhưng cũng có thể gây mất dữ liệu nếu bạn khởi động lại máy chủ NFS mà không dừng trình nền NFS trước. Cài đặt mặc định là đồng bộ hóa.
  • không_wdelay: Tùy chọn này vô hiệu hóa độ trễ ghi. Nếu chế độ không đồng bộ được đặt, NFS sẽ bỏ qua cài đặt này.
  • không ẩn: Nếu bạn gắn một thư mục lên trên một thư mục khác, thư mục cũ thường bị ẩn hoặc trống. Để ngăn chặn hành vi này, hãy bật tham số ẩn.
  • no_subtree_check: Tùy chọn này vô hiệu hóa tính năng giám sát thư mục con được thực hiện đối với một số kiểm tra bảo mật mà bạn có thể không muốn bỏ qua. Cài đặt mặc định là cho phép kiểm soát thư mục con.
  • không_auth_nlm: Tham số này, khi được đặt thành insecure_locks, sẽ hướng dẫn trình nền NFS không thực hiện xác thực trong các yêu cầu khóa. Cài đặt mặc định là auth_nlm hoặc safe_locks.
  • mp (điểm gắn kết=đường dẫn): Khi tùy chọn này được khai báo rõ ràng, NSF yêu cầu gắn kết thư mục đã xuất.
  • fsid=num: Tùy chọn này thường được sử dụng khi thiết lập hệ thống khôi phục sau lỗi NFS. Nếu bạn muốn triển khai khôi phục sự cố cho NFS, vui lòng tham khảo tài liệu NFS.

Ánh xạ người dùng

Thông qua ánh xạ người dùng NFS, bạn có thể xác định người dùng giả hoặc người dùng thực và nhóm với người dùng đang chạy ổ đĩa NFS. Người dùng NFS có các quyền của người dùng hoặc nhóm mà ánh xạ cho phép. Việc sử dụng một người dùng và nhóm duy nhất (chung) cho các khối NFS sẽ mang lại mức độ bảo mật và tính linh hoạt mà không cần nỗ lực quản trị đáng kể.

Khi sử dụng các tệp trên hệ thống tệp gắn trên NFS, quyền truy cập của người dùng thường bị hạn chế. Điều này có nghĩa là người dùng truy cập các tệp với tư cách là người dùng ẩn danh có quyền truy cập chỉ đọc vào các tệp đó. Hành vi này đặc biệt quan trọng đối với người dùng root. Tuy nhiên, có những trường hợp bạn muốn người dùng truy cập các tệp trên hệ thống từ xa bằng quyền root hoặc một số người dùng cụ thể khác. NFS cho phép bạn chỉ định một người dùng (theo số nhận dạng người dùng (UID) và số nhận dạng nhóm (GID)) để truy cập các tệp từ xa và bạn có thể ngăn chặn hành vi "ngăn chặn" mặc định thông thường.

Các tùy chọn hiển thị của người dùng bao gồm:

  • root_squash: Tùy chọn này ngăn người dùng root truy cập vào ổ đĩa NFS được gắn.
  • no_root_squash: Tùy chọn này cho phép người dùng root truy cập vào ổ đĩa NFS được gắn.
  • all_squash: Tùy chọn này, hữu ích cho các khối NFS công khai, loại bỏ tất cả UID và GID và chỉ sử dụng tài khoản người dùng ẩn danh. Cài đặt mặc định là no_all_squash.
  • anonuid và anongid: Các cài đặt này thay đổi UID và GID của người dùng ẩn danh thành tài khoản được chỉ định.

Liệt kê 1 cho thấy các ví dụ về các mục nhập /etc/exports.

Liệt kê 1. Ví dụ về các mục /etc/exports
/opt/files 192.168.0.* /opt/files 192.168.0.120 /opt/files 192.168.0.125(rw, all_squash, anonuid=210, anongid=100) /opt/files *(ro, insecure, all_squash)

Mục đầu tiên xuất thư mục /opt/files cho tất cả các máy chủ trên mạng 192.168.0. Mục sau xuất /opt/files cho một máy chủ: 192.168.0.120. Mục thứ ba chỉ định máy chủ 192.168.0.125 và cấp quyền truy cập đọc/ghi vào các tệp có quyền người dùng có người dùng id=210 và nhóm id=100 . Mục cuối cùng được sử dụng cho thư mục chung và cho phép truy cập chỉ đọc và chỉ dưới tài khoản người dùng ẩn danh.

Máy khách NFS

Cảnh báo

Khi bạn sử dụng NFS để gắn hệ thống tệp từ xa, nó cũng sẽ là một phần của mọi hoạt động sao lưu hệ thống dùng chung mà bạn thực hiện trên máy khách. Hành vi này có thể gây ra những kết quả có hại nếu bạn không loại trừ các thư mục được gắn khi tạo bản sao lưu.

Để sử dụng NFS làm máy khách, rpc.statd và portmap phải chạy trên máy khách. Bạn có thể chạy ps -ef để kiểm tra sự hiện diện của hai daemon này. Nếu chúng hoạt động (nếu cần), bạn có thể gắn thư mục đã xuất của máy chủ bằng lệnh chung sau:

mount server: điểm gắn kết cục bộ của thư mục

Nói chung, bạn nên chạy bằng root khi gắn hệ thống tập tin. Trên máy tính từ xa, bạn có thể sử dụng lệnh sau (giả sử máy chủ NFS có địa chỉ IP là 192.168.0.100):

gắn kết 192.168.0.100:/opt/files/mnt

Bản phân phối hệ thống của bạn có thể yêu cầu bạn chỉ định loại hệ thống tệp khi gắn nó. Nếu vậy, hãy sử dụng lệnh:

mount -t nfs 192.168.0.100:/opt/files /mnt

Thư mục từ xa sẽ được gắn kết mà không gặp vấn đề gì nếu bạn đã cấu hình máy chủ đúng cách. Bây giờ hãy chạy lệnh cd để thay đổi thư mục /mnt, sau đó chạy lệnh ls để xem các tệp. Để gắn kết này vĩnh viễn, bạn phải chỉnh sửa tệp /etc/fstab và tạo một mục tương tự như sau:

192.168.0.100:/opt/files /mnt nfs rw 0 0

Ghi chú:Để biết thêm thông tin về các mục /etc/fstab, hãy xem trợ giúp trực tuyến của fstab.

Chỉ trích NFS

Sự phê bình dẫn đến sự cải thiện

Những lời chỉ trích liên quan đến tính bảo mật của NFS là nguyên nhân dẫn đến nhiều cải tiến trong NSFv4. Những người tạo ra phiên bản mới đã thực hiện các biện pháp thực tế để tăng cường tính bảo mật cho các tương tác giữa máy khách và máy chủ. Trên thực tế, họ đã quyết định triển khai một mô hình hệ thống an ninh hoàn toàn mới.

Để hiểu mô hình hệ thống bảo mật, bạn nên làm quen với giao diện lập trình ứng dụng Dịch vụ bảo mật chung (GSS-API) phiên bản 2, bản sửa đổi 1. GSS-API được mô tả đầy đủ trong RFC 2743, thật không may, đây lại là một trong những tài liệu RFC khó hiểu nhất.

Từ kinh nghiệm của chúng tôi với NFSv4, chúng tôi biết rằng việc tạo một hệ thống tệp mạng độc lập với hệ điều hành không phải là điều dễ dàng. Nhưng việc làm cho tất cả các lĩnh vực của hệ thống bảo mật trở nên độc lập với hệ điều hành và các giao thức mạng thậm chí còn khó khăn hơn. Chúng ta cần cả hai, vì NFS phải có khả năng xử lý một số lượng khá lớn các hoạt động của người dùng và làm như vậy mà không cần xử lý các chi tiết cụ thể về giao tiếp giao thức mạng.

Các kết nối giữa máy khách và máy chủ NFS được bảo vệ bằng hệ thống bảo mật được gọi là (khá hời hợt) mạnh RPC. NFSv4 sử dụng tiêu chuẩn Cuộc gọi thủ tục từ xa điện toán mạng mở (ONCRPC) được xác định trong RFC 1831. Hệ thống bảo mật phải được tăng cường, do đó, thay vì xác thực đơn giản (được gọi là AUTH_SYS) là một phần bắt buộc của giao thức NFSv4, một loại hệ thống bảo mật dựa trên GSS-API được gọi là RPCSEC_GSS. Các cơ chế bảo mật quan trọng nhất có sẵn trong NFSv4 bao gồm Kerberos phiên bản 5 và LIPKEY.

Trong khi Kerberos có những hạn chế khi sử dụng qua Internet, LIPKEY có lợi thế lớn là hoạt động giống như Lớp cổng bảo mật (SSL), nó nhắc người dùng nhập tên người dùng và mật khẩu của họ đồng thời tránh sự phụ thuộc của TCP vào SSL, một sự phụ thuộc mà NFSv4 không chia sẻ. Bạn có thể định cấu hình NFS để triển khai các biến thể bảo mật nếu không cần RPCSEC_GSS. Các phiên bản trước của NFS không có khả năng này và do đó không thể cung cấp khả năng bảo mật mạnh mẽ, tính toàn vẹn dữ liệu, yêu cầu xác thực hoặc loại mã hóa.

Giao thức NFSv3 đã nhận được nhiều lời chỉ trích về bảo mật. Nếu máy chủ NFSv3 chạy trên TCP thì hoàn toàn có thể chạy mạng NFSv3 qua Internet. Thật không may, nó cũng yêu cầu mở nhiều cổng, dẫn đến một số lỗ hổng bảo mật được công bố rộng rãi. Bằng cách đặt cổng 2049 bắt buộc đối với NFS, người ta có thể sử dụng NFSv4 với tường lửa mà không cần phải chú ý quá nhiều đến cổng mà các giao thức khác, chẳng hạn như giao thức Mount, đang nghe. Do đó, việc loại bỏ giao thức Mount có một số tác động tích cực:

  • Yêu cầu cơ chế xác thực mạnh mẽ: NFSv4 bắt buộc phải có cơ chế xác thực mạnh mẽ. Các biến thể của Kerberos khá phổ biến. Cơ chế khóa công khai cơ sở hạ tầng thấp hơn (LIPKEY) cũng phải được hỗ trợ. NFSv3 chưa bao giờ hỗ trợ bất cứ điều gì ngoài mã hóa UNIX tiêu chuẩn để xác thực truy cập - điều này tạo ra các vấn đề bảo mật lớn trong các mạng lớn.
  • Lược đồ danh sách kiểm soát truy cập (ACL) kiểu Microsoft Windows NT bắt buộc: Mặc dù NFSv3 cho phép mã hóa mạnh để xác thực nhưng nó không sử dụng sơ đồ truy cập ACL kiểu Windows NT. ACL kiểu Giao diện Hệ điều hành Di động (POSIX) đôi khi được triển khai nhưng chưa bao giờ được chấp nhận rộng rãi. NFSv4 bắt buộc phải có các lược đồ ACL kiểu Windows NT.
  • Cơ chế hợp đồng và phong cách xác thực: NFSv4 đã giới thiệu khả năng đàm phán các cơ chế và kiểu xác thực. Trong NSFv3, không thể làm gì hơn ngoài việc xác định thủ công kiểu mã hóa nào sẽ sử dụng. Sau đó, quản trị viên hệ thống sẽ thương lượng các giao thức mã hóa và bảo mật.

NFS có còn vô địch không?

NFSv4 thay thế NFSv3 trên hầu hết các hệ thống UNIX và Linux. Là một hệ thống tệp mạng, NSFv4 có ít đối thủ cạnh tranh. Một đối thủ cạnh tranh khả thi sẽ là Common Internet File System (CIFS)/Server Message Block (SMB), vì nó có mặt trong tất cả các phiên bản của Windows và (hiện tại) Linux. AFS chưa bao giờ có nhiều ảnh hưởng thương mại; nó nhấn mạnh các yếu tố của hệ thống tệp phân tán tạo điều kiện thuận lợi cho việc di chuyển và sao chép dữ liệu.

Các phiên bản NFS sẵn sàng cho Linux được phát hành sau khi kernel đạt phiên bản 2.2, nhưng một trong những lỗi phổ biến hơn của các phiên bản kernel Linux là Linux áp dụng NFSv3 khá muộn. Trên thực tế, phải rất lâu nữa Linux mới hỗ trợ đầy đủ NSFv3. Với sự ra đời của NSFv4, khuyết điểm này nhanh chóng được loại bỏ và hỗ trợ đầy đủ cho NSFv4 không chỉ được triển khai trong Solaris, AIX và FreeBSD.

NFS hiện được coi là một công nghệ trưởng thành, có ưu điểm là an toàn và tiện lợi - hầu hết người dùng đều thấy thuận tiện khi sử dụng một lần đăng nhập an toàn duy nhất để truy cập mạng và sử dụng các khả năng của nó, ngay cả khi các tệp và ứng dụng được đặt trên các hệ thống khác nhau . Mặc dù điều này có vẻ bất lợi so với các hệ thống tệp phân tán vốn ẩn cấu trúc hệ thống với người dùng, nhưng hãy nhớ rằng nhiều ứng dụng sử dụng các tệp nằm trên các hệ điều hành khác nhau và do đó trên các máy tính khác nhau. NFS giúp bạn dễ dàng làm việc với các hệ điều hành khác nhau mà không phải lo lắng quá nhiều về ngữ nghĩa và đặc tính hiệu suất của hệ thống tệp.

Để phân phối tệp trong mạng cục bộ, có thể phân biệt các công nghệ sau (các hệ thống dựa trên Linux được xem xét):

  • Hệ thống tệp mạng (NFS) - giao thức truy cập mạng cho hệ thống tệp;
  • Các tập tin được truyền qua giao thức Shell (FISH) là một giao thức mạng sử dụng hoặc RSHđể truyền tập tin giữa các máy tính;
  • Secure SHell FileSystem (SSHFS) - ứng dụng khách hệ thống tệp để gắn thiết bị đĩa trên hệ thống từ xa, được sử dụng để tương tác với hệ thống từ xa SFTP;
  • Samba là gói phần mềm cho phép bạn truy cập ổ đĩa mạng và máy in trên nhiều hệ điều hành khác nhau thông qua giao thức SMB/CIFS;

Trong ghi chú này chúng ta sẽ nói về NFS.

NFS (Hệ thống tệp mạng) hữu ích khi bạn cần phân phối tệp/thư mục cho mọi người trên mạng. Truy cập tính minh bạch với NFS cho phép khách hàng gắn hệ thống tệp từ xa dưới dạng thư mục cục bộ và hệ thống tệp có thể thuộc nhiều loại khác nhau. Điều này có nghĩa là bất kỳ ứng dụng khách nào có thể hoạt động với tệp cục bộ cũng có thể dễ dàng hoạt động với tệp được kết nối qua NFS, mà không có bất kỳ sửa đổi nào đối với chính chương trình.

Đến lợi ích NFS có thể được quy:

  • giảm tải cho bộ xử lý;
  • hiển thị các tài nguyên được chia sẻ dưới dạng các thư mục thông thường trong hệ thống;
  • Hiện đang có sẵn NFS v4.1, đã giới thiệu một tính năng mới pNFS cho phép bạn song song hóa việc thực hiện chia sẻ tập tin. Ngoài ra còn có phần mở rộng cho NFS 2 và 3 - WebNFS, cho phép tích hợp dễ dàng hơn vào trình duyệt web và khả năng hoạt động thông qua tường lửa.

    Kế hoạch làm việc NFS giao thức.

    Cài đặt và cấu hình máy chủ NFS trên Linux

    Hãy kiểm tra xem hệ thống có hỗ trợ NFS không

    Cat /proc/filesystems | grep nfs

    Dưới Arch Linux máy chủ và máy khách nằm trong cùng một gói

    Yaourt -S nfs-utils

    Để cài đặt máy chủ ( nfs-kernel-server) và khách hàng ( nfs-chung) dưới Ubuntu gói cần thiết

    Sudo apt-get cài đặt nfs-kernel-server nfs-common portmap

    Hơn nữa trong lưu ý này, IP sẽ được sử dụng cho máy chủ 192.168.1.100 . Để luôn gán cùng một IP cho máy chủ, cần phải chỉ định trong máy chủ DHCP (thường là bộ định tuyến) việc phân phối một IP cụ thể đến một địa chỉ MAC cụ thể. Hoặc nâng cao máy chủ DNS cục bộ của bạn. Ví dụ hoặc.

    Địa chỉ MAC có thể được tìm thấy bằng cách sử dụng ifconfig (field ether V. Arch Linux).

    NFSv4 giả định rằng có một thư mục gốc, bên trong đã chứa các tệp để phân phối. Ví dụ, /srv/nfs- nguồn gốc, /srv/nfs/âm thanh- thư mục để phân phối âm nhạc. Nếu bạn không làm theo hướng dẫn mới này trong phiên bản 4 , thì bạn có thể gặp lỗi khi kết nối bằng máy khách:

    Mount.nfs: quyền truy cập bị máy chủ từ chối trong khi cài đặt 192.168.1.100:/home/proft/torrents

    Nếu bạn vẫn muốn sử dụng phương pháp trên máy chủ mà không có thư mục gốc cho NFS, thì khi gắn bởi máy khách, bạn phải chỉ định rõ ràng phiên bản 3

    # cho lệnh mount mount -o "vers=3" 192.168.1.100:/home/proft/torrents /home/proft/nfs/torrents # for fstab 192.168.1.100:/home/proft/torrents /home/proft/nfs / torrent nfs soft,nfsvers=3 0 0

    tôi sẽ sử dụng NFSv4 với thư mục gốc trong /srv/nfs/ và gắn các thư mục con bằng cách sử dụng mount --bind .

    Giả sử chúng ta muốn

    • thư mục phân phối ~/torrent Với rw truy cập cho mọi người trong mạng cục bộ;
    • thư mục phân phối ~/ảnh Với ro quyền truy cập cho máy chủ có IP 192.168.1.101 ;

    Đầu tiên, hãy tạo một thư mục gốc và các thư mục con cần thiết.

    Sudo mkdir -p /srv/nfs/(torrents,photos)

    Gắn kết các thư mục hiện có torrent, hình ảnh V. /srv/nfs.

    # sudo vim /etc/fstab /home/proft/torrents /srv/nfs/torrents không liên kết 0 0 /home/proft/photos /srv/nfs/photos không liên kết 0 0

    Hãy chỉnh sửa /etc/xuất khẩu, mô tả tất cả các thư mục được chia sẻ

    # sudo vim /etc/exports # định dạng tệp: thư mục allow-hosts(options) /srv/nfs/torrents 192.168.1.1/24(rw,async) /srv/nfs/photos 192.168.1.101(ro,async)

    Lưu ý rằng không có khoảng cách giữa máy chủ được phép(tùy chọn). Sự hiện diện của một không gian đưa ra một cách giải thích khác về các quy tắc.

    Tùy chọn có sẵn:

    • ro (rw) - cho phép truy cập chỉ đọc (đọc/ghi);
    • subtree_check (no_subtree_check) - trong một số trường hợp, không cần xuất toàn bộ phần mà chỉ một phần của phần đó. Trong trường hợp này, máy chủ NFS phải thực hiện kiểm tra bổ sung đối với các yêu cầu của máy khách để đảm bảo rằng chúng chỉ đang cố gắng truy cập các tệp nằm trong thư mục con thích hợp. Điều khiển cây con này ( kiểm tra cây con) phần nào làm chậm quá trình tương tác với khách hàng, tuy nhiên nếu bạn từ chối có thể gây ra vấn đề về bảo mật hệ thống. Bạn có thể hủy bỏ quyền kiểm soát cây con bằng cách sử dụng tùy chọn no_subtree_check. Lựa chọn cây con_check, bao gồm quyền kiểm soát như vậy, được giả định theo mặc định. Việc kiểm tra cây con có thể được bỏ qua nếu thư mục được xuất giống với phân vùng đĩa;
    • đồng bộ hóa (async) - chỉ định rằng máy chủ chỉ phản hồi các yêu cầu sau khi những thay đổi được thực hiện bởi các yêu cầu đó đã được ghi vào đĩa. Lựa chọn không đồng bộ yêu cầu máy chủ không đợi thông tin được ghi vào đĩa, điều này cải thiện hiệu suất nhưng làm giảm độ tin cậy, bởi vì trong trường hợp có lỗi kết nối hoặc lỗi thiết bị, có thể xảy ra mất dữ liệu;
    • noaccess - từ chối quyền truy cập vào thư mục được chỉ định. Nó có thể hữu ích nếu trước đây bạn đặt quyền truy cập cho tất cả người dùng mạng vào một thư mục nhất định và bây giờ bạn muốn hạn chế quyền truy cập vào thư mục con chỉ cho một số người dùng;
    • no_root_squash – người dùng mặc định nguồn gốc trên máy khách sẽ không có quyền tương tự đối với thư mục trên máy chủ. Tùy chọn này loại bỏ hạn chế này;
    • không ẩn- NFS không tự động hiển thị các tài nguyên không cục bộ (ví dụ: được gắn bằng mount --bind), tùy chọn này cho phép hiển thị các tài nguyên đó;
    • không an toàn - sử dụng các cổng không có đặc quyền (> 1024);

    Khởi động máy chủ NFS

    # trong Archlinux sudo systemctl start rpc-idmapd.service rpc-mountd.service # trong ubuntu sudo /etc/init.d/nfs-kernel-server start

    Trong tương lai, khi thay đổi tệp cấu hình, chỉ cần đọc lại bằng lệnh:

    Xuất Sudo -rav

    Lệnh rpcinfo -p | grep nfs cho phép bạn kiểm tra xem máy chủ có khởi động thành công hay không.

    Máy khách cho Linux

    Cài đặt

    # trong Archlinux yaourt -S nfs-utils # trong ubuntu sudo apt-get install portmap nfs-common

    Hãy tạo thư mục để gắn tài nguyên mạng torrentnhững bức ảnh

    Mkdir -p ~/nfs/(torrent,ảnh)

    Để gắn thủ công, chúng tôi sẽ làm

    Sudo mount -t nfs -o rw,soft 192.168.1.100:/srv/nfs/torrents /home/proft/nfs/torrents sudo mount -t nfs -o rw,soft 192.168.1.100:/srv/nfs/photos /home /proft/nfs/ảnh

    Lựa chọn mềm mại chỉ định âm thầm hủy bỏ các nỗ lực kết nối chia sẻ sau một khoảng thời gian nhất định (thời gian được chỉ định bởi tùy chọn truyền lại). Thêm chi tiết trong người đàn ông nfs.

    Phương pháp này không thuận tiện lắm vì mỗi lần khởi động lại, bạn sẽ phải thực hiện các lệnh này. Hãy thực hiện cài đặt tự động.

    Để gắn kết tự động, hãy chỉnh sửa tập tin /etc/fstab

    # sudo vim /etc/fstab 192.168.1.100:/srv/nfs/torrents /home/proft/net/torrents nfs rw,soft 0 0 192.168.1.100:/srv/nfs/photos /home/proft/net/photos nfs ro,mềm 0 0

    Nhưng phương pháp này cũng có nhược điểm, chẳng hạn như nếu máy chủ không khả dụng, quá trình tải của máy khách có thể bị treo do cố gắng kết nối với máy chủ NFS. Để khắc phục điều này, hãy xem bên dưới về AutoFS.

    AutoFS - tự động kết nối tài nguyên mạng

    Có thể gắn kết một tài nguyên từ xa bằng cách sử dụng AutoFS khi truy cập lần đầu và tự động ngắt kết nối khi không có hoạt động.

    AutoFS sử dụng các mẫu nằm trong /etc/autofs. Mẫu chính được gọi là auto.master, nó có thể trỏ đến một hoặc nhiều mẫu khác cho các loại phương tiện cụ thể.

    Cài đặt

    # trong Archlinux yaourt -S autofs # trong ubuntu sudo apt-get install autofs

    Có một số cách để chỉ định các phương thức automount. Tôi sử dụng cái này: trong /home/proft/nfs Một thư mục được tạo tự động với tên của máy chủ NFS, trong đó các thư mục có thể truy cập trên máy chủ sẽ được tạo tự động.

    # sudo vim /etc/autofs/auto.master /home/proft/nfs /etc/autofs/auto.nfs --timeout=60

    Tham số bổ sung hết giờđặt số giây sau đó thiết bị sẽ được ngắt kết nối. Tham số bóng ma chỉ định rằng các tài nguyên được định cấu hình sẽ luôn được hiển thị và không chỉ khi chúng có sẵn (tùy chọn này được bật theo mặc định trong Tự động 5)

    Chúng tôi sẽ mô tả ở /etc/autofs/auto.nfs Máy chủ NFS và thư mục gốc.

    # sudo vim /etc/autofs/auto.nfs nfsserver 192.168.1.100:/srv/nfs

    Bây giờ trong cuộc gọi đầu tiên /home/proft/nfs/torrents Tài nguyên NFS sẽ được tự động gắn kết.

    Hãy khởi động lại dịch vụ autofs:

    # trong Archlinux sudo systemctl khởi động lại autofs # trong Ubuntu sudo /etc/init.d/autofs khởi động lại

    Bạn cũng có thể chỉ định thời gian chờ đợi để tài nguyên NFS có sẵn. Để làm điều này bạn cần thay đổi các giá trị MOUNT_WAIT.

    # trong Archlinux # sudo vim /etc/conf.d/autofs MOUNT_WAIT=5 # trong ubuntu sudo /etc/default/autofs MOUNT_WAIT=5

    Buộc sử dụng NFS v3

    Trong vài trường hợp NFSv4 có thể hoạt động chậm. Để khắc phục điều này, bạn có thể buộc nó sử dụng phiên bản thứ ba.

    Chương 29 NFS: Hệ thống tệp mạng

    Giới thiệu

    Trong chương này, chúng ta sẽ xem xét Hệ thống Tệp Mạng (NFS), một ứng dụng phổ biến cung cấp cho các ứng dụng khách quyền truy cập minh bạch vào các tệp. Nền tảng của NFS là Sun RPC: Cuộc gọi thủ tục từ xa mà chúng tôi sẽ đề cập trước tiên.

    Chương trình máy khách không yêu cầu các công cụ đặc biệt để tận dụng NFS. Hạt nhân phát hiện rằng tệp nằm trên máy chủ NFS và tự động tạo lệnh gọi RPC để truy cập tệp.

    Chúng ta sẽ không xem xét chi tiết cách triển khai truy cập tệp mà sẽ xem xét cách sử dụng các giao thức Internet, đặc biệt là UDP.

    Cuộc gọi thủ tục từ xa của Sun

    Trong hầu hết các trường hợp, các vấn đề về lập trình mạng được giải quyết bằng cách viết các chương trình ứng dụng gọi các chức năng do hệ thống cung cấp để thực hiện các hoạt động mạng cụ thể. Ví dụ: một chức năng thực hiện mở TCP hoạt động, chức năng khác thực hiện mở TCP thụ động, chức năng thứ ba gửi dữ liệu qua kết nối TCP, chức năng thứ tư đặt các tùy chọn giao thức cụ thể (cho phép bộ hẹn giờ TCP "sống sót"), v.v. Trong phần Giao diện lập trình ứng dụng của Chương 1, chúng tôi đã đề cập rằng có hai bộ chức năng lập trình mạng phổ biến (giao diện lập trình ứng dụng, API): socket và TLI. API được máy khách sử dụng và API được máy chủ sử dụng có thể khác nhau, cũng như hệ điều hành mà máy khách và máy chủ chạy. Chính các giao thức ứng dụng và giao tiếp sẽ xác định xem một máy khách cụ thể có thể giao tiếp với máy chủ hay không. Máy khách Unix được viết bằng C sử dụng ổ cắm làm giao diện lập trình và TCP làm giao thức truyền thông có thể giao tiếp với máy chủ máy tính lớn được viết bằng COBOL bằng các API và TCP khác nhau nếu cả hai máy chủ đều được kết nối với mạng và cả hai đều có triển khai TCP /IP.

    Thông thường, máy khách sẽ gửi lệnh đến máy chủ và máy chủ sẽ gửi phản hồi cho máy khách. Tất cả các ứng dụng chúng tôi đã xem xét - Ping, Traceroute, daemon định tuyến, máy khách và máy chủ DNS, TFTP, BOOTP, SNMP, Telnet, FTP, SMTP - đều được xây dựng theo cách này.

    RPC, cuộc gọi thủ tục từ xa, thực hiện một cách tiếp cận khác đối với lập trình mạng. Chương trình máy khách chỉ đơn giản gọi các hàm trong chương trình máy chủ. Vì vậy, điều này được quyết định theo quan điểm của người lập trình, nhưng trên thực tế, chuỗi hành động sau đây diễn ra.

    1. Khi một máy khách gọi một thủ tục từ xa, một chức năng trên máy chủ cục bộ được tạo ra bởi gói RPC sẽ được gọi. Chức năng này được gọi là client stub. Sơ khai máy khách đóng gói các đối số của thủ tục vào một thông báo mạng và gửi thông báo đến máy chủ.
    2. sơ khai máy chủ trên máy chủ lưu trữ nhận được tin nhắn mạng. Các đối số được lấy từ thông báo mạng và một lệnh gọi được thực hiện tới thủ tục máy chủ do người lập trình ứng dụng viết.
    3. Hàm máy chủ trả lại quyền điều khiển cho cuống máy chủ, sau đó lấy các giá trị nhận được, đóng gói chúng thành một tin nhắn mạng và gửi tin nhắn trở lại cuống máy khách.
    4. client stub trả về các giá trị từ thông báo mạng tới ứng dụng client.

    Lập trình mạng bằng cách sử dụng các quy trình sơ khai và thư viện RPC sử dụng API (socket hoặc TLI), nhưng các ứng dụng người dùng (chương trình máy khách và các thủ tục máy chủ được máy khách gọi) không bao giờ truy cập API. Ứng dụng khách chỉ cần gọi thủ tục máy chủ, trong khi tất cả các chi tiết triển khai đều bị ẩn bởi gói RPC, sơ khai máy khách và sơ khai máy chủ.

    Các gói RPC có những ưu điểm sau.

    • Việc lập trình trở nên dễ dàng hơn vì bạn không phải giải các bài toán lập trình mạng (và nếu có thì rất ít). Các lập trình viên ứng dụng chỉ cần viết chương trình máy khách và các thủ tục máy chủ mà máy khách gọi.
    • Nếu sử dụng giao thức không đáng tin cậy như UDP, tất cả các chi tiết, cụ thể là thời gian chờ và truyền lại, sẽ được xử lý bởi gói RPC. Điều này lần lượt đơn giản hóa ứng dụng của người dùng.
    • Thư viện RPC xử lý việc chuyển đổi các đối số và giá trị trả về cần thiết. Ví dụ: nếu các đối số bao gồm số nguyên và số dấu phẩy động, gói RPC sẽ xử lý mọi khác biệt giữa cách biểu diễn số nguyên và số dấu phẩy động trên máy khách và máy chủ. Điều này giúp đơn giản hóa việc triển khai máy khách và máy chủ để hoạt động trong môi trường không đồng nhất.

    Lập trình RPC được trình bày chi tiết trong Chương 18. Hai gói RPC phổ biến nhất là Sun RPC và gói RPC trong Môi trường điện toán phân tán (OSF) của Open Software Foundation (DCE). Chúng ta sẽ xem quy trình được gọi như thế nào, thông báo trả về trông như thế nào và điều này liên quan như thế nào. vào gói Sun RPC, vì gói này được sử dụng trong Sun RPC Phiên bản 2, được mô tả trong RFC 1057 [Sun Microsystems 1988a].

    Có hai loại Sun RPC. Một phiên bản được xây dựng bằng API socket và hoạt động với TCP và UDP. Cái còn lại được gọi là TI-RPC (độc lập về vận chuyển), được xây dựng bằng API TLI và hoạt động với mọi lớp vận chuyển do kernel cung cấp. Theo quan điểm của chúng tôi, không có sự khác biệt giữa chúng vì trong chương này chúng tôi chỉ xem xét TCP và UDP.

    Hình 29.1 cho thấy định dạng của một thông báo gọi thủ tục RPC sử dụng UDP.

    Hình 29.1 Các thông báo gọi thủ tục RPC ở định dạng datagram UDP.

    Các tiêu đề IP và UDP tiêu chuẩn được hiển thị trước đó (Hình 3.1 và Hình 11.2). Mọi thứ theo sau tiêu đề UDP được xác định bởi gói RPC.

    Mã định danh giao dịch (XID - ID giao dịch) được khách hàng đặt và được máy chủ trả về. Khi máy khách nhận được phản hồi, nó sẽ so sánh XID được máy chủ trả về với XID của yêu cầu được gửi. Nếu chúng không khớp, khách hàng sẽ loại bỏ tin nhắn và đợi tin nhắn tiếp theo đến. Mỗi lần máy khách phát hành một RPC mới, nó sẽ thay đổi XID. Tuy nhiên, nếu máy khách truyền lại RPC (nếu không nhận được phản hồi) thì XID sẽ không thay đổi.

    Biến cuộc gọi là 0 cho cuộc gọi và 1 cho phản hồi. Phiên bản RPC hiện tại là 2. Ba biến tiếp theo, số chương trình, số phiên bản và số thủ tục, xác định thủ tục cụ thể sẽ được gọi trên máy chủ.

    Thông tin xác thực xác định khách hàng. Trong một số ví dụ, trường này được để trống, trong khi ở những trường khác, bạn có thể thấy mã định danh kỹ thuật số của người dùng và mã định danh nhóm mà người đó thuộc về. Máy chủ có thể xem xét thông tin xác thực và quyết định có xử lý yêu cầu hay không. Trình xác minh được sử dụng cho RPC an toàn, sử dụng mã hóa DES. Mặc dù các trường thẩm quyền và xác thực là các trường có độ dài thay đổi nhưng độ dài của chúng vẫn được chuyển như một phần của trường.

    Tiếp theo là các tham số thủ tục. Định dạng của chúng phụ thuộc vào cách ứng dụng xác định thủ tục từ xa. Làm thế nào để người nhận (sơ khai máy chủ) biết kích thước của các tham số? Vì UDP được sử dụng nên kích thước của các tham số có thể được tính bằng kích thước của gói dữ liệu UDP trừ đi độ dài của tất cả các trường cho đến trường kiểm tra. Khi TCP được sử dụng thay cho UDP, không có khái niệm về độ dài cố định, vì TCP là một luồng byte không có dấu phân cách bản ghi. Trong trường hợp như vậy, trường có độ dài 4 byte xuất hiện giữa tiêu đề TCP và XID, từ đó người nhận biết được độ dài của lệnh gọi RPC tính bằng byte. Điều này cho phép tin nhắn cuộc gọi RPC được gửi qua nhiều phân đoạn TCP nếu cần thiết. (DNS sử dụng kỹ thuật tương tự; Bài tập 4 trong Chương 14.)

    Hình 29.2 thể hiện định dạng phản hồi RPC. Nó được gửi từ sơ khai máy chủ đến sơ khai máy khách khi thủ tục từ xa thoát.

    Hình 29.2 Định dạng thông báo phản hồi thủ tục RPC dưới dạng datagram UDP.

    XID cuộc gọi chỉ được sao chép vào XID phản hồi. Trường trả lời chứa 1, trường này phân biệt giữa thách thức và phản hồi. Trường trạng thái chứa giá trị null nếu tin nhắn cuộc gọi đã được chấp nhận. (Thông báo có thể bị loại bỏ nếu số phiên bản RPC không phải là 2 hoặc nếu máy chủ không thể xác thực ứng dụng khách.) Trường xác minh được sử dụng trong trường hợp RPC an toàn để chỉ ra máy chủ.

    Trường trạng thái chấp nhận chứa giá trị 0 nếu mọi thứ đều ổn. Ví dụ, giá trị khác 0 có thể chỉ ra số phiên bản không chính xác hoặc số quy trình không chính xác. Nếu TCP được sử dụng thay vì UDP thì giống như với thông báo thách thức RPC, trường có độ dài 4 byte sẽ được gửi giữa tiêu đề TCP và XID.

    XDR: Biểu diễn dữ liệu ngoài

    Biểu diễn dữ liệu ngoài (XDR) là một tiêu chuẩn được sử dụng để mã hóa các giá trị trong tin nhắn phản hồi và cuộc gọi RPC - các trường tiêu đề RPC (XID, số chương trình, trạng thái nhận, v.v.), tham số thủ tục và kết quả thủ tục. Cách mã hóa dữ liệu tiêu chuẩn cho phép khách hàng gọi một thủ tục trên một hệ thống có kiến ​​trúc khác. XDR được định nghĩa trong RFC 1014 [Sun Microsystems 1987].

    XDR xác định một số loại dữ liệu nhất định và cách chúng được truyền tải chính xác trong thông báo RPC (thứ tự bit, thứ tự byte, v.v.). Người gửi phải xây dựng tin nhắn RPC ở định dạng XDR, sau đó người nhận chuyển đổi định dạng XDR thành dạng biểu diễn ban đầu. (Ở định dạng được chấp nhận cho hệ thống của anh ấy.) Ví dụ: chúng tôi thấy trong Hình 29.1 và 29.2, rằng tất cả các giá trị số nguyên mà chúng tôi đã hiển thị (XID, cuộc gọi, số chương trình, v.v.) là số nguyên 4 byte . Thật vậy, tất cả các số nguyên trong XDR đều chiếm 4 byte. XDR hỗ trợ các loại dữ liệu khác, bao gồm số nguyên không dấu, boolean, dấu phẩy động, mảng có độ dài cố định, mảng có độ dài thay đổi và cấu trúc.

    Tuân thủ cổng

    Các chương trình máy chủ RPC chứa các thủ tục từ xa sử dụng các cổng được gán động thay vì các cổng đã biết trước. Điều này yêu cầu một số hình thức "ghi nhật ký" để luôn biết cổng được gán động nào đang được chương trình RPC nào sử dụng. Trong Sun RPC, trình ghi nhật ký này được gọi là trình ánh xạ cổng. (Trình ánh xạ cổng là máy chủ chuyển đổi số chương trình RPC thành số cổng giao thức DARPA. Máy chủ này phải đang chạy để thực hiện cuộc gọi RPC.)

    Thuật ngữ "cổng" trong tên xuất phát từ số cổng TCP và UDP, đặc điểm của họ giao thức Internet. Vì TI-RPC chạy trên bất kỳ lớp truyền tải nào, không chỉ TCP và UDP, nên trình ánh xạ cổng tên trên các hệ thống sử dụng TI-RPC (ví dụ: SVR4 và Solaris 2.2) đã được chuyển đổi thành rpcbind. Tuy nhiên, chúng tôi sẽ tiếp tục sử dụng trình ánh xạ cổng quen thuộc hơn.

    Trên thực tế, bản thân trình phân giải cổng phải có một cổng đã biết: cổng UDP 111 và cổng TCP 111. Trình phân giải cổng chỉ là một chương trình máy chủ RPC. Nó có số chương trình (100000), số phiên bản (2), cổng TCP 111 và cổng UDP 111. Các máy chủ đăng ký lẫn nhau với trình phân giải cổng bằng các lệnh gọi RPC và các máy khách yêu cầu trình phân giải cổng bằng các lệnh gọi RPC. Trình phân giải cổng cung cấp bốn thủ tục máy chủ:

    1. PMAPPROC_SET. Được máy chủ RPC gọi khi khởi động để đăng ký số chương trình, số phiên bản và giao thức với trình phân giải cổng.
    2. PMAPPROC_UNSET. Được máy chủ gọi để xóa chuyển đổi đã đăng ký trước đó.
    3. PMAPPROC_GETPORT. Được máy khách RPC gọi khi khởi động để lấy số cổng cho số chương trình, số phiên bản và giao thức đã cho.
    4. PMAPPROC_DUMP. Trả về tất cả các mục (số chương trình, số phiên bản, giao thức và số cổng) cho cơ sở dữ liệu trình phân giải cổng.

    Khi chương trình máy chủ RPC khởi động và sau đó khi nó được chương trình máy khách RPC gọi, các bước sau đây sẽ xảy ra.

    1. Bộ chuyển đổi cổng sẽ khởi động trước, thường là khi hệ thống khởi động. Điều này tạo ra một điểm cuối TCP và mở cổng TCP 111 một cách thụ động. Nó cũng tạo ra một điểm cuối UDP chờ gói dữ liệu UDP đến trên cổng UDP 111.
    2. Khi chương trình máy chủ RPC khởi động, nó sẽ tạo điểm cuối TCP và điểm cuối UDP cho từng phiên bản chương trình được hỗ trợ. (Một chương trình RPC có thể hỗ trợ nhiều phiên bản. Máy khách chỉ định phiên bản được yêu cầu khi gọi thủ tục máy chủ.) Số cổng được gán động được gán cho mỗi điểm cuối. (Không có sự khác biệt dù số cổng TCP và UDP giống hay khác nhau.) Máy chủ đăng ký từng chương trình, phiên bản, giao thức và số cổng bằng cách thực hiện lệnh gọi từ xa đến quy trình phân giải cổng PMAPPROC_SET.
    3. Khi chương trình máy khách RPC khởi động, nó gọi thủ tục phân giải cổng PMAPPROC_GETPORT để lấy số cổng được gán động cho chương trình, phiên bản và giao thức đã chỉ định.
    4. Máy khách gửi thông báo thách thức RPC tới số cổng thu được ở bước 3. Nếu sử dụng UDP, máy khách chỉ cần gửi một gói dữ liệu UDP chứa thông báo thách thức RPC (Hình 29.1) tới số cổng UDP của máy chủ. Để đáp lại, máy chủ sẽ gửi một gói dữ liệu UDP chứa thông báo phản hồi RPC (Hình 29.2). Nếu TCP được sử dụng, máy khách sẽ thực hiện mở hoạt động đối với số cổng TCP của máy chủ và sau đó gửi thông báo thử thách RPC qua kết nối. Máy chủ phản hồi bằng thông báo phản hồi RPC trên kết nối.

    Chương trình rpcinfo(8) in tất cả các cài đặt trình ánh xạ cổng hiện tại. (Đây là nơi quy trình ánh xạ cổng PMAPPROC_DUMP được gọi.) Đầu ra điển hình được hiển thị bên dưới:

    Mặt trời % /usr/etc/rpcinfo -p
    chương trình so với cổng proto
    100005 1 tcp 702 được gắn kết NFS daemon
    100005 1 udp 699 gắn kết
    100005 2 tcp 702 gắn kết
    100005 2 udp 699 gắn kết

    100003 2 udp 2049 nfs Bản thân NFS

    100021 1 tcp 709 nlockmgr Trình quản lý khóa NFS
    100021 1 udp 1036 nlockmgr
    100021 2 tcp 721 nlockmgr
    100021 2 udp 1039 nlockmgr
    100021 3 tcp 713 nlockmgr
    100021 3 udp 1037 nlockmgr

    Chúng tôi thấy rằng một số chương trình hỗ trợ nhiều phiên bản và mỗi sự kết hợp giữa số chương trình, số phiên bản và giao thức đều có bố cục số cổng riêng, do trình phân giải cổng cung cấp.

    Cả hai phiên bản của trình nền gắn kết đều có thể được truy cập thông qua cùng số cổng TCP (702) và cùng số cổng UDP (699), tuy nhiên mỗi phiên bản của trình quản lý chặn có số cổng riêng.

    Giao thức NFS

    NFS cung cấp cho khách hàng quyền truy cập minh bạch vào các tệp và hệ thống tệp của máy chủ. Điều này khác với FTP (Chương 27), cung cấp khả năng truyền tập tin. Sử dụng FTP, việc sao chép tập tin hoàn chỉnh được thực hiện. NFS chỉ truy cập những phần của tệp mà một quy trình đã truy cập và ưu điểm chính của NFS là nó làm cho quyền truy cập này trở nên minh bạch. Điều này có nghĩa là bất kỳ ứng dụng khách nào có thể hoạt động với tệp cục bộ đều có thể dễ dàng hoạt động với tệp NFS mà không cần bất kỳ sửa đổi nào đối với chính chương trình.

    NFS là một ứng dụng máy khách-máy chủ được xây dựng bằng Sun RPC. Máy khách NFS truy cập các tệp trên máy chủ NFS bằng cách gửi yêu cầu RPC đến máy chủ. Điều này có thể được triển khai bằng cách sử dụng các quy trình người dùng thông thường - cụ thể là máy khách NFS có thể là một quy trình người dùng thực hiện các cuộc gọi RPC cụ thể đến máy chủ, cũng có thể là một quy trình người dùng. Tuy nhiên, NFS thường được triển khai khác nhau vì hai lý do. Đầu tiên, quyền truy cập vào các tệp NFS phải minh bạch đối với máy khách. Do đó, các cuộc gọi máy khách NFS được thực hiện bởi hệ điều hành máy khách thay mặt cho quy trình người dùng của máy khách. Thứ hai, máy chủ NFS được triển khai trong hệ điều hành để cải thiện hiệu quả của máy chủ. Nếu máy chủ NFS là một quy trình người dùng, mọi yêu cầu của khách hàng và phản hồi của máy chủ (bao gồm cả dữ liệu được đọc hoặc ghi) sẽ phải đi qua một dải phân cách giữa kernel và quy trình người dùng, điều này thường khá tốn kém.

    Trong phần này, chúng ta sẽ xem xét phiên bản 2 của NFS như được ghi trong RFC 1094 [Sun Microsystems 1988b]. Mô tả tốt nhất về Sun RPC, XDR và ​​NFS được đưa ra trong [X/Open 1991]. Chi tiết về việc sử dụng và quản lý NFS được đưa ra trong [Stern 1991]. Các thông số kỹ thuật của giao thức NFS phiên bản 3 được triển khai vào năm 1993, chúng ta sẽ thảo luận điều này trong một phần của chương này.

    Hình 29.3 hiển thị các cài đặt máy khách và máy chủ NFS điển hình. Trong hình này, bạn cần chú ý đến những điều sau.

    1. Máy khách không quan tâm liệu nó truy cập tệp cục bộ hay tệp NFS. Hạt nhân phát hiện điều này khi tệp được mở. Sau khi tệp được mở, kernel sẽ chuyển tất cả quyền truy cập vào tệp cục bộ vào hộp có nhãn "truy cập tệp cục bộ" và tất cả các liên kết đến tệp NFS sẽ được chuyển đến hộp "máy khách NFS".
    2. Máy khách NFS gửi các yêu cầu RPC đến máy chủ NFS thông qua mô-đun TCP/IP. NFS thường sử dụng UDP, tuy nhiên các triển khai mới hơn có thể sử dụng TCP.
    3. Máy chủ NFS nhận yêu cầu từ máy khách dưới dạng gói dữ liệu UDP trên cổng 2049. Mặc dù NFS có thể hoạt động với trình phân giải cổng, cho phép máy chủ sử dụng các cổng được gán động, cổng UDP 2049 được mã hóa cứng thành NFS trong hầu hết các triển khai.

    Hình 29.3 Các cài đặt máy khách NFS và máy chủ NFS điển hình.

  • Khi máy chủ NFS nhận được yêu cầu từ máy khách, nó sẽ được chuyển đến quy trình truy cập tệp cục bộ, quy trình này cung cấp quyền truy cập vào đĩa cục bộ trên máy chủ.
  • Máy chủ có thể mất thời gian để xử lý yêu cầu của khách hàng. Ngay cả việc truy cập hệ thống tập tin cục bộ cũng có thể mất một chút thời gian. Trong thời gian này, máy chủ không muốn chặn các yêu cầu từ các máy khách khác cũng cần được phục vụ. Để đối phó với tình huống này, hầu hết các máy chủ NFS đều được khởi động nhiều lần, nghĩa là có nhiều máy chủ NFS trong kernel. Phương pháp giải pháp cụ thể phụ thuộc vào hệ điều hành. Hầu hết các nhân Unix không "sống" nhiều máy chủ NFS mà thay vào đó khởi động nhiều tiến trình người dùng (thường được gọi là nfsd) thực hiện một cuộc gọi hệ thống duy nhất và vẫn ở bên trong kernel như một tiến trình kernel.
  • Tương tự, máy khách NFS cần có thời gian để xử lý yêu cầu từ quy trình người dùng trên máy chủ máy khách. RPC được cấp cho máy chủ lưu trữ, sau đó sẽ có phản hồi. Để đảm bảo rằng các tiến trình người dùng trên máy chủ máy khách có thể tận dụng NFS bất kỳ lúc nào, có một số máy khách NFS chạy bên trong nhân máy khách. Việc thực hiện cụ thể còn phụ thuộc vào hệ điều hành. Các hệ thống Unix thường sử dụng một kỹ thuật gợi nhớ đến máy chủ NFS: một tiến trình người dùng được gọi là biod thực hiện một cuộc gọi hệ thống duy nhất và vẫn ở bên trong kernel như một tiến trình kernel.
  • Hầu hết các máy chủ Unix có thể hoạt động như một máy khách NFS và máy chủ NFS hoặc cả hai cùng một lúc. Hầu hết các triển khai PC (MS-DOS) chỉ có triển khai máy khách NFS. Hầu hết các máy tính lớn của IBM chỉ cung cấp chức năng máy chủ NFS.

    NFS thực sự không chỉ là giao thức NFS. Hình 29.4 cho thấy các chương trình RPC khác nhau được sử dụng với NFS.

    Ứng dụng

    Số chương trình

    Số phiên bản

    Số thủ tục

    bộ chuyển đổi cổng
    NFS
    gắn kết chương trình
    trình quản lý chặn
    màn hình trạng thái

    Hình 29.4 Các chương trình RPC khác nhau được sử dụng trong NFS.

    Các phiên bản chúng tôi đã hiển thị trong hình này dưới dạng đơn vị được tìm thấy trên các hệ thống như SunOS 4.1.3. Việc triển khai mới cung cấp các phiên bản mới hơn của một số chương trình. Ví dụ, Solaris 2.2 cũng hỗ trợ phiên bản 3 và 4 của trình phân giải cổng và phiên bản 2 của trình nền gắn kết. SVR4 cũng hỗ trợ phiên bản 3 của bộ chuyển đổi cổng.

    Trình nền gắn kết được gọi trên máy chủ NFS của máy khách trước khi máy khách có thể truy cập hệ thống tệp của máy chủ. Chúng tôi mô tả quá trình này dưới đây.

    Trình quản lý chặn và giám sát trạng thái cho phép máy khách chặn một số tệp nằm trên máy chủ NFS. Hai chương trình này độc lập với giao thức NFS vì việc chặn yêu cầu xác thực ứng dụng khách đối với cả máy chủ và máy chủ và bản thân NFS là "trung lập". (Chúng ta sẽ nói chi tiết hơn về sự thờ ơ của NFS bên dưới.) Chương 9, 10 và 11 [X/Open 1991] ghi lại các thủ tục được trình quản lý khóa và giám sát trạng thái sử dụng để khóa trong NFS.

    Bộ mô tả tập tin

    Một trong những nguyên tắc cơ bản của NFS được triển khai bằng bộ mô tả tệp. Để truy cập một tập tin hoặc thư mục trên máy chủ đối tượng, opaque được sử dụng. Thuật ngữ mờ đục có nghĩa là máy chủ tạo một trình xử lý tệp, chuyển nó trở lại máy khách, sau đó máy khách sẽ sử dụng trình xử lý này khi truy cập tệp. Máy khách không bao giờ xem nội dung của bộ mô tả tệp - nội dung của nó chỉ được máy chủ quan tâm.

    Máy khách NFS nhận được một tập tin xử lý mỗi khi nó mở một tập tin thực sự nằm trên máy chủ NFS. Khi máy khách NFS đọc hoặc ghi vào tệp này (thay mặt cho quy trình người dùng), một phần xử lý tệp sẽ được chuyển trở lại máy chủ. Điều này cho thấy rằng tập tin đã được truy cập.

    Thông thường, quy trình người dùng không hoạt động với bộ mô tả tệp. Bộ mô tả tệp được trao đổi giữa máy khách NFS và máy chủ NFS. Trong phiên bản 2 của NFS, bộ mô tả tệp là 32 byte và trong phiên bản 3, nó đã tăng lên 64 byte.

    Các máy chủ Unix thường lưu trữ các thông tin sau trong bộ mô tả tệp: mã định danh hệ thống tệp (số thiết bị hệ thống tệp chính và phụ), số inode (nút i) (một số duy nhất trong hệ thống tệp), số tạo inode (một số thay đổi mỗi khi inode được sử dụng lại cho một tệp khác).

    Giao thức gắn kết

    Máy khách sử dụng giao thức gắn NFS để gắn hệ thống tệp của máy chủ trước khi truy cập các tệp NFS. Điều này thường xảy ra khi máy khách đang tải. Kết quả là, máy khách nhận được một tập tin xử lý hệ thống tập tin của máy chủ.

    Hình 29.5 mô tả chuỗi hành động của máy khách Unix khi thực hiện lệnh mount(8).

    Hình 29.5 Giao thức gắn kết được sử dụng bởi lệnh mount Unix.

    Trong trường hợp này, các bước sau đây được thực hiện.

    1. Khi máy chủ khởi động, bộ chuyển đổi cổng sẽ khởi động trên đó.
    2. Sau trình phân giải cổng, trình nền gắn kết (mountd) sẽ khởi động trên máy chủ. Nó tạo ra một điểm cuối TCP và một điểm cuối UDP, đồng thời gán cho mỗi điểm một số cổng được gán động. Sau đó nó đăng ký những con số này với bộ ánh xạ cổng.
    3. Máy khách thực thi lệnh mount, lệnh này thực hiện lệnh gọi RPC tới trình phân giải cổng của máy chủ để lấy số cổng từ trình nền gắn kết trên máy chủ. Cả TCP và UDP đều có thể được sử dụng để liên lạc giữa máy khách và bộ phân giải cổng, nhưng UDP thường được sử dụng.
    4. Trình phân giải cổng báo cáo số cổng.
    5. Lệnh mount thực hiện lệnh gọi RPC tới trình nền gắn kết để gắn kết hệ thống tệp của máy chủ. Một lần nữa, TCP hoặc UDP có thể được sử dụng, tuy nhiên UDP thường được sử dụng. Giờ đây, máy chủ có thể xác thực ứng dụng khách dựa trên địa chỉ IP và số cổng của nó để xem liệu máy khách có thể gắn hệ thống tệp được chỉ định hay không.
    6. Trình nền gắn kết phản hồi bằng một trình xử lý tệp đối với hệ thống tệp được chỉ định.
    7. Lệnh mount máy khách thực hiện lệnh gọi hệ thống mount để liên kết phần xử lý tệp thu được ở bước 5 với điểm gắn kết cục bộ trên máy chủ máy khách. Trình xử lý tệp được lưu trữ trong mã máy khách NFS và từ giờ trở đi, mọi quyền truy cập của quy trình người dùng vào các tệp trên hệ thống tệp của máy chủ sẽ sử dụng trình xử lý tệp làm điểm bắt đầu.

    Việc triển khai này để lại toàn bộ quá trình gắn kết, ngoại trừ lệnh gọi hệ thống gắn kết trên máy khách, cho các tiến trình của người dùng chứ không phải hạt nhân. Ba chương trình chúng tôi đã trình bày - lệnh mount, trình phân giải cổng và daemon mount - là các tiến trình của người dùng.

    Trong ví dụ này, trên máy chủ Sun (NFS client), lệnh được thực thi

    mặt trời # mount -t nfs bsdi:/usr /nfs/bsdi/usr

    Lệnh này gắn thư mục /usr trên máy chủ bsdi (máy chủ NFS) dưới dạng hệ thống tệp cục bộ /nfs/bsdi/usr. Hình 29.6 thể hiện kết quả.

    Hình 29.6 Gắn thư mục bsdi:/usr dưới dạng /nfs/bsdi/usr trên mặt trời máy chủ.

    Sau đó, khi truy cập tệp /nfs/bsdi/usr/rstevens/hello.c trên máy khách mặt trời, tệp /usr/rstevens/hello.c trên máy chủ bsdi sẽ được truy cập.

    Thủ tục NFS

    Máy chủ NFS cung cấp 15 thủ tục mà chúng tôi sẽ mô tả sau đây. (Các số được sử dụng trong mô tả này không giống với số thủ tục NFS, vì chúng tôi đã nhóm chúng theo chức năng.) Mặc dù NFS được thiết kế để hoạt động trên các hệ điều hành, không chỉ các hệ thống Unix, một số quy trình đặc biệt dựa trên chức năng của Unix , do đó, có thể không được các hệ điều hành khác hỗ trợ (ví dụ: liên kết cứng, liên kết tượng trưng, ​​​​sử dụng nhóm, quyền truy cập thực thi, v.v.). Chương 4 chứa nhiều thông tin hơn về các đặc điểm của hệ thống tập tin, một số trong đó NFS sử dụng.

    1. NHẬN. Trả về các thuộc tính tệp: loại tệp (tệp thông thường, thư mục, v.v.), quyền truy cập, kích thước tệp, chủ sở hữu tệp, thời gian truy cập lần cuối, v.v.
    2. THIẾT LẬP. Đặt thuộc tính tập tin. Chỉ có thể đặt một bộ thuộc tính cụ thể: quyền truy cập, chủ sở hữu, quyền sở hữu nhóm, kích thước, thời gian truy cập lần cuối và thời gian sửa đổi lần cuối.
    3. STATFS. Trả về trạng thái của hệ thống tệp: dung lượng trống, kích thước tối ưu để truyền, v.v. Ví dụ, được sử dụng bởi lệnh Unix df.
    4. TRA CỨU. "Đánh giá" tập tin. Quy trình này được máy khách gọi mỗi khi tiến trình người dùng mở một tệp nằm trên máy chủ NFS. Một phần xử lý tệp sẽ được trả về cùng với các thuộc tính của tệp.
    5. ĐỌC. Đọc từ một tập tin. Máy khách chỉ định một trình xử lý tệp, độ lệch byte bắt đầu và số byte tối đa cần đọc (tối đa 8192).
    6. VIẾT. Ghi vào một tập tin. Máy khách chỉ định phần xử lý tệp, độ lệch bắt đầu tính bằng byte, số byte cần ghi và dữ liệu cần ghi.

      Việc ghi NFS được yêu cầu phải đồng bộ (có thời gian chờ). Máy chủ không thể phản hồi OK cho đến khi dữ liệu được ghi thành công (và mọi thông tin tệp khác cần được cập nhật) vào đĩa.

    7. TẠO NÊN. Tạo một tập tin.
    8. DI DỜI. Xóa một tập tin.
    9. ĐỔI TÊN. Đổi tên tập tin.
    10. LIÊN KẾT. Tạo một liên kết cứng đến tập tin. Liên kết cứng là một khái niệm Unix chỉ định rằng một tệp nhất định trên đĩa có thể có bất kỳ số lượng điểm vào nào (tên còn được gọi là liên kết cứng) trỏ đến tệp đó.
    11. LIÊN KẾT. Tạo một liên kết tượng trưng đến một tập tin. Liên kết tượng trưng là một tệp chứa tên của một tệp khác. Hầu hết các thao tác được thực hiện trên một liên kết tượng trưng (ví dụ: mở) thực sự được thực hiện trên tệp mà liên kết tượng trưng trỏ tới.
    12. ĐỌC LIÊN KẾT. Đọc một liên kết tượng trưng sẽ trả về tên của tệp được trỏ đến bởi liên kết tượng trưng.
    13. MKDIR. Tạo một thư mục.
    14. RMDIR. Xóa một thư mục.
    15. READDIR. Đọc thư mục. Ví dụ, được sử dụng bởi lệnh Unix ls.

    Trên thực tế, tên thủ tục được hiển thị bắt đầu bằng tiền tố NFSPROC_ mà chúng tôi đã bỏ qua.

    UDP hay TCP?

    NFS ban đầu được viết để sử dụng UDP và tất cả các nhà cung cấp đều cung cấp khả năng này. Tuy nhiên, các triển khai mới hơn cũng hỗ trợ TCP. Hỗ trợ TCP được sử dụng để hoạt động trên các mạng toàn cầu, mạng này đang trở nên nhanh hơn. Do đó, việc sử dụng NFS không còn bị giới hạn ở các mạng cục bộ.

    Ranh giới giữa mạng cục bộ và mạng toàn cầu đang mờ dần và tất cả điều này đang diễn ra rất nhanh chóng. Thời gian quay trở lại khác nhau trong phạm vi rất rộng và tình trạng tràn xảy ra ngày càng thường xuyên hơn. Những đặc điểm này của mạng toàn cầu dẫn đến thực tế là chúng ngày càng sử dụng các thuật toán mà chúng tôi đã xem xét cho TCP - khởi động chậm và tránh tắc nghẽn. Vì UDP không cung cấp bất cứ điều gì tương tự với các thuật toán này nên chúng hoặc những thuật toán tương tự phải được tích hợp vào máy khách và máy chủ NFS, nếu không thì phải sử dụng TCP.

    NFS qua TCP

    Việc triển khai Berkeley Net/2 NFS hỗ trợ cả UDP và TCP. [Macklem 1991] mô tả cách thực hiện này. Hãy xem cách sử dụng NFS khác nhau như thế nào khi chạy trên TCP.

    1. Khi máy chủ khởi động, nó khởi động máy chủ NFS, chủ động mở trên cổng TCP 2049, chờ yêu cầu kết nối đến từ máy khách. Điều này thường được thực hiện cùng với NFS UDP thông thường, lắng nghe các gói dữ liệu đến trên cổng UDP 2049.
    2. Khi máy khách gắn hệ thống tệp của máy chủ bằng TCP, nó sẽ hoạt động mở trên cổng TCP 2049 trên máy chủ. Điều này thiết lập kết nối TCP giữa máy khách và máy chủ cho hệ thống tệp này. Nếu cùng một máy khách gắn hệ thống tệp khác trên cùng một máy chủ thì một kết nối TCP khác sẽ được tạo.
    3. Cả máy khách và máy chủ đều đặt tùy chọn TCP "sống sót" ở cuối kết nối của chúng (Chương 23). Điều này cho phép bạn xác định thời điểm xảy ra lỗi hoặc khởi động lại của một hoặc một người tham gia trao đổi khác.
    4. Tất cả các ứng dụng trên máy khách sử dụng hệ thống tệp của máy chủ đều chia sẻ cùng một kết nối TCP với hệ thống tệp đó. Ví dụ, nếu có trong Hình 29.6, sẽ có một thư mục khác trên bsdi, tên là smith, bên dưới thư mục /usr, gọi tới các tập tin trong /nfs/bsdi/usr/rstevens và /nfs/bsdi/usr/smith sẽ chia sẻ điều tương tự cùng một kết nối TCP.
    5. Nếu máy khách xác định rằng máy chủ đã gặp sự cố hoặc khởi động lại (sau khi nhận được lỗi "hết thời gian kết nối" hoặc "kết nối bị đóng bởi máy chủ"), nó sẽ cố gắng kết nối lại với máy chủ. Máy khách thực hiện một hoạt động mở khác để thiết lập lại kết nối TCP cho hệ thống tệp này. Mọi yêu cầu từ máy khách đã hết thời gian chờ trên kết nối trước đó sẽ được phát lại trên kết nối mới.
    6. Nếu một máy khách bị lỗi thì các ứng dụng đang chạy trước khi bị lỗi cũng vậy. Khi máy khách khởi động lại, nó có thể kết nối lại hệ thống tệp của máy chủ bằng TCP, sử dụng kết nối TCP khác với máy chủ. Kết nối trước đó giữa máy khách và máy chủ đối với hệ thống tệp này ở trạng thái nửa mở (máy chủ cho rằng nó vẫn mở), tuy nhiên, do máy chủ đã đặt tùy chọn "sống sót" nên kết nối nửa mở này sẽ bị đóng khi máy chủ TCP gửi thăm dò tiếp theo. "sống sót."

    Theo thời gian, các nhà cung cấp khác có kế hoạch hỗ trợ NFS qua TCP.

    Ví dụ về NFS

    Hãy sử dụng tcpdump để xem các thường trình NFS nào được máy khách gọi ra cho các hoạt động tệp thông thường. Khi tcpdump xác định rằng một datagram UDP chứa một lệnh gọi RPC (cuộc gọi là 0 trong Hình 29.1) với cổng đích 2049, nó sẽ giải mã datagram đó thành một yêu cầu NFS. Tương tự, nếu một datagram UDP chứa phản hồi RPC (trả lời là 1 trong Hình 29.2) với cổng nguồn là 2049, nó sẽ giải mã datagram đó dưới dạng phản hồi NFS.

    Ví dụ đơn giản: đọc một tập tin

    Trong ví dụ đầu tiên, chúng ta sẽ sao chép một tệp nằm trên máy chủ NFS vào thiết bị đầu cuối bằng lệnh cat(1):

    Mặt trời % mèo /nfs/bsdi/usr/rstevens/hello.c sao chép một tập tin vào thiết bị đầu cuối
    chủ yếu()
    {
    printf("xin chào thế giới\n");
    }

    Hệ thống tệp /nfs/bsdi/usr trên máy chủ sun (máy khách NFS) thực sự là hệ thống tệp /usr trên máy chủ bsdi (máy chủ NFS), như trong Hình 29.6. Hạt nhân mặt trời phát hiện điều này khi cat mở tệp và sử dụng NFS để truy cập tệp. Hình 29.7 cho thấy kết quả của lệnh tcpdump.

    1 0,0 sun.7aa6 > bsdi.nfs: 104 getattr
    2 0,003587 (0,0036) bsdi.nfs > sun.7aa6: trả lời ok 96

    3 0,005390 (0,0018) sun.7aa7 > bsdi.nfs: 116 tra cứu "rstevens"
    4 0,009570 (0,0042) bsdi.nfs > sun.7aa7: trả lời ok 128

    5 0,011413 (0,0018) sun.7aa8 > bsdi.nfs: tra cứu 116 "hello.c"
    6 0,015512 (0,0041) bsdi.nfs > sun.7aa8: trả lời ok 128

    7 0,018843 (0,0033) sun.7aa9 > bsdi.nfs: 104 getattr
    8 0,022377 (0,0035) bsdi.nfs > sun.7aa9: trả lời ok 96

    9 0,027621 (0,0052) sun.7aaa > bsdi.nfs: 116 đọc 1024 byte @ 0
    10 0,032170 (0,0045) bsdi.nfs > sun.7aaa: trả lời ok 140

    Hình 29.7 Thao tác NFS khi đọc file.

    Lệnh tcpdump giải mã yêu cầu hoặc phản hồi NFS và nó cũng in trường XID cho máy khách thay vì số cổng. Trường XID ở dòng 1 và 2 là 0x7aa6.

    Tên tệp /nfs/bsdi/usr/rstevens/hello.c được xử lý bởi hàm open trong nhân máy khách mỗi lần một phần tử tên. Khi hàm mở đạt tới /nfs/bsdi/usr, nó xác định rằng đây là điểm gắn kết hệ thống tệp NFS.

    Ở dòng 1, máy khách gọi GETATTR để lấy các thuộc tính của thư mục máy chủ mà máy khách đã mount (/usr). Yêu cầu RPC này chứa 104 byte dữ liệu, ngoài các tiêu đề IP và UDP. Phản hồi trên dòng 2 trả về OK và chứa 96 byte dữ liệu, ngoài các tiêu đề IP và UDP. Chúng ta có thể thấy trong hình này rằng thông báo NFS tối thiểu chứa khoảng 100 byte dữ liệu.

    Trên dòng 3, máy khách gọi LOOKUP trên tệp rstevens và nhận được phản hồi OK trên dòng 4. LOOKUP chỉ định tên của tệp rstevens và một điều khiển cho tệp được lưu trữ bởi kernel khi hệ thống tệp từ xa được gắn kết. Phản hồi chứa một trình xử lý tệp mới được sử dụng trong bước tiếp theo.

    Trên dòng 5, máy khách LOOKUP tệp hello.c bằng cách sử dụng phần xử lý tệp từ dòng 4. Nó nhận một phần xử lý tệp khác trên dòng 6. Phần xử lý tệp mới này chính xác là những gì máy khách sử dụng trên dòng 7 và 9 để truy cập tệp / nfs /bsdi/usr/rstevens/hello.c. Chúng tôi thấy rằng máy khách thực hiện LOOKUP trên từng thành phần tên trong đường dẫn đến tệp đang được mở.

    Trên dòng 7, máy khách thực hiện lại GETATTR, tiếp theo là READ trên dòng 9. Máy khách yêu cầu 1024 byte bắt đầu từ offset 0, nhưng nhận được ít hơn 1024 byte dữ liệu. (Sau khi trừ đi kích thước của các trường RPC và các giá trị khác được thủ tục READ trả về, 38 byte dữ liệu được trả về ở dòng 10. Đây chính xác là kích thước của tệp hello.c.)

    Trong ví dụ này, tiến trình người dùng không biết gì về các yêu cầu và phản hồi NFS này được thực hiện bởi kernel. Ứng dụng chỉ gọi hàm mở lõi, khiến 3 yêu cầu và 3 phản hồi được trao đổi (dòng 1-6), sau đó gọi hàm đọc lõi, gọi 2 yêu cầu và 2 phản hồi (dòng 7-10). Đối với ứng dụng khách, tệp nằm trên máy chủ NFS là trong suốt.

    Ví dụ đơn giản: tạo một thư mục

    Một ví dụ khác, hãy thay đổi thư mục làm việc thành thư mục nằm trên máy chủ NFS, sau đó tạo một thư mục mới:

    Mặt trời % cd /nfs/bsdi/usr/rstevens thay đổi thư mục làm việc
    mặt trời% thư mkdir tạo một thư mục

    Hình 29.8 cho thấy kết quả của lệnh tcpdump.

    1 0,0 sun.7ad2 > bsdi.nfs: 104 getattr
    2 0,004912 (0,0049) bsdi.nfs > sun.7ad2: trả lời ok 96

    3 0,007266 (0,0024) sun.7ad3 > bsdi.nfs: 104 getattr
    4 0,010846 (0,0036) bsdi.nfs > sun.7ad3: trả lời ok 96

    5 35.769875 (35.7590) sun.7ad4 > bsdi.nfs: 104 getattr
    6 35.773432 (0,0036) bsdi.nfs > sun.7ad4: trả lời ok 96

    7 35.775236 (0,0018) sun.7ad5 > bsdi.nfs: tra cứu 112 "Thư"
    8 35.780914 (0,0057) bsdi.nfs > sun.7ad5: trả lời ok 28

    9 35.782339 (0,0014) sun.7ad6 > bsdi.nfs: 144 mkdir "Thư"
    10 35.992354 (0.2100) bsdi.nfs > sun.7ad6: trả lời ok 128

    Hình 29.8 Thao tác NFS khi thay đổi thư mục (cd) sang thư mục NFS rồi tạo thư mục (mkdir).

    Khi thay đổi thư mục, client gọi GETATTR hai lần (dòng 1-4). Khi chúng ta tạo một thư mục mới, máy khách gọi GETATTR (dòng 5 và 6), sau đó LOOKUP (dòng 7 và 8 để kiểm tra xem thư mục đó có tồn tại không), sau đó gọi MKDIR để tạo thư mục (dòng 9 và 10). Phản hồi OK ở dòng 8 không có nghĩa là thư mục đó tồn tại. Nó đơn giản có nghĩa là thủ tục trả về một giá trị nào đó. tcpdump không diễn giải giá trị được trả về bởi thủ tục NFS. Lệnh chỉ in OK và số byte dữ liệu trong phản hồi.

    Thờ ơ

    Một trong những đặc điểm của NFS (các nhà phê bình NFS gọi nó là mụn cóc chứ không phải tính năng) là máy chủ NFS thờ ơ. Máy chủ không quan tâm khách hàng nào truy cập tệp nào. Lưu ý rằng danh sách các thủ tục NFS được hiển thị trước đó không bao gồm thủ tục mở hoặc đóng. Quy trình LOOKUP tương tự như mở, nhưng máy chủ không bao giờ biết liệu máy khách có truy cập tệp sau khi LOOKUP được thực hiện hay không.

    Lý do cho "hành vi không quan tâm" này là để giúp việc khôi phục sau lỗi máy chủ trở nên dễ dàng hơn sau khi nó gặp sự cố và khởi động lại.

    Ví dụ: lỗi máy chủ

    Trong ví dụ sau, chúng ta đang đọc một tệp từ máy chủ NFS khi máy chủ gặp sự cố và khởi động lại. Điều này sẽ cho thấy sự “thờ ơ” của máy chủ khiến máy khách “không biết” rằng máy chủ đã bị lỗi như thế nào. Trong suốt thời gian máy chủ gặp sự cố và khởi động lại, máy khách không biết về sự cố và ứng dụng máy khách vẫn hoạt động như trước.

    Trên máy khách Sun, chúng tôi chạy cat với một tệp rất lớn làm đối số (/usr/share/lib/termcap trên máy chủ svr4 NFS), ngắt kết nối cáp Ethernet giữa quá trình truyền, tắt và khởi động lại máy chủ, sau đó kết nối lại cáp . Máy khách đã được cấu hình để đọc 1024 byte cho mỗi lần đọc NFS. Hình 29.9 cho thấy kết quả đầu ra của tcpdump.

    Dòng 1-10 tương ứng với client mở file. Hoạt động này tương tự như trong Hình 29.7. Ở dòng 11, chúng ta thấy lần đọc đầu tiên (READ) từ tệp 1024 byte dữ liệu; phản hồi được trả về ở dòng 12. Việc này tiếp tục cho đến dòng 129 (đọc READ ở 1024 byte và sau đó phản hồi OK).

    Trong dòng 130 và 131, chúng tôi thấy hai yêu cầu đã hết thời gian chờ và được gửi lại ở dòng 132 và 133. Câu hỏi đầu tiên: chúng tôi thấy hai yêu cầu đọc, một yêu cầu bắt đầu ở offset 65536 và yêu cầu kia bắt đầu ở offset 73728, tại sao? Nhân máy khách xác định rằng ứng dụng khách đang đọc tuần tự và cố gắng lấy trước các khối dữ liệu. (Hầu hết các nhân Unix đều thực hiện việc đọc trước này.) Nhân máy khách cũng chạy một số daemon đầu vào/đầu ra (I/O) khối NFS (quy trình biod) cố gắng tạo ra nhiều yêu cầu RPC thay mặt cho máy khách. Một daemon đọc 8192 byte, bắt đầu từ 65536 (trong chuỗi 1024 byte) và các daemon khác đọc tiếp 8192 byte, bắt đầu từ 73728.

    Việc truyền lại máy khách xuất hiện trên các dòng 130-168. Trên dòng 169, chúng tôi thấy rằng máy chủ đã khởi động lại và gửi yêu cầu ARP trước khi phản hồi yêu cầu NFS của máy khách trên dòng 168. Phản hồi cho dòng 168 được gửi trên dòng 171. Yêu cầu READ của máy khách vẫn tiếp tục.

    1 0,0 sun.7ade > svr4.nfs: 104 getattr
    2 0,007653 (0,0077) svr4.nfs > sun.7ade: trả lời ok 96

    3 0,009041 (0,0014) sun.7adf > svr4.nfs: 116 tra cứu "chia sẻ"
    4 0,017237 (0,0082) svr4.nfs > sun.7adf: trả lời ok 128

    5 0,018518 (0,0013) sun.7ae0 > svr4.nfs: 112 tra cứu "lib"
    6 0,026802 (0,0083) svr4.nfs > sun.7ae0: trả lời ok 128

    7 0,028096 (0,0013) sun.7ae1 > svr4.nfs: 116 tra cứu "termcap"
    8 0,036434 (0,0083) svr4.nfs > sun.7ae1: trả lời ok 128

    9 0,038060 (0,0016) sun.7ae2 > svr4.nfs: 104 getattr
    10 0,045821 (0,0078) svr4.nfs > sun.7ae2: trả lời ok 96

    11 0,050984 (0,0052) sun.7ae3 > svr4.nfs: 116 đọc 1024 byte @ 0
    12 0,084995 (0,0340) svr4.nfs > sun.7ae3: trả lời ok 1124

    Đọc

    128 3.430313 (0,0013) sun.7b22 > svr4.nfs: 116 đọc 1024 byte @ 64512
    129 3.441828 (0.0115) svr4.nfs > sun.7b22: trả lời ok 1124

    130 4.125031 (0.6832) sun.7b23 >
    131 4.868593 (0.7436) sun.7b24 >

    132 4.993021 (0.1244) sun.7b23 > svr4.nfs: 116 đọc 1024 byte @ 65536
    133 5.732217 (0.7392) sun.7b24 > svr4.nfs: 116 đọc 1024 byte @ 73728

    134 6.732084 (0.9999) sun.7b23 > svr4.nfs: 116 đọc 1024 byte @ 65536
    135 7.472098 (0.7400) sun.7b24 > svr4.nfs: 116 đọc 1024 byte @ 73728

    136 10.211964 (2.7399) sun.7b23 >
    137 10.951960 (0.7400) sun.7b24 >

    138 17.171767 (6.2198) sun.7b23 > svr4.nfs: 116 đọc 1024 byte @ 65536
    139 17.911762 (0.7400) sun.7b24 > svr4.nfs: 116 đọc 1024 byte @ 73728

    140 31.092136 (13.1804) sun.7b23 > svr4.nfs: 116 đọc 1024 byte @ 65536
    141 31.831432 (0.7393) sun.7b24 > svr4.nfs: 116 đọc 1024 byte @ 73728

    142 51.090854 (19.2594) sun.7b23 > svr4.nfs: 116 đọc 1024 byte @ 65536
    143 51.830939 (0.7401) sun.7b24 > svr4.nfs: 116 đọc 1024 byte @ 73728

    144 71.090305 (19.2594) sun.7b23 > svr4.nfs: 116 đọc 1024 byte @ 65536
    145 71.830155 (0.7398) sun.7b24 > svr4.nfs: 116 đọc 1024 byte @ 73728

    Truyền lại

    167 291.824285 (0.7400) sun.7b24 > svr4.nfs: 116 đọc 1024 byte @ 73728
    168 311.083676 (19.2594) sun.7b23 > svr4.nfs: 116 đọc 1024 byte @ 65536

    Máy chủ đã khởi động lại

    169 311.149476 (0.0658) arp ai có mặt trời bảo svr4
    170 311.150004 (0,0005) arp trả lời mặt trời lúc 8:0:20:3:f6:42

    171 311.154852 (0,0048) svr4.nfs > sun.7b23: trả lời ok 1124

    172 311.156671 (0,0018) sun.7b25 > svr4.nfs: 116 đọc 1024 byte @ 66560
    173 311.168926 (0,0123) svr4.nfs > sun.7b25: trả lời ok 1124
    đọc

    Hình 29.9 Máy khách đang đọc tệp khi máy chủ NFS gặp sự cố và khởi động lại.

    Ứng dụng khách sẽ không bao giờ biết rằng máy chủ gặp sự cố và khởi động lại, ngoại trừ việc có khoảng dừng 5 phút giữa các dòng 129 và 171, do đó sự cố máy chủ là rõ ràng đối với máy khách.

    Để ước tính độ dài thời gian chờ truyền lại trong ví dụ này, hãy tưởng tượng rằng có hai trình nền máy khách, mỗi trình nền có thời gian chờ riêng. Các khoảng thời gian cho daemon đầu tiên (đọc từ offset 65536) xấp xỉ như sau (làm tròn đến hai chữ số thập phân): 0,68; 0,87; 1,74; 3,48; 6,96; 13,92; 20,0; 20,0; 20.0, v.v. Các khoảng thời gian cho daemon thứ hai (đọc từ offset 73728) hoàn toàn giống nhau. Điều này có nghĩa là các máy khách NFS này sử dụng thời gian chờ là bội số của 0,875 giây, với giới hạn trên là 20 giây. Sau mỗi lần hết thời gian chờ, khoảng thời gian truyền lại tăng gấp đôi: 0,875; 1,75; 3,5; 7.0 và 14.0.

    Sẽ mất bao lâu để khách hàng thực hiện việc truyền lại? Khách hàng có hai lựa chọn có thể ảnh hưởng đến điều này. Đầu tiên, nếu hệ thống tệp của máy chủ được gắn cứng, máy khách sẽ truyền lại vĩnh viễn, nhưng nếu hệ thống tệp của máy chủ được gắn mềm, máy khách sẽ ngừng thử sau một số lần truyền lại cố định. Ngoài ra, trong trường hợp gắn kết cứng, máy khách có tùy chọn cho phép người dùng hủy bỏ việc truyền lại không thành công hoặc không hủy bỏ. Nếu khi gắn hệ thống tệp của máy chủ, máy chủ của máy khách cho biết rằng nó có thể bị gián đoạn và nếu chúng ta không muốn đợi 5 phút để máy chủ khởi động lại sau khi gặp sự cố, chúng ta có thể nhập biểu tượng ngắt để chấm dứt ứng dụng máy khách.

    Một số thủ tục giống nhau

    Các thủ tục RPC có thể được máy chủ thực thi nhiều lần nhưng vẫn trả về cùng một kết quả. Ví dụ: thủ tục đọc NFS. Như chúng ta đã thấy trong Hình 29.9, máy khách chỉ cần thực hiện lại lệnh gọi READ miễn là nó nhận được phản hồi. Trong ví dụ của chúng tôi, lý do truyền lại là do máy chủ bị hỏng. Nếu máy chủ không bị lỗi và các tin nhắn chứa phản hồi RPC bị mất (vì UDP là giao thức không đáng tin cậy), máy khách chỉ cần truyền lại và máy chủ thực hiện ĐỌC lại như cũ. Phần tương tự của cùng một tệp sẽ được đọc lại và gửi cho khách hàng.

    Điều này hoạt động vì mọi yêu cầu đọc READ đều chứa phần bù bắt đầu. Nếu thủ tục NFS yêu cầu máy chủ đọc N byte tiếp theo của tệp thì nó sẽ không hoạt động. Nếu máy chủ không thờ ơ (điều này trái ngược với thờ ơ) và phản hồi bị mất và máy khách phát hành lại READ cho N byte tiếp theo thì kết quả sẽ khác. Đây là lý do tại sao các thủ tục ĐỌC và VIẾT NFS có độ lệch bắt đầu. Máy khách duy trì trạng thái (phần bù hiện tại cho mỗi tệp), không phải máy chủ.

    Thật không may, không phải tất cả các thao tác trên hệ thống tệp đều có thể được thực hiện nhiều lần. Ví dụ, hãy tưởng tượng các bước sau: máy khách NFS đưa ra yêu cầu XÓA để xóa một tệp; Máy chủ NFS xóa tệp và phản hồi OK; phản hồi của máy chủ bị mất; Máy khách NFS hết thời gian chờ và truyền lại yêu cầu; Máy chủ NFS không thể tìm thấy tệp và trả về lỗi; Ứng dụng khách nhận được lỗi cho biết tệp không tồn tại. Lỗi này được trả về ứng dụng khách và lỗi này mang thông tin không chính xác - tệp không tồn tại và đã bị xóa.

    Dưới đây là danh sách các thủ tục NFS có thể được thực thi nhiều lần: GETATTR, STATFS, LOOKUP, READ, WRITE, READLINK và READDIR. Các quy trình không thể thực hiện nhiều lần: TẠO, XÓA, ĐỔI TÊN, LINK, SYMLINK, MKDIR và RMDIR. SETATTR thường được thực thi nhiều lần, trừ khi nó được sử dụng để cắt bớt một tập tin.

    Vì các phản hồi mồ côi luôn có khả năng xảy ra khi sử dụng UDP nên máy chủ NFS phải có cách xử lý các thao tác không thể thực hiện nhiều lần. Hầu hết các máy chủ đều có bộ đệm phản hồi gần đây để lưu trữ các phản hồi nhận được gần đây nhất cho các hoạt động đó. Mỗi khi máy chủ nhận được một yêu cầu, trước tiên nó sẽ xem qua bộ nhớ đệm và nếu tìm thấy kết quả phù hợp, nó sẽ trả về phản hồi trước đó thay vì gọi lại thủ tục NFS. [Juszczak 1989] mô tả chi tiết về các loại bộ đệm này.

    Cách tiếp cận thủ tục máy chủ này áp dụng cho tất cả các ứng dụng dựa trên UDP, không chỉ NFS. Ví dụ: DNS cung cấp một dịch vụ có thể được sử dụng nhiều lần mà không gặp khó khăn. Máy chủ DNS có thể truy vấn trình phân tích cú pháp nhiều lần, điều này sẽ không dẫn đến kết quả tiêu cực (có thể, ngoại trừ tài nguyên mạng sẽ bị chiếm dụng).

    NFS phiên bản 3

    Trong năm 1994, thông số kỹ thuật cho phiên bản 3 của giao thức NFS đã được phát hành [Sun Microsystems 1993]. Việc triển khai dự kiến ​​sẽ sẵn sàng vào năm 1994.

    Dưới đây là tóm tắt nhanh về những khác biệt chính giữa phiên bản 2 và 3. Chúng tôi sẽ gọi chúng là V2 và V3.

    1. Bộ mô tả tệp trong V2 là một mảng có kích thước cố định là 32 byte. Trong V3, nó là một mảng có kích thước thay đổi với kích thước lên tới 64 byte. Mảng có độ dài thay đổi trong XDR được xác định bởi bộ đếm 4 byte theo sau là byte thực. Điều này làm giảm kích thước của bộ mô tả tệp trong các triển khai như Unix, trong đó chỉ cần khoảng 12 byte, nhưng cho phép các triển khai không phải Unix trao đổi thông tin bổ sung.
    2. V2 giới hạn số byte cho mỗi thủ tục RPC ĐỌC hoặc VIẾT ở mức 8192 byte. Giới hạn này không áp dụng trong V3, điều này có nghĩa là khi sử dụng UDP, giới hạn sẽ chỉ là kích thước của gói dữ liệu IP (65535 byte). Điều này cho phép sử dụng các gói lớn để đọc và ghi trên các mạng nhanh.
    3. Kích thước tệp và độ lệch byte bắt đầu cho quy trình ĐỌC và VIẾT đã được mở rộng từ 32 lên 64 bit, cho phép xử lý kích thước tệp lớn hơn.
    4. Thuộc tính tệp được trả về trong mọi lệnh gọi có thể ảnh hưởng đến thuộc tính. Điều này làm giảm số lượng cuộc gọi GETATTR mà khách hàng yêu cầu.
    5. Việc ghi (WRITE) có thể không đồng bộ, trong khi ở V2 chúng được cho là đồng bộ. Điều này có thể cải thiện hiệu suất của thủ tục VIẾT.
    6. Một thủ tục đã bị xóa (STATFS) và bảy thủ tục đã được thêm vào: ACCESS (kiểm tra quyền của tệp), MKNOD (tạo một tệp Unix đặc biệt), READDIRPLUS (trả về tên của các tệp trong một thư mục cùng với các thuộc tính của chúng), FSINFO (trả về thông tin thống kê về hệ thống tệp ), FSSTAT (trả về thông tin hệ thống tệp động), PATHCONF (trả về thông tin tệp POSIX.1) và COMMIT (cam kết ghi không đồng bộ đã thực hiện trước đó vào bộ lưu trữ liên tục).

    Kết luận ngắn gọn

    RPC là một cách để xây dựng một ứng dụng máy khách-máy chủ theo cách mà máy khách chỉ cần gọi các thủ tục trên máy chủ. Tất cả các chi tiết mạng đều bị ẩn trong các nhánh máy khách và máy chủ, được tạo ra cho các ứng dụng bằng gói RPC và trong các quy trình thư viện RPC. Chúng tôi đã trình bày định dạng của các tin nhắn phản hồi và cuộc gọi RPC, đồng thời đề cập rằng XDR được sử dụng để mã hóa các giá trị, cho phép máy khách và máy chủ RPC chạy trên các kiến ​​trúc máy khác nhau.

    Một trong những ứng dụng RPC được sử dụng rộng rãi nhất là Sun NFS, một giao thức truy cập tệp không đồng nhất được sử dụng rộng rãi trên các máy chủ thuộc hầu hết mọi kích cỡ. Chúng tôi đã xem xét NFS và cách nó sử dụng UDP hoặc TCP. Giao thức NFS Phiên bản 2 xác định 15 thủ tục.

    Quyền truy cập của máy khách vào máy chủ NFS bắt đầu bằng giao thức gắn kết, sau đó phần xử lý tệp được trả về cho máy khách. Sau đó, máy khách có thể truy cập các tệp trên hệ thống tệp của máy chủ bằng cách sử dụng trình xử lý tệp này. Tên tệp được tra cứu trên máy chủ mỗi lần một thành phần tên, trả về một phần xử lý tệp mới cho mỗi thành phần. Kết quả cuối cùng là một điều khiển đối với tệp đã được truy cập và được sử dụng để đọc và ghi tuần tự.

    NFS cố gắng làm cho tất cả các thủ tục của nó độc lập với số lần thực thi để khách hàng có thể đơn giản đưa ra lại yêu cầu nếu phản hồi bị mất. Chúng tôi đã thấy các ví dụ về trường hợp máy khách đang đọc tệp trong khi máy chủ gặp sự cố và khởi động lại.

    Bài tập

    Trong Hình 29.7, chúng ta thấy rằng tcpdump diễn giải các gói dưới dạng các yêu cầu và phản hồi NFS và in XID. tcpdump có thể thực hiện việc này cho bất kỳ yêu cầu hoặc phản hồi RPC nào không?
  • Tại sao bạn cho rằng chương trình máy chủ RPC trên hệ thống Unix sử dụng các cổng được gán động thay vì các cổng đã biết trước?
  • Máy khách RPC gọi hai thủ tục máy chủ. Quy trình đầu tiên mất 5 giây để hoàn thành và quy trình thứ hai - 1 giây. Máy khách có thời gian chờ là 4 giây. Vẽ sơ đồ thời gian về những gì được trao đổi giữa máy khách và máy chủ. (Hãy tưởng tượng rằng không có thời gian chuyển tin nhắn từ máy khách này sang máy chủ khác và ngược lại.)
  • Trong ví dụ ở Hình 29.9, điều gì sẽ xảy ra nếu card Ethernet của máy chủ NFS bị tháo ra trong khi máy chủ NFS bị tắt?
  • Khi máy chủ khởi động lại trong Hình 29.9, nó đã xử lý yêu cầu bắt đầu ở offset 65536 (dòng 168 và 171), sau đó xử lý yêu cầu tiếp theo bắt đầu ở offset 66560 (dòng 172 và 173). Điều gì xảy ra với truy vấn bắt đầu ở offset 73728 (dòng 167)?
  • Khi chúng tôi mô tả các quy trình độc lập với số lần thực thi NFS, chúng tôi đã đưa ra một ví dụ về phản hồi XÓA bị mất trong mạng. Điều gì xảy ra trong trường hợp này nếu TCP được sử dụng thay vì UDP?
  • Nếu máy chủ NFS sử dụng cổng được gán động thay vì cổng 2049, điều gì sẽ xảy ra với máy khách NFS khi máy chủ gặp sự cố và khởi động lại?
  • Có rất ít số cổng dành riêng (Chương 1, phần “Số cổng”), tối đa là 1023 cho mỗi máy chủ. Nếu máy chủ NFS yêu cầu máy khách của nó có cổng dành riêng (điều này thường làm) và máy khách NFS sử dụng TCP gắn N hệ thống tệp trên N máy chủ khác nhau, thì máy khách có cần có số cổng dành riêng khác nhau cho mỗi kết nối không?
  • Vậy tiếp theo là gì? Làm thế nào để xem phim và nghe các file nhạc đã được tải về? Có thực sự cần thiết phải ghi chúng vào đĩa và chuyển chúng sang máy tính có GUI không? Hay tôi sẽ phải sao chép chúng qua SFTP chậm? KHÔNG! NFS đến giải cứu! Không, đây không phải là một dòng game đua xe mà là Network File System.
    Hệ thống tệp mạng (NFS) là một hệ thống tệp mạng cho phép người dùng truy cập các tệp và thư mục nằm trên máy tính từ xa như thể những tệp và thư mục đó là cục bộ. Ưu điểm chính của hệ thống như vậy là các máy trạm riêng lẻ có thể sử dụng ít dung lượng đĩa riêng hơn vì dữ liệu dùng chung được lưu trữ trên một máy riêng biệt và có sẵn cho các máy khác trên mạng. NFS là một ứng dụng máy khách-máy chủ. Nghĩa là, máy khách NFS phải được cài đặt trên hệ thống của người dùng và máy chủ NFS phải được cài đặt trên các máy tính cung cấp dung lượng ổ đĩa của họ.

    Cài đặt và cấu hình máy chủ NFS (192.168.1.2)

    1. Cài đặt. Sau khi kết nối qua SSH với máy chủ hoặc đơn giản là trong bảng điều khiển của nó, hãy nhập:

    Sudo apt-get cài đặt nfs-kernel-server nfs-common portmap

    Điều này sẽ cài đặt máy chủ NFS cũng như gói portmap cần thiết.

    2. Thiết lập. Để định cấu hình danh sách các thư mục mà chúng tôi muốn mở và danh sách những người chúng tôi muốn mở chúng, chúng tôi sẽ chỉnh sửa tệp /etc/xuất khẩu :

    Sudo nano /etc/exports /data 192.168.1.1/24(rw,no_root_squash,async)

    Trong ví dụ trên, chúng tôi đã mở một thư mục trên máy chủ /dữ liệu và các thư mục con của nó để tất cả các máy tính có IP sử dụng chung: 192.168.1.1 - 192.168.1.255 với quyền đọc và ghi.

    Một vi dụ khac:

    /home/serg/ 192.168.1.34(ro,async)

    Ví dụ này làm cho thư mục chính của người dùng serg có sẵn ở chế độ chỉ đọc đối với máy tính có IP 192.168.1.34. Tất cả các máy tính khác trên mạng sẽ không có quyền truy cập vào thư mục này.

    Tùy chọn có sẵn:

    • ro - quyền chỉ đọc. Bạn không cần phải chỉ định nó vì nó được cài đặt theo mặc định;
    • rw - cấp cho khách hàng quyền viết;
    • no_root_squash - theo mặc định, người dùng root trên máy khách sẽ không có quyền truy cập vào các thư mục đang mở trên máy chủ. Với tùy chọn này, chúng tôi loại bỏ giới hạn này. Vì lý do an toàn, tốt hơn hết là không nên làm điều này;
    • noaccess - từ chối quyền truy cập vào thư mục được chỉ định. Nó có thể hữu ích nếu trước đây bạn đặt quyền truy cập cho tất cả người dùng mạng vào một thư mục nhất định và bây giờ bạn muốn hạn chế quyền truy cập vào thư mục con chỉ cho một số người dùng.

    Bây giờ bạn cần khởi động lại nfs-kernel-server:

    Sudo /etc/init.d/nfs-kernel-server khởi động lại

    Nếu sau này bạn muốn thay đổi bất cứ điều gì trong tập tin /etc/xuất khẩu , sau đó để các thay đổi có hiệu lực, chỉ cần chạy lệnh sau:

    Xuất Sudo -a

    Tất cả. Máy chủ NFS đã được cài đặt và cấu hình. Bạn có thể chuyển sang máy khách NFS.

    Cài đặt và cấu hình máy khách NFS

    1. Cài đặt. Chúng tôi thực hiện các thao tác sau trong thiết bị đầu cuối của máy tính sẽ kết nối:

    Sudo apt-get cài đặt portmap nfs-common

    2. Thiết lập. Đầu tiên, hãy tạo một thư mục trong đó thư mục từ xa sẽ được gắn kết:

    Dữ liệu Cd ~ mkdir

    Bạn có thể gắn kết theo hai cách - thủ công mỗi lần hoặc bằng cách ghi các tùy chọn gắn kết vào một tệp /etc/fstab.

    Cách 1: Lắp thủ công
    Tạo một tệp văn bản trên màn hình nền hoặc trong một số thư mục khác:

    Nano ~/Desktop/nfs-server-connect

    Chúng tôi viết trong đó:

    #! /bin/bash sudo mount -t nfs -o ro,soft,intr 192.168.1.2:/data ~/data

    Hãy làm cho nó có thể thực thi được:

    Chmod +x ~/Desktop/nfs-server-connect

    Bây giờ, khi cần kết nối với máy chủ, tôi chạy tập lệnh này trong terminal để có thể nhập mật khẩu cho sudo.

    Cách 2: Thêm vào /etc/fstab
    Mở /etc/fstab:

    Sudo nano /etc/fstab

    Và thêm một dòng vào cuối tập tin:

    192.168.1.2:/data ~/data nfs rw,hard,intr 0 0

    Chú ý! Thay vì 192.168.1.2:/data, hãy nhập IP hoặc tên máy chủ và đường dẫn đến thư mục dùng chung. Tùy chọn gắn kết có thể được thay đổi.

    Lựa chọn cứng nó liên kết chặt chẽ thư mục trên máy khách với máy chủ và nếu máy chủ bị hỏng, máy tính của bạn cũng có thể bị treo. Lựa chọn mềm mại, như tên gọi của nó, không mang tính phân loại như vậy.

    Sau khi lưu tệp, bạn có thể gắn thư mục từ xa.

    Khi nói về mạng máy tính, bạn thường có thể nghe nhắc đến NFS. Chữ viết tắt này có nghĩa là gì?

    Nó là một giao thức hệ thống tệp phân tán được Sun Microsystems phát triển ban đầu vào năm 1984, cho phép người dùng trên máy khách truy cập các tệp qua mạng, tương tự như truy cập bộ nhớ cục bộ. NFS, giống như nhiều giao thức khác, dựa trên hệ thống Cuộc gọi thủ tục từ xa tính toán mạng mở (ONC RPC).

    Nói cách khác, NFS là gì? Nó là một tiêu chuẩn mở, được xác định bởi Yêu cầu Nhận xét (RFC), cho phép mọi người triển khai giao thức.

    Phiên bản và biến thể

    Nhà phát minh chỉ sử dụng phiên bản đầu tiên cho mục đích thử nghiệm của riêng mình. Khi nhóm phát triển bổ sung những thay đổi quan trọng vào NFS ban đầu và phát hành nó ngoài quyền tác giả của Sun, họ đã chỉ định phiên bản mới là v2 để họ có thể kiểm tra khả năng tương tác giữa các bản phân phối và tạo bản dự phòng.

    NFS v2

    Phiên bản 2 ban đầu chỉ hoạt động trên Giao thức gói dữ liệu người dùng (UDP). Các nhà phát triển của nó muốn giữ phía máy chủ mà không thực hiện chặn bên ngoài giao thức chính.

    Giao diện hệ thống tệp ảo cho phép triển khai mô-đun được phản ánh trong một giao thức đơn giản. Đến tháng 2 năm 1986, các giải pháp đã được chứng minh cho các hệ điều hành như System V phiên bản 2, DOS và VAX/VMS sử dụng Eunice. NFS v2 chỉ cho phép đọc 2 GB đầu tiên của tệp do giới hạn 32 bit.

    NFS v3

    Đề xuất phát triển NFS phiên bản 3 đầu tiên tại Sun Microsystems đã được công bố ngay sau khi phát hành bản phân phối thứ hai. Động lực chính là cố gắng giảm thiểu vấn đề về hiệu suất của quá trình ghi đồng bộ. Đến tháng 7 năm 1992, những cải tiến thực tế đã giải quyết được nhiều thiếu sót của NFS phiên bản 2, chỉ còn lại hỗ trợ tệp không đủ (kích thước tệp 64-bit và độ lệch tệp).

    • hỗ trợ kích thước tệp 64-bit và độ lệch để xử lý dữ liệu lớn hơn 2 gigabyte (GB);
    • hỗ trợ ghi không đồng bộ trên máy chủ để cải thiện hiệu suất;
    • thuộc tính tệp bổ sung trong nhiều câu trả lời để tránh phải tìm nạp lại chúng;
    • Hoạt động READDIRPLUS để lấy dữ liệu và thuộc tính cùng với tên tệp khi quét một thư mục;
    • nhiều cải tiến khác.

    Trong quá trình giới thiệu phiên bản 3, sự hỗ trợ cho TCP như một giao thức lớp vận chuyển bắt đầu tăng lên. Việc sử dụng TCP làm phương tiện truyền dữ liệu, được thực hiện bằng NFS qua mạng WAN, bắt đầu cho phép truyền các kích thước tệp lớn để xem và ghi. Nhờ đó, các nhà phát triển đã có thể vượt qua giới hạn 8 KB do Giao thức gói dữ liệu người dùng (UDP) áp đặt.

    NFS v4 là gì?

    Phiên bản 4, chịu ảnh hưởng của Hệ thống tệp Endres (AFS) và Khối tin nhắn máy chủ (SMB, còn được gọi là CIFS), bao gồm các cải tiến về hiệu suất, cung cấp khả năng bảo mật tốt hơn và giới thiệu giao thức tuân thủ.

    Phiên bản 4 là bản phân phối đầu tiên được phát triển bởi Lực lượng đặc nhiệm kỹ thuật Internet (IETF) sau khi Sun Microsystems thuê ngoài phát triển giao thức.

    NFS phiên bản 4.1 nhằm mục đích cung cấp hỗ trợ giao thức để tận dụng việc triển khai máy chủ theo cụm, bao gồm khả năng cung cấp quyền truy cập song song có thể mở rộng vào các tệp được phân phối trên nhiều máy chủ (phần mở rộng pNFS).

    Giao thức hệ thống tệp mới nhất, NFS 4.2 (RFC 7862), được phát hành chính thức vào tháng 11 năm 2016.

    Các tiện ích mở rộng khác

    Với sự phát triển của tiêu chuẩn, các công cụ tương ứng để làm việc với nó đã xuất hiện. Ví dụ: WebNFS, một tiện ích mở rộng cho phiên bản 2 và 3, cho phép Giao thức truy cập hệ thống tệp mạng dễ dàng tích hợp hơn vào trình duyệt web và cho phép hoạt động trên tường lửa.

    Nhiều giao thức của bên thứ ba cũng đã được liên kết với NFS. Nổi tiếng nhất trong số đó là:

    • Trình quản lý khóa mạng (NLM) có hỗ trợ giao thức byte (được thêm để hỗ trợ API khóa tệp UNIX System V);
    • Hạn ngạch từ xa (RQUOTAD), cho phép người dùng NFS xem hạn ngạch lưu trữ trên máy chủ NFS;
    • NFS qua RDMA là phiên bản chuyển thể của NFS sử dụng truy cập bộ nhớ trực tiếp từ xa (RDMA) làm phương tiện truyền dẫn;
    • NFS-Ganesha là máy chủ NFS chạy trong không gian người dùng và hỗ trợ CephFS FSAL (Lớp trừu tượng hệ thống tệp) bằng libcephfs.

    Nền tảng

    Network File System thường được sử dụng với các hệ điều hành Unix (như Solaris, AIX, HP-UX), MacOS của Apple và các hệ điều hành tương tự Unix (như Linux và FreeBSD).

    Nó cũng có sẵn cho các nền tảng như Acorn RISC OS, OpenVMS, MS-DOS, Microsoft Windows, Novell NetWare và IBM AS/400.

    Các giao thức truy cập tệp từ xa thay thế bao gồm Khối tin nhắn máy chủ (SMB, còn được gọi là CIFS), Giao thức truyền tải Apple (AFP), Giao thức lõi NetWare (NCP) và Hệ thống tệp máy chủ OS/400 (QFileSvr.400).

    Điều này là do các yêu cầu của NFS, vốn chủ yếu nhằm vào các “shell” giống Unix.

    Tuy nhiên, giao thức SMB và NetWare (NCP) được sử dụng thường xuyên hơn NFS trên các hệ thống chạy Microsoft Windows. AFP phổ biến nhất trên nền tảng Apple Macintosh và QFileSvr.400 phổ biến nhất trên OS/400.

    Triển khai điển hình

    Giả sử một kịch bản kiểu Unix điển hình trong đó một máy tính (máy khách) cần truy cập vào dữ liệu được lưu trữ trên máy tính khác (máy chủ NFS):

    • Máy chủ triển khai các quy trình của Hệ thống tệp mạng, chạy theo mặc định dưới dạng nfsd, để cung cấp công khai dữ liệu của nó cho khách hàng. Quản trị viên máy chủ xác định cách xuất tên thư mục và cài đặt, thường sử dụng tệp cấu hình /etc/exports và lệnh importfs.
    • Việc quản lý bảo mật máy chủ đảm bảo rằng nó có thể nhận dạng và phê duyệt một máy khách đã được xác thực. Cấu hình mạng của nó đảm bảo rằng các khách hàng đủ điều kiện có thể đàm phán với nó thông qua bất kỳ hệ thống tường lửa nào.
    • Máy khách yêu cầu quyền truy cập vào dữ liệu đã xuất, thường bằng cách đưa ra lệnh. Nó truy vấn máy chủ (rpcbind) đang sử dụng cổng NFS và sau đó kết nối với nó.
    • Nếu mọi thứ diễn ra không có lỗi, người dùng trên máy khách sẽ có thể xem và tương tác với các hệ thống tệp đã cài đặt trên máy chủ trong giới hạn cho phép.

    Cũng cần lưu ý rằng việc tự động hóa quy trình Hệ thống tệp mạng cũng có thể diễn ra - có thể sử dụng etc/fstab và/hoặc các công cụ tương tự khác.

    Sự phát triển cho đến nay

    Đến thế kỷ 21, các giao thức cạnh tranh DFS và AFS đã không đạt được bất kỳ thành công thương mại lớn nào so với Hệ thống tệp mạng. IBM, trước đây đã mua lại tất cả các quyền thương mại đối với các công nghệ trên, đã tặng hầu hết mã nguồn AFS cho cộng đồng phần mềm miễn phí vào năm 2000. Dự án Open AFS vẫn tồn tại cho đến ngày nay. Đầu năm 2005, IBM công bố ngừng bán AFS và DFS.

    Ngược lại, vào tháng 1 năm 2010, Panasas đã đề xuất NFS v 4.1 dựa trên công nghệ cải thiện khả năng truy cập dữ liệu song song. Giao thức Network File System v 4.1 xác định phương pháp tách siêu dữ liệu hệ thống tệp khỏi vị trí của các tệp cụ thể. Vì vậy, nó vượt xa việc phân tách tên/dữ liệu đơn giản.

    NFS của phiên bản này trong thực tế là gì? Tính năng trên giúp phân biệt nó với giao thức truyền thống, chứa tên của các tệp và dữ liệu của chúng trong một kết nối đến máy chủ. Với Network File System v 4.1, một số tệp có thể được chia sẻ trên các máy chủ nhiều nút nhưng sự tham gia của khách hàng vào việc chia sẻ siêu dữ liệu và dữ liệu bị hạn chế.

    Khi triển khai phân phối giao thức thứ tư, máy chủ NFS là một tập hợp các tài nguyên hoặc thành phần máy chủ; chúng được cho là được kiểm soát bởi máy chủ siêu dữ liệu.

    Máy khách vẫn liên hệ với một máy chủ siêu dữ liệu duy nhất để duyệt qua hoặc tương tác với không gian tên. Khi di chuyển các tệp đến và đi từ máy chủ, nó có thể tương tác trực tiếp với tập hợp dữ liệu do nhóm NFS sở hữu.