Cài đặt và cấu hình máy chủ NFS và máy khách NFS. Thiết lập và gắn kết NFS

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 quyền truy cập tệp minh bạch vào các ứng dụng khách. 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ẽ mô tả trước tiên.

Chương trình khách hàng không yêu cầu các công cụ đặc biệt để sử dụng NFS. Kernel phát hiện 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 tôi sẽ không đi vào chi tiết về cách thức truy cập tệp được triển khai, nhưng cách nó sử dụng các giao thức Internet, đặc biệt là UDP.

Gọi một thủ tục từ xa bằng mặt trời

Trong hầu hết các trường hợp, các nhiệm 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 chủ động, một chức năng khác 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ộ đếm thời gian tồn tại của TCP), 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 sử dụng bởi máy khách và API được sử dụng bởi máy chủ có thể khác nhau, cũng như hệ điều hành chạy trên máy khách và máy chủ. Chính các giao thức giao tiếp và ứng dụng sẽ xác định liệu 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 socket 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ách sử dụng các API và TCP khác nếu cả hai máy chủ đều được kết nối với mạng và cả hai đều có một / ip triển khai TCP.

Thông thường, máy khách gửi lệnh đến máy chủ và máy chủ gửi phản hồi cho máy khách. Tất cả các ứng dụng mà 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, Lệnh gọi thủ tục từ xa, có một cách tiếp cận khác để lập trình mạng. Chương trình máy khách chỉ đơn giản là gọi các chức năng trong chương trình máy chủ. Đây là cách nó được quyết định từ quan điểm của lập trình viên, 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 hàm được gọi trên máy chủ cục bộ được tạo bởi gói RPC. Chức năng này được gọi là trình khách. Máy khách sơ khai gói các đối số thủ tục thành một thông báo mạng và gửi thông báo đến máy chủ.
  2. cuống máy chủ trên máy chủ lưu trữ nhận được thông báo mạng. Các đối số được trích xuất từ ​​thông báo mạng và một thủ tục máy chủ do người lập trình ứng dụng viết được gọi.
  3. Hàm máy chủ trả lại quyền điều khiển cho phần khai máy chủ, hàm này sẽ nhận các giá trị đã nhận, gói chúng thành một thông điệp mạng và gửi thông báo trở lại sơ bộ máy khách.
  4. cuống máy khách trả về các giá trị từ thông báo mạng tới ứng dụng máy khách.

Lập trình mạng sử dụng các quy trình sơ khai và thư viện RPC sử dụng API (ổ cắm hoặc TLI), nhưng các ứng dụng người dùng (chương trình máy khách và thủ tục máy chủ được gọi bởi máy khách) không bao giờ truy cập vào API. Ứng dụng khách gọi thủ tục máy chủ là đủ, 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 lợi ích 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). Người lập trình ứ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 một giao thức không đáng tin cậy như UDP được sử dụng, tất cả các chi tiết như thời gian chờ và truyền lại sẽ được gói RPC xử lý. Điều này, đến lượt nó, đơn giản hóa ứng dụng của người dùng.
  • Thư viện RPC xử lý đối số cần thiết và chuyển đổi giá trị trả về. Ví dụ: nếu các đối số bao gồm số nguyên và số float, gói RPC sẽ xử lý bất kỳ sự khác biệt nào giữa biểu diễn số nguyên và số float trên máy khách và máy chủ. Điều này đơn giản hóa việc triển khai các máy khách và máy chủ hoạt động trong các 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 Môi trường Máy tính Phân tán (DCE) của Tổ chức Phần mềm Mở (OSF). Chúng ta sẽ xem xét cách gọi thủ tục, thông báo trả về trông như thế nào và nó so với Gói Sun RPC, vì đây là gói được sử dụng bởi hệ thống tệp mạng. Phiên bản 2 của Sun RPC được mô tả trong RFC 1057 [Sun Microsystems 1988a].

Có hai loại Sun RPC. Một phiên bản được tạo 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 (không phụ thuộc vào truyền tải), được xây dựng bằng API TLI và hoạt động với bất kỳ lớp truyền tải nào được cung cấp bởi hạt nhân. 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 thông báo cuộc gọi thủ tục RPC sử dụng UDP.

Hình 29.1 Các thông báo cuộc gọi thủ tục RPC ở định dạng gói dữ liệu 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ứ sau tiêu đề UDP được xác định bởi gói RPC.

ID giao dịch (XID - transaction ID) do máy khách đặt và máy chủ trả về. Khi máy khách nhận được phản hồi, nó sẽ so sánh XID do 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 khi khách hàng 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 không thay đổi.

Biến cuộc gọi là 0 cho một cuộc gọi và 1 cho một phản hồi. Phiên bản RPC hiện tại là 2. Ba biến sau, 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 ví dụ khác, bạn có thể thấy ID số của người dùng và ID của nhóm mà anh ta thuộc về. Máy chủ có thể xem xét các quyền và quyết định có xử lý yêu cầu hay không. Xác minh (Verifier) ​​được sử dụng cho RPC an toàn (Secure RPC), sử dụng mã hóa DES. Mặc dù các trường ủy 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 được chuyển như một phần của trường.

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

Hình 29.2 cho thấy định dạng phản hồi RPC. Nó được gửi từ cuống máy chủ đến cuống máy khách khi thủ tục từ xa hoàn thành công việc của nó.

Hình 29.2 Định dạng thông báo phản hồi thủ tục RPC dưới dạng sơ đồ dữ liệu UDP.

XID của cuộc gọi chỉ được sao chép vào XID của phản hồi. Trường trả lời chứa 1 và trường này phân biệt giữa thử thách và phản hồi. Trường trạng thái chứa giá trị bằng 0 nếu tin nhắn cuộc gọi đã được nhận. (Thông báo có thể bị hủy 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 máy khách.) Trường trình xác minh được sử dụng trong trường hợp RPC an toàn để chỉ định máy chủ.

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

XDR: biểu diễn dữ liệu bên ngoài

Biểu diễn dữ liệu bên ngoài (XDR) là một tiêu chuẩn được sử dụng để mã hóa các giá trị trong bản tin 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 máy khách gọi một thủ tục trên 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ố kiểu dữ liệu nhất định và cách chính xác chúng được truyền trong một bản tin RPC (thứ tự bit, thứ tự byte, v.v.). Người gửi phải xây dựng thông điệp RPC ở định dạng XDR, sau đó người nhận sẽ chuyển đổi định dạng XDR thành biểu diễn ban đầu của nó. (Ở định dạng được chấp nhận cho hệ thống của anh ấy.) Ví dụ, chúng ta 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 ta đã hiển thị (XID, lệnh gọi, số chương trình, v.v.) là 4 byte số nguyên. Thật vậy, tất cả các số nguyên trong XDR chiếm 4 byte. XDR hỗ trợ các kiểu dữ liệu khác, bao gồm số nguyên không dấu, boolean, số dấu phẩy động, mảng có độ dài cố định, mảng có độ dài thay đổi và cấu trúc.

Bản đồ cảng

Các chương trình máy chủ RPC có 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 "đăng ký" để luôn biết cổng được chỉ định động nào mà một chương trình RPC nhất định đang sử dụng. Trong Sun RPC, công ty đăng ký này được gọi là bộ á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 bắt nguồn 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, trình ánh xạ cổng tên trên các hệ thống sử dụng TI-RPC (SVR4 và Solaris 2.2 chẳng hạn) đã được chuyển đổi thành rpcbind. Tuy nhiên, chúng ta sẽ tiếp tục sử dụng port mapper 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 được biết trước: 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ách sử dụng lệnh gọi RPC và máy khách truy vấn trình phân giải cổng bằng cách 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 gọi bởi máy chủ RPC 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 một chuyển đổi đã đăng ký trước đó.
  3. PMAPPROC_GETPORT. Được gọi bởi một máy khách RPC 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) vào 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 gọi bởi chương trình máy khách RPC, các bước sau sẽ diễn ra.

  1. Trình phân giải cổng phải 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ở một cách thụ động cổng TCP 111. Nó cũng tạo một điểm cuối UDP chờ một 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ó tạo một điểm cuối TCP và một điểm cuối UDP cho mỗi phiên bản được hỗ trợ của chương trình. (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ần thiết khi gọi một 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 cho dù số cổng TCP và UDP giống nhau 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 gọi thủ tục trình phân giải cổng từ xa, PMAPPROC_SET.
  3. Khi chương trình khách RPC khởi động, nó gọi thủ tục trình 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 nhất định.
  4. Máy khách gửi thông báo thách thức RPC đến số cổng có được trong bước 3. Nếu UDP được sử dụng, máy khách chỉ cần gửi sơ đồ UDP chứa thông báo thách thức RPC (Hình 29.1) đến 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 có 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ẽ mở hiện hoạt đối với số cổng TCP của máy chủ và sau đó gửi thông báo thách thức RPC qua kết nối. Máy chủ phản hồi bằng một thông báo phản hồi RPC qua kết nối.

Chương trình rpcinfo (8) in tất cả các cài đặt của trình phân giải cổng hiện tại. (Đây là nơi mà thủ tục trình phân giải cổng PMAPPROC_DUMP được gọi.) Sau đây là đầu ra điển hình:

Mặt trời % / usr / etc / rpcinfo -p
chương trình so với cổng proto
100005 1 tcp 702 mountd NFS daemon mount
100005 1 udp 699 mountd
100005 2 tcp 702 mountd
100005 2 udp 699 mountd

100003 2 udp 2049 nfs NFS chính nó

100021 1 tcp 709 trình quản lý khóa nlockmgr 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 tổ hợp số chương trình, số phiên bản và giao thức có ánh xạ số cổng riêng được trình phân giải cổng duy trì.

Cả hai phiên bản của daemon gắn kết đều có thể được truy cập thông qua cùng một số cổng TCP (702) và cùng một số cổng UDP (699), nhưng 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 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 truyền tệp. Sử dụng FTP, một bản sao hoàn chỉnh của tệp được thực hiện. NFS chỉ truy cập các phần của tệp được truy cập bởi tiến trình và ưu điểm chính của NFS là nó làm cho việc 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ộ cũng có thể 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 khách-máy chủ được xây dựng bằng Sun RPC. Máy khách NFS truy cập 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 thực hiện 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 thực hiện khác nhau, vì hai lý do. Đầu tiên, quyền truy cập vào các tệp NFS phải trong suốt đố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 quá trình người dùng của máy khách. Thứ hai, các máy chủ NFS được thực hiện bên trong hệ điều hành để nâng cao hiệu quả của máy chủ. Nếu máy chủ NFS là một quy trình của người dùng, thì 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 chuyển qua một dấu phân cách giữa nhân và quy trình người dùng, điều này nói chung là 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 lại trong RFC 1094 [Sun Microsystems 1988b]. Mô tả tốt nhất về Sun RPC, XDR và ​​NFS là 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 điểm kỹ thuật phiên bản 3 của giao thức NFS được triển khai vào năm 1993, mà chúng ta sẽ thảo luận trong một phần của chương này.

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

  1. Máy khách không quan tâm nếu nó truy cập vào tệp cục bộ hay tệp NFS. Kernel phát hiện ra điều này khi tệp được mở. Khi tệp được mở, hạt nhân 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 tham chiếu đến tệp NFS đượ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 biểu đồ 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 kết nối cứng với NFS trong hầu hết các triển khai.

Hình 29.3 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ý các yêu cầu của khách hàng. Ngay cả khi truy cập vào hệ thống tệp cục bộ cũng có thể mất một lúc. 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 phải được phục vụ. Để đối phó với tình huống này, hầu hết các máy chủ NFS được khởi động nhiều lần, có nghĩa là có nhiều máy chủ NFS bên trong hạt nhân. Các 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 hệ thống nhân Unix không "tồn tại" nhiều máy chủ NFS, mà thay vào đó chạy nhiều quy trình người dùng (thường được gọi là nfsd) thực hiện một lệnh gọi hệ thống duy nhất và vẫn ở bên trong nhân như một quy trình nhân.
  • 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ủ của máy khách. RPC được cấp cho máy chủ lưu trữ, sau đó sẽ có phản hồi. Để các tiến trình của người dùng trên máy khách có thể sử dụng NFS bất kỳ lúc nào, có một số máy khách NFS đang chạy bên trong nhân máy khách. Việc thực hiện cụ thể cũng phụ thuộc vào hệ điều hành. Một hệ thống Unix thường sử dụng một kỹ thuật tương tự như một máy chủ NFS: một quy trình người dùng được gọi là biod thực hiện một lệnh gọi hệ thống duy nhất và ở bên trong hạt nhân như một quy trình nhân.
  • 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. Hầu hết các triển khai PC (MS-DOS) chỉ có cá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 kí

    Số chương trình

    Số phiên bản

    Số lượng thủ tục

    bộ chuyển đổi cổng
    NFS
    chương trình gắn kết
    quản lý chặn
    giám sát 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 mà chúng tôi đã trình bày trong hình này dưới dạng các đơn vị được tìm thấy trên các hệ thống như SunOS 4.1.3. Các triển khai mới hơn 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 daemon gắn kết. SVR4 cũng hỗ trợ phiên bản 3 của bộ chuyển đổi cổng.

    Daemon 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 vào hệ thống tệp của máy chủ. Chúng tôi sẽ mô tả quá trình này dưới đây.

    Trình quản lý khóa và giám sát trạng thái cho phép máy khách khóa một số tệp có 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 client phải được xác thực trên cả host của client và server, còn bản thân NFS thì "không quan tâm". (Chúng ta sẽ nói thêm về sự thờ ơ của NFS bên dưới.) Các chương 9, 10 và 11 của [X / Open 1991] ghi lại các quy trình mà trình quản lý khóa và giám sát trạng thái sử dụng để khóa trên NFS.

    Bộ mô tả tệp

    Một trong những nguyên tắc cơ bản của NFS được thực hiện bởi các bộ mô tả tệp. Opaque được sử dụng để chỉ một tệp hoặc thư mục trên máy chủ đối tượng. Thuật ngữ không rõ ràng có nghĩa là máy chủ tạo một bộ mô tả tệp, chuyển nó trở lại máy khách, sau đó máy khách sẽ sử dụng khi truy cập tệp. Máy khách không bao giờ nhìn vào 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 trình xử lý tệp mỗi khi nó mở một tệp thực sự nằm trên máy chủ NFS. Khi một máy khách NFS đọc hoặc ghi vào tệp này (thay mặt cho quy trình của người dùng), bộ mô tả tệp được chuyển trở lại máy chủ. Điều này cho thấy rằng tệp đã được truy cập.

    Thông thường, một quy trình người dùng không xử lý các bộ mô tả tệp. Các bộ mô tả tệp được trao đổi bởi 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.

    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ố thế hệ inode (một số thay đổi mỗi khi một 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 kết NFS để gắn kết 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 khách hàng khởi động. Kết quả là máy khách nhận được một bộ mô tả tệp của hệ thống tệp của máy chủ.

    Hình 29.5 mô tả trình tự 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 Unix mount.

    Khi làm như vậy, các bước sau đượ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, daemon gắn kết (mountd) bắt đầu 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 chỉ định một số cổng được gán động cho mỗi điểm. Sau đó, nó đăng ký các số này với trình phân giải cổng.
    3. Máy khách thực thi lệnh mount, lệnh này đưa ra 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ừ daemon gắn kết của máy chủ. Cả TCP và UDP đều có thể được sử dụng để giao tiếp giữa máy khách và trình phân giải cổng, nhưng UDP thường được sử dụng.
    4. Bộ chuyển đổi cổng báo cáo số cổng.
    5. Lệnh mount đưa ra một lệnh gọi RPC tới daemon mount để gắn hệ thống tệp của máy chủ. Một lần nữa, cả TCP và UDP đều có thể được sử dụng, nhưng UDP thường được sử dụng. Bây giờ máy chủ có thể xác thực máy 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. Daemon mount phản hồi với một bộ mô tả tệp cho hệ thống tệp được chỉ định.
    7. Lệnh mount của máy khách đưa ra lệnh gọi hệ thống mount để liên kết bộ mô tả tệp thu được ở bước 5 với điểm gắn kết cục bộ trên máy chủ của máy khách. Bộ mô tả tệp được lưu trữ trong mã NFS của máy khách và từ đó trở đi, bất kỳ quá trình người dùng nào truy cập tệp trên hệ thống tệp của máy chủ sẽ sử dụng bộ mô tả tệp làm điểm bắt đầu.

    Việc triển khai như vậy chuyển giao 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 quy trình của người dùng chứ không phải là 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 quy trình của người dùng.

    Trong ví dụ này, trên máy chủ sun (máy khách NFS), 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ủ lưu trữ bsdi (máy chủ NFS) dưới dạng hệ thống tệp cục bộ / nfs / bsdi / usr. Hình 29.6 cho thấy kết quả.

    Hình 29.6 Gắn thư mục bsdi: / usr dưới dạng / nfs / bsdi / usr trên host sun.

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

    Quy trình NFS

    Máy chủ NFS cung cấp 15 thủ tục, bây giờ chúng ta sẽ mô tả. (Các số được sử dụng trong mô tả không khớp 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ỉ hệ thống Unix, một số quy trình dựa trên hành vi 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 chung, quyền thực thi, v.v.). Chương 4 chứa thêm thông tin về các đặc tính của hệ thống tệp, một số trong số đó được sử dụng bởi NFS.

    1. GETATTR. 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, kích thước tệp, chủ sở hữu tệp, thời gian truy cập cuối cùng, v.v.
    2. CÀI ĐẶT. Đặt thuộc tính tệp. Chỉ có thể đặt một số thuộc tính nhất định: quyền, chủ sở hữu, quyền sở hữu nhóm, kích thước, thời gian truy cập cuối cùng và thời gian sửa đổi cuối cùng.
    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. Thủ tục này được gọi bởi máy khách mỗi khi quy trình người dùng mở tệp nằm trên máy chủ NFS. Bộ mô tả tệp đượ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. Máy khách chỉ định một bộ mô tả tệp, độ lệch bắt đầu tính bằng byte và số byte tối đa để đọc (lên đến 8192).
    6. VIẾT. Ghi vào một tệp. Máy khách chỉ định bộ mô tả tệp, độ lệch byte bắt đầu, số byte được ghi và dữ liệu được ghi.

      Ghi NFS được yêu cầu phải đồng bộ (đang chờ xử lý). Máy chủ không thể phản hồi bằng OK cho đến khi dữ liệu (và bất kỳ thông tin nào khác về tệp cần được cập nhật) đã được ghi thành công vào đĩa.

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

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

    UDP hoặc 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 trong các mạng diện rộng, mạng ngày càng nhanh hơn. Do đó, việc sử dụng NFS không còn giới hạn trong 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 trả lại thay đổi trong một 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 diện rộng 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 tràn. Vì UDP không cung cấp bất kỳ thứ gì tương tự như các thuật toán này, chúng hoặc 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ả việc triển khai này. Chúng ta 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, máy chủ này đang hoạt động mở trên cổng TCP 2049, chờ yêu cầu kết nối từ máy khách. Điều này thường được thực hiện ngoài NFS UDP bình thường, nó sẽ lắng nghe các biểu đồ 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ẽ mở hiện hoạt 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ếu cùng một máy khách gắn kết một 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 "vẫn tồn tại" ở các đầu 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 thất bại hoặc khởi động lại của một hoặc 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ủ chia sẻ cùng một kết nối TCP cho hệ thống tệp đó. Ví dụ: nếu có một thư mục khác trên bsdi có tên smith bên dưới thư mục / usr, thì tệp truy cập trong / nfs / bsdi / usr / rstevens và / nfs / bsdi / usr / smith sẽ chia sẻ cùng một kết nối TCP.
    5. Nếu máy khách phát hiện máy chủ bị sự cố hoặc khởi động lại (sau khi nhận được lỗi TCP "kết nối đã hết thời gian chờ" hoặc "kết nối bị máy chủ đóng"), 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 lần mở đang hoạt động khác để thiết lập lại kết nối TCP cho hệ thống tệp này. Bất kỳ yêu cầu nào từ khách hàng đã hết thời gian trên kết nối trước đó sẽ được cấp lại trên kết nối mới.
    6. Nếu máy khách gặp sự cố, các ứng dụng đang chạy trước khi gặp sự cố cũng vậy. Khi máy khách khởi động lại, nó có thể sẽ 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ủ cho hệ thống tệp này đang ở trạng thái nửa mở (máy chủ cho rằng nó vẫn đang mở), tuy nhiên, vì máy chủ đã đặt tùy chọn "tồn tại", 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 "vẫn tồn tại."

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

    Ví dụ về NFS

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

    Ví dụ đơn giản: Đọc tệp

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

    Mặt trời % cat /nfs/bsdi/usr/rstevens/hello.c sao chép tệp vào thiết bị đầu cuối
    chính()
    {
    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 chất là / 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 ra điều này khi con mèo mở một tệp và sử dụng NFS để truy cập tệp. Hình 29.7 cho thấy đầu ra 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: 116 tra cứu "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 Hành vi của NFS khi đọc tệp.

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

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

    Trên dòng 1, máy khách gọi thủ tục GETATTR để lấy các thuộc tính của thư mục máy chủ mà máy khách đã gắn kết (/ 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.

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

    Trên dòng 5, máy khách LOOKUP hello.c bằng cách sử dụng bộ mô tả tệp từ dòng 4. Nó nhận một bộ mô tả tệp khác trên dòng 6. Bộ mô tả tệp mới này chính xác là những gì khách hàng sử dụng trên dòng 7 và 9 để tham chiếu đến tệp / nfs / bsdi / usr / rstevens / hello.c. Chúng tôi thấy rằng ứng dụng khách LOOKUP cho mỗi 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 thi GETATTR một lần nữa, tiếp theo là ĐỌC ở dòng 9. Máy khách yêu cầu 1024 byte, bắt đầu từ độ lệch 0, nhưng nhận được ít hơn 1024 byte dữ liệu. (Sau khi trừ kích thước của các trường RPC và các giá trị khác được trả về bởi thủ tục READ, 38 byte dữ liệu được trả về trên dòng 10. Đây chính xác là kích thước của hello.c.)

    Trong ví dụ này, quy trình người dùng không có kiến ​​thức về các yêu cầu và phản hồi NFS này được thực hiện bởi hạt nhân. Ứng dụng chỉ gọi hàm mở hạt nhân, hàm này gây ra trao đổi 3 yêu cầu và 3 phản hồi (dòng 1-6), sau đó gọi hàm đọc hạt nhân, hàm này gây ra 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

    Ví dụ khác, hãy thay đổi thư mục làm việc thành thư mục 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 đầu ra 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: 112 tra cứu "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 Hành vi của NFS khi thay đổi thư mục (cd) thành thư mục NFS và sau đó tạo thư mục (mkdir).

    Khi thay đổi thư mục, máy khách gọi thủ tục 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 không tồn tại), sau đó MKDIR để tạo thư mục (dòng 9 và 10). Phản hồi OK trên dòng 8 không có nghĩa là thư mục tồn tại. Nó chỉ đơn giản có nghĩa là thủ tục trả về một số giá trị. tcpdump không diễn giải giá trị được trả về bởi các 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 (những người chỉ trích NFS gọi nó là một cái mụn, không phải một tính năng) là máy chủ NFS không quan tâm. Máy chủ không quan tâm máy khách nào truy cập tệp nào. Lưu ý rằng không có thủ tục mở hoặc đóng trong danh sách các thủ tục NFS được hiển thị trước đó. Thủ tục 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 thờ ơ" này là để giúp phục hồi sau sự cố máy chủ sau khi nó bị treo và khởi động lại dễ dàng hơn.

    Ví dụ: sự cố máy chủ

    Trong ví dụ sau, chúng tôi đang đọc 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ủ cho phép máy khách "không biết" rằng máy chủ đang bị lỗi như thế nào. Trong toàn bộ thời gian máy chủ bị treo và khởi động lại, ứng dụng khách không biết về sự cố và ứng dụng khách hoạt động giống như trước đây.

    Trên ứng dụng khách sun, chúng tôi đã bắt đầu 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 khi chuyển tiếp, 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 định cấu hình để đọc 1024 byte cho mỗi lần đọc NFS. Hình 29.9 cho thấy đầu ra của tcpdump.

    Các dòng 1-10 tương ứng với ứng dụng khách đang mở tệp. Thao tác 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ả lại ở dòng 12. Điều này tiếp tục cho đến dòng 129 (đọc ĐỌC 1024 byte và sau đó là phản hồi OK).

    Trên dòng 130 và 131, chúng ta thấy hai yêu cầu hết thời gian chờ và được truyền lại ở dòng 132 và 133. Câu hỏi đầu tiên: chúng ta thấy hai yêu cầu đọc, một yêu cầu bắt đầu ở độ lệch 65536 và yêu cầu kia bắt đầu ở độ lệch 73728, tại sao? Nhân máy khách đã xác định rằng ứng dụng khách đang thực hiện đọ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 đã bắt đầu một số daemon I / O khối NFS (quy trình sinh học) 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), trong khi những daemon khác đọc 8192 byte bắt đầu từ 73728.

    Việc truyền lại ứng dụng khách xuất hiện trong các dòng 130-168. Trên dòng 169, chúng ta thấy rằng máy chủ đã khởi động lại và gửi một yêu cầu ARP trước khi phản hồi yêu cầu NFS của khách hàng từ dòng 168. Phản hồi cho dòng 168 được gửi trên dòng 171. Các yêu cầu ĐỌC của 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 lần đọ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ủ được khởi động lại

    169 311.149476 (0.0658) arp ai-có mặt trời nói với svr4
    170 311.150004 (0,0005) arp reply sun is-at 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 hiểu

    Hình 29.9 Máy khách đọ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ủ bị sập và khởi động lại, ngoại trừ việc tạm dừng 5 phút giữa các dòng 129 và 171, do đó, sự cố máy chủ là minh bạch đối với ứng dụng khách.

    Để ước tính khoảng thời gian hết thời gian truyền lại trong ví dụ này, hãy tưởng tượng rằng có hai daemon ứng dụng khách, mỗi daemon có thời gian chờ riêng. Các khoảng thời gian cho daemon đầu tiên (đọc ở độ lệch 65536) gần như 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à như vậy. Các khoảng thời gian cho daemon thứ hai (đọc ở độ lệch 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 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.

    Khách hàng sẽ tiếp tục truyền lại trong bao lâu? Khách hàng có hai tùy 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 kết cứng, máy khách sẽ truyền lại mãi mãi, tuy nhiên, nếu hệ thống tệp của máy chủ được gắn kết 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, ứng dụng khách có tùy chọn cho phép người dùng hủy truyền lại không thành công hoặc không hủy bỏ. Nếu, khi mount hệ thống tệp của máy chủ, máy chủ cho biết rằng có thể ngắt và nếu chúng tôi không muốn đợi 5 phút để máy chủ khởi động lại sau sự cố, chúng tôi có thể nhập ký tự 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 thực thi nhiều lần bởi máy chủ mà 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 phát hành lại cuộc gọi ĐỌC 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ủ gặp sự cố. Nếu máy chủ không gặp sự cố và các thư chứa phản hồi RPC bị mất (vì UDP không phải là giao thức đá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 được đọc lại và gửi đến máy khách.

    Điều này hoạt động bởi vì mọi yêu cầu ĐỌC đều chứa một phần bù bắt đầu. Nếu quy trình NFS đã yêu cầu máy chủ đọc N byte tiếp theo của tệp, nó sẽ không hoạt động. Nếu máy chủ không thờ ơ (đây là mặt trái của việc 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, kết quả sẽ khác. Đây là lý do tại sao các thủ tục NFS READ và WRITE có một phần bù bắt đầu. Nó là 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 hoạt động 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ột máy khách NFS đưa ra yêu cầu REMOVE để xóa một tệp; Máy chủ NFS xóa tệp và trả lời bằng OK; phản hồi máy chủ bị mất; NFS client 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 thông báo rằng tệp không tồn tại. Lỗi này được trả lại cho ứng dụng khách và lỗi này không chính xác - tệp không tồn tại và đã bị xóa.

    Sau đâ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 thủ tục không thể thực hiện nhiều lần: CREATE, REMOVE, RENAME, 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.

    Vì phản hồi bị mất luôn có thể xảy ra khi sử dụng UDP, máy chủ NFS phải có cách xử lý các hoạt động không thể thực hiện nhiều lần. Hầu hết các máy chủ có một bộ đệm ẩn phản hồi gần đây, trong đó chúng lưu trữ các phản hồi nhận được cuối cùng cho các hoạt động như vậy. Mỗi khi máy chủ nhận được một yêu cầu, trước tiên nó sẽ xem xét bộ nhớ cache của nó và nếu tìm thấy một kết quả phù hợp, nó sẽ trả về phản hồi trước đó thay vì gọi lại quy trình NFS. [Juszczak 1989] mô tả chi tiết về các loại bộ nhớ đệ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ột cách dễ dàng. Máy chủ DNS có thể truy vấn trình phân giải bất kỳ số lần nào, đ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, các thông số kỹ thuật đã được phát hành cho phiên bản 3 của giao thức NFS [Sun Microsystems 1993]. Việc triển khai dự kiến ​​sẽ có sẵn trong năm 1994.

    Dưới đây là tóm tắt về sự 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 kích thước cố định gồm 32 byte. Trong V3, đây là một mảng kích thước thay đổi với kích thước lên đến 64 byte. Một mảng có độ dài thay đổi trong XDR được xác định bằng số lượng 4 byte theo sau là các byte thực. Điều này làm giảm kích thước của bộ mô tả tệp trên các triển khai như Unix, nơi 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 quy trình READ hoặc WRITE RPC là 8192 byte. Giới hạn này không có hiệu lực trong V3, điều đó có nghĩa là sử dụng UDP, giới hạn sẽ chỉ là kích thước IP của datagram (65535 byte). Điều này cho phép các gói đọc và ghi lớn được sử dụng trên các mạng nhanh.
    3. Kích thước tệp và hiệu số byte bắt đầu cho các thủ tục ĐỌC và VIẾT đã được mở rộng từ 32 lên 64 bit, cho phép bạn làm việc với các tệp lớn hơn.
    4. Các thuộc tính của tệp được trả về trong mọi lệnh gọi có thể ảnh hưởng đến các thuộc tính. Điều này làm giảm số lượng cuộc gọi GETATTR mà máy khách yêu cầu.
    5. Ghi (WRITE) có thể không đồng bộ, trong khi trong phiên bản V2, chúng phải đồng bộ. Điều này có thể cải thiện hiệu suất của quy trình WRITE.
    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 đối với tệp), MKNOD (tạo tệp Unix đặc biệt), READDIRPLUS (trả về tên tệp trong thư mục cùng với thuộc tính của chúng), FSINFO (trả về thông tin thống kê về a hệ thống tệp), FSSTAT (trả về thông tin động về hệ thống tệp), PATHCONF (trả về thông tin POSIX.1 về tệp) và COMMIT (cam kết ghi không đồng bộ đã thực hiện trước đó vào bộ nhớ 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 về mạng được ẩn trong phần khai máy khách và máy chủ được tạo cho các ứng dụng bởi gói RPC và trong các quy trình thư viện RPC. Chúng tôi đã đưa ra định dạng của thông báo phản hồi và thử thách RPC và đề 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 máy có kiến ​​trúc 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ủ ở hầu hết mọi kích thước. Chúng tôi đã xem xét NFS và cách nó sử dụng UDP hoặc TCP. Có 15 thủ tục được định nghĩa trong giao thức NFS Phiên bản 2 (NFS Phiên bản 2).

    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 đó trình mô tả tệp được trả lại 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ủ từng phần tử tên tại một thời điểm, với một bộ mô tả tệp mới được trả về cho mỗi phần tử. Kết quả cuối cùng là một xử lý đối với tệp đã được truy cập và được sử dụng cho các lần đọc và ghi tiếp theo.

    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ể dễ dàng phát hành 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ề điều này trong 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 tin là các yêu cầu và phản hồi NFS, và in XID khi làm như vậy. Tcpdump có thể làm điều này cho bất kỳ yêu cầu hoặc phản hồi RPC nào không?
  • Bạn nghĩ tại sao trên hệ thống Unix, chương trình máy chủ RPC sử dụng các cổng được gán động hơn là những cổng đã biết?
  • 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ẽ biểu đồ thời gian của những gì máy khách và máy chủ trao đổi. (Hãy tưởng tượng rằng không mất thời gian để chuyển một thông điệp từ máy khách đến máy chủ và ngược lại.)
  • Điều gì xảy ra trong ví dụ trong Hình 29.9 nếu trong khi máy chủ NFS không hoạt động, bo mạch Ethernet của nó đã bị xóa?
  • Khi máy chủ khởi động lại trong Hình 29.9, nó đã xử lý yêu cầu bắt đầu từ độ lệch 65536 (dòng 168 và 171) và sau đó xử lý yêu cầu tiếp theo bắt đầu từ độ lệch 66560 (dòng 172 và 173). Điều gì xảy ra với một truy vấn bắt đầu tại khoảng cách 73728 (dòng 167)?
  • Khi chúng tôi mô tả các thủ tục độc lập với việc thực thi NFS, chúng tôi đã đưa ra một ví dụ về phản hồi REMOVE bị mất trên 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, rất ít số cổng dành riêng (Chương 1, phần Số cổng), với tối đa 1023 trên mỗi máy chủ. Nếu một máy chủ NFS yêu cầu máy khách của nó có các cổng dành riêng (mà nó thường làm) và một máy khách NFS sử dụng TCP gắn kết N hệ thống tệp trên N máy chủ khác nhau, thì máy khách có cần phải có số cổng dành riêng khác nhau cho mỗi kết nối không?
  • Mình hướng dẫn trực tiếp cách cài đặt và cấu hình NFS (Network File System). NFS là một hệ thống tệp mạng cho phép bạn truy cập các tệp và thư mục trên một máy tính từ xa (máy chủ) như thể các 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 hơn, vì dữ liệu dùng chung được lưu trữ trên một máy riêng (kho dữ liệu) và có sẵn cho các máy khác trong mạng. NFS là một ứng dụng khách-máy chủ nơi vai trò lưu trữ được chỉ định cho máy chủ. Mỗi thành viên mạng là một máy khách NFS gắn ổ đĩa mạng của máy chủ trong hệ thống tệp của nó.

    Hãy lấy Ubuntu 12.04 làm máy chủ.
    Chúng tôi sẽ sử dụng và thử nghiệm Centos và Winows 7 với tư cách là khách hàng.

    Máy chủ chính: 192.168.2.213 (Ubuntu)

    Máy khách: 192.168.2.72 (Centos), 192.168.2.180 (Windows)

    Điều chỉnh máy chủ

    Đầu tiên bạn cần thiết lập máy chủ. Vì chúng tôi sẽ sử dụng Ubuntu làm máy chủ nên chúng tôi cần cài đặt gói phù hợp

    [email được bảo vệ]: ~ # apt-get install nfs-kernel-server

    Sau khi cài đặt gói yêu cầu, chúng tôi đã tạo hai tệp cấu hình. Từ nhật ký cài đặt:

    … Tạo tệp cấu hình /etc/idmapd.conf với phiên bản mới Tạo tệp cấu hình / etc / default / nfs-common với phiên bản mới…

    Tệp đầu tiên mô tả người dùng (được tạo khi cài đặt gói) và nhóm, tham gia vào việc lập bản đồ-e (nhận dạng người dùng).

    [email được bảo vệ]: ~ # cat /etc/idmapd.conf Verbosity = 0 Pipefs-Directory = / run / rpc_pipefs # hãy đặt tên miền của riêng bạn tại đây, nếu id khác với FQDN trừ tên máy chủ # Tên miền = tên miền địa phương Nobody-User = nothing Nobody-Group = nogroup

    Như chúng ta đã biết, trong Linux, mỗi tệp thuộc về một người dùng cụ thể có (UID, GID) của riêng họ, nhưng trên hệ thống Windows, sơ đồ này hơi khác một chút. Và về mặt này, cơ chế ánh xạ đã được phát minh, giúp cho việc dịch những người dùng khác nhau từ các hệ điều hành khác nhau sang một dạng dễ hiểu đối với hệ thống tệp Linux.
    Tệp thứ hai là cần thiết để định cấu hình xác thực Kerberos và định cấu hình một cổng không chuẩn mà daemon sẽ lắng nghe. Chúng tôi chưa cần anh ấy. Cấu hình Kerberos sẽ được thảo luận trong bài viết tiếp theo.

    [email được bảo vệ]: ~ # cat / etc / default / nfs-common # Nếu bạn không đặt giá trị cho các tùy chọn NEED_, chúng sẽ được thử # tự động phát hiện; điều này sẽ đủ cho hầu hết mọi người. Các lựa chọn thay thế hợp lệ # cho các tùy chọn NEED_ là "có" và "không". # Bạn có muốn khởi động daemon trạng thái không? Nó không cần thiết cho NFSv4. NEED_STATD = # Tùy chọn cho rpc.statd. # Có nên nghe rpc.statd trên một cổng cụ thể không? Điều này đặc biệt hữu ích # khi bạn có tường lửa dựa trên cổng. Để sử dụng một cổng cố định, hãy đặt # biến này thành đối số statd như: "--port 4000 --outgoing-port 4001". # Để biết thêm thông tin, hãy xem rpc.statd (8) hoặc http://wiki.debian.org/SecuringNFS STATDOPTS = # Bạn có muốn khởi động trình nền gssd không? Nó là bắt buộc đối với các ngàm Kerberos. NEED_GSSD =

    Bây giờ chúng ta hãy tiếp tục với thiết lập.
    Tất cả các thư mục để chia sẻ phải được đăng ký trong tệp / etc / export. Để bắt đầu, hãy tạo 2 thư mục trong thư mục chính và thả các tệp vào chúng. Cây thư mục và tệp để xuất:

    [email được bảo vệ]: ~ # cây / nhà / alex / / nhà / alex /

    Bây giờ bạn cần chỉ định một người dùng và một nhóm cho các thư mục này (chúng tôi lấy nó từ tệp /etc/idmapd.conf).

    [email được bảo vệ]: ~ # chown -R nothing: nogroup nfs_dir1 / [email được bảo vệ]: ~ # chown -R nothing: nogroup nfs_dir2 /

    Đầu tiên, hãy xuất thư mục nfs_dir1 cho một IP cụ thể. Chỉnh sửa tệp / etc / expoles.

    [email được bảo vệ]: ~ # vim / etc / export # Đối với một máy chủ cụ thể (Windows) / home / alex / nfs_dir1 192.168.2.180 (rw, sync, all_squash, no_subtree_check, không an toàn) # Đối với bất kỳ máy chủ nào trên subnet / home / alex / nfs_dir2 192.168 .2.0 / 24 (rw, no_root_squash, đồng bộ hóa, no_subtree_check)

    Tại đây, bạn có thể thấy tập hợp các tùy chọn tối thiểu để hoạt động chính xác của bộ lưu trữ với Hệ điều hành Windows.

    • / home / alex / nfs_dir1- đường dẫn đến thư mục mà quyền truy cập đang được phân phối;
    • 192.168.2.180 - Địa chỉ IP mà quyền truy cập vào thư mục được phân phối (bạn có thể chỉ định toàn bộ mạng, khi đó mục nhập sẽ có dạng 192.168.2.0/24)
    • (rw, đồng bộ hóa, all_squash, no_subtree_check)- một tập hợp các tùy chọn.

    Các tùy chọn phổ biến:

    • rw–Read / write (có thể nhận giá trị ro-read-only);
    • 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 thư mục chia sẻ của máy chủ. Với tùy chọn này, chúng tôi loại bỏ hạn chế này. Vì lý do bảo mật, tốt hơn là không nên làm điều này;
    • đồng bộ hóa- chế độ truy cập đồng bộ (có thể lấy giá trị ngược lại - không đồng bộ);
    • không truy cập- 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 giới hạn quyền truy cập trong thư mục con chỉ cho một số người dùng.
    • all_squash- ngụ ý rằng tất cả các kết nối sẽ được thực hiện từ một người dùng ẩn danh (cần thiết cho một máy khách Windows)
    • anonuid = 1000 - liên kết một người dùng ẩn danh với một người dùng "cục bộ";
    • anongid = 1000 - liên kết người dùng ẩn danh với nhóm người dùng "cục bộ".
    • no_subtree_check (subtree_check)- nếu một thư mục con của hệ thống tệp được xuất, nhưng không phải toàn bộ hệ thống tệp, máy chủ sẽ kiểm tra xem tệp được yêu cầu có nằm trong thư mục con được xuất hay không. Việc tắt xác minh làm giảm tính bảo mật nhưng lại tăng tốc độ truyền dữ liệu.
    • Thông thường, Linux (và các hệ điều hành giống Unix khác) dự trữ các cổng TCP và UDP từ 1-1023 (được gọi là cổng an toàn) để sử dụng bởi các quy trình của người dùng gốc. Để đảm bảo rằng chính người chủ đã khởi tạo kết nối NFS từ xa, máy chủ NFS thường yêu cầu các máy khách từ xa sử dụng các cổng an toàn. Tuy nhiên, quy ước này không được một số hệ điều hành (ví dụ như Windows) tôn trọng. Trong những trường hợp như vậy, tùy chọn không an toàn cho phép máy khách NFS sử dụng bất kỳ cổng TCP / UDP nào. Nó thường được yêu cầu khi phục vụ các máy khách Windows.

    Tất cả các tùy chọn và cú pháp có sẵn để ghi lại máy chủ, nhóm máy chủ, v.v. có thể đọc trong sách hướng dẫn

    [email được bảo vệ]: ~ # exportfs -a

    Bây giờ chúng tôi kiểm tra những gì chúng tôi đã xuất.

    [email được bảo vệ]: ~ # exportfs -v / home / alex / nfs_dir1 192.168.2.180 (rw, wdelay, all_squash, no_subtree_check, secure) / home / alex / nfs_dir2 192.168.2.0/24(rw,wdelay,no_root_squash,no_subtree_check)

    Máy chủ đã được cấu hình.

    Thiết lập khách hàng

    Thiết lập máy khách Windows

    Nếu không có thông báo lỗi. Bạn có thể bắt đầu gắn ở phía máy khách.
    Đầu tiên, bạn cần thêm NFS của dịch vụ (dịch vụ khách). Để làm điều này, hãy truy cập Bắt đầu -> Bảng điều khiển -> Chương trình và Tính năng và nhấp vào mục menu bên trái Bật hoặc tắt các tính năng của Windows. Trong cửa sổ xuất hiện, hãy chọn Ứng dụng khách cho NFS và bấm vào ĐƯỢC RỒI(Hình 1).


    Bức tranh 1

    Tiếp theo, bạn cần gắn ổ đĩa. Để làm điều này, bạn có thể sử dụng dòng lệnh hoặc chỉ cần nhấp vào Nhấp chuột phải vào My Computer và chọn Map Network Drive. Và nhập dòng \\ 192.168.2.213 \ home \ alex \ nfs_dir1. Đây là IP máy chủ và đường dẫn đến thư mục (Hình 2).


    Hình 2

    Nếu mọi thứ đều ổn, chúng ta sẽ thấy đĩa (Hình 3).


    Hình 3

    Điều tương tự có thể được thực hiện bằng cách sử dụng dòng lệnh (Hình 4).


    hinh 4

    Những sai lầm có thể xảy ra:

    Bạn sẽ không thể ánh xạ ổ đĩa mạng NFS sang HĐH Windows (Hình 5) nếu
    1. Ứng dụng khách NFS chưa được cài đặt
    2. Tường lửa được kích hoạt (không được định cấu hình)
    3. Không có mạng truy cập vào máy chủ
    4. Đã nhập các tùy chọn gắn kết không chính xác
    5. Chưa được cấu hình (không áp dụng cài đặt) xuất trên máy chủ.
    6. Thêm tùy chọn không an toàn trong cài đặt xuất


    Hình 5 - Lỗi kết nối ổ đĩa NFS mạng

    Bạn sẽ không thể thêm tệp vào hệ thống tệp được gắn kết (Hình 6) nếu:
    1. Quyền đối với thư mục không được đặt trên máy chủ (không ai: nogroup)
    2. Tùy chọn all_squash không được đặt trong cài đặt xuất
    3. Tùy chọn rw không được đặt trong cài đặt xuất


    Hình 6 - Lỗi khi thêm tệp vào đĩa NFS

    Cấu hình Centos Client

    Việc thiết lập hệ thống Linux khá đơn giản và không tốn nhiều công sức. Bạn chỉ cần cài đặt các gói cần thiết và gắn đĩa. Centos cần các gói sau

    # yum install nfs-utils nfs-utils-lib

    # mkdir -p / mnt / nfs # mount 192.168.2.213:/home/alex/nfs_dir1 / mnt / nfs # mount / dev / mapper / vg_slave-lv_root on / type ext4 (rw) proc on / proc type proc (rw) sysfs on / sys type sysfs (rw) devpts on / dev / pts type devpts (rw, gid = 5, mode = 620) tmpfs on / dev / shm type tmpfs (rw, rootcontext = "system_u: object_r: tmpfs_t: s0" ) / dev / sda1 on / boot type ext4 (rw) none on / proc / sys / fs / binfmt_misc type binfmt_misc (rw) sunrpc on / var / lib / nfs / rpc_pipefs type rpc_pipefs (rw) 192.168.2.213:/home/ alex / nfs_dir1 on / mnt / nfs type nfs (rw, vers = 4, addr = 192.168.2.213, clientaddr = 192.168.2.72)

    Trong trường hợp này, chúng tôi có thể thêm bất kỳ tệp và thư mục nào vào thư mục được gắn kết nfs_dir1 thay mặt cho bất kỳ người dùng hệ thống nào ( all_squash). Nhưng nếu chúng tôi gắn kết thư mục thứ hai nfs_dir2, thì CHỈ root mới có thể ghi vào nó, vì có một tùy chọn no_root_squash. Chung ta kiểm tra.

    # mkdir / mnt / dir1 # mkdir / mnt / dir2 # mount 192.168.2.213:/home/alex/nfs_dir1 / mnt / dir1 # mount 192.168.2.213:/home/alex/nfs_dir2/mnt / dir2 or # mount -t nfs4 -o rw, hard, intr, bg 192.168.2.213:/home/alex/nfs_dir2 / mnt / dir2 # echo "Hello"> / mnt / dir1 / file1 # echo "Hello"> / mnt / dir2 / file1 # su alex $ echo "Xin chào"> / mnt / dir1 / file1 $ echo "Xin chào"> / mnt / dir2 / file1 bash: / mnt / dir2 / file1: Quyền bị từ chối

    Có thể gắn cờ.

    Lá cờ Sự mô tả
    rw Gắn hệ thống tệp đọc / ghi (nó phải được máy chủ xuất ở chế độ đọc / ghi)
    thứ tự Gắn hệ thống tệp chỉ đọc
    bg Nếu mount hệ thống tệp không thành công (máy chủ không phản hồi), bạn nên đặt hoạt động ở chế độ nền và tiếp tục xử lý các yêu cầu mount khác
    cứng Nếu máy chủ gặp sự cố, các hoạt động cố gắng truy cập nó sẽ bị chặn cho đến khi máy chủ hoạt động trở lại
    mềm Nếu máy chủ không hoạt động, các hoạt động cố gắng truy cập nó sẽ không thành công với thông báo lỗi. Cờ này rất hữu ích để đặt nhằm ngăn quá trình treo trong trường hợp không thành công việc gắn các hệ thống tệp không quan trọng lắm.
    xâm nhập Cho phép bạn làm gián đoạn các thao tác bị chặn khỏi bàn phím (thông báo lỗi sẽ được đưa ra)
    nointr Không cho phép bạn làm gián đoạn các hoạt động bị chặn từ bàn phím
    retrans = n Chỉ định số lần yêu cầu phải được lặp lại trước khi thông báo lỗi được trả về (đối với hệ thống tệp được gắn với cờ mềm)
    timeo = n Chỉ định khoảng thời gian chờ cho các yêu cầu (trong phần mười giây)
    kích thước = n Đặt kích thước bộ đệm đọc thành n byte
    wsize = fl Đặt kích thước bộ đệm ghi thành n byte
    sec = mode Đặt chế độ bảo mật
    vers = n Đặt phiên bản giao thức NFS
    proto = giao thức Chọn một giao thức truyền tải; nó phải là giao thức tcp cho NVS phiên bản 4

    Bạn cũng có thể kiểm tra từ bảng điều khiển xem máy chủ đã xuất hệ thống tệp chính xác hay chưa.

    [email được bảo vệ]~ # showmount -e 192.168.2.213 Xuất danh sách cho 192.168.2.213: / home / alex / nfs_dir2 192.168.2.0/24 / home / alex / nfs_dir1 192.168.2.180

    Thêm gắn kết vào tự động tải

    # cat / etc / fstab ... 192.168.2.213:/home/alex/nfs_dir2 / mnt / dir2 nfs4 rw, bg, intr, hard, nodev, nosuid 0 0

    [email được bảo vệ]~ # mount -a -t nfs4

    Những sai lầm có thể xảy ra.

    [email được bảo vệ]~ # mount -a -t nfs4 mount.nfs4: mount point / mnt / dir2 không tồn tại [email được bảo vệ]~ # mount -a -t nfs4 mount.nfs4: chia sẻ từ xa không ở định dạng "host: dir"

    Trong trường hợp đầu tiên, bạn cần tạo một thư mục. Trong thứ hai - lỗi cú pháp trong fstab.
    Nếu bạn gặp lỗi khi gắn phân vùng NFS, hãy xem qua danh sách Những sai lầm có thể xảy ra từ phần trước.
    Bạn cũng có thể sử dụng autofs để gắn kết các phân vùng NFS. Những gì sẽ được thảo luận trong.

    ”Và bạn đã có ý tưởng về“ hệ thống tệp mạng ”, khả năng và mức độ bảo mật của nó. Tuy nhiên, trong bài viết này, mọi thứ được giải quyết chủ yếu từ quan điểm của khách hàng ... nhưng nếu bạn muốn có một máy chủ NFS của riêng mình thì sao? (lưu ý: "to fuck" không có nghĩa là "break", mà có nghĩa là "cài đặt và cấu hình").

    Vâng, nếu bạn có mong muốn như vậy, thì câu hỏi đầu tiên mà bạn nên tự hỏi mình là: “Điều gì cho một chiếc đàn accordion nút dê?”. Để thiết lập một máy chủ NFS tại nhà
    khá vô nghĩa - không ai đánh giá cao nó, nhưng nếu bạn đủ may mắn để quản lý trong văn phòng của "những người đàn ông mặc đồ đen", hoặc trong "Mạng gia đình" mới - thì đó là một vấn đề hoàn toàn khác ...

    Bản thân việc khởi động máy chủ là một vấn đề khá đơn giản, nếu bạn đọc bài viết trước thì bạn có thể thực hiện nó khá tốt. Vì vậy, bạn sẽ cần các daemon sau:

    • nfsd - bảo trì giao thức trực tiếp
      NFS;
    • mountd - duy trì hoạt động của mount;
    • rpc.portmap - daemon cổng RPC; cần thiết vì các yêu cầu đến máy chủ NFS được truyền dưới dạng các gói
      RPC;

    Làm thế nào để làm nó? Rất đơn giản - truy cập tệp "/etc/rc.d/rc.inet2" và bỏ ghi chú các dòng thích hợp. Mọi thứ có thể được coi là khởi động ban đầu đã được thực hiện, nó sẽ khó khăn hơn một chút để thiết lập tất cả ...
    Điều đầu tiên để quyết định là ai và những quyền gì có liên quan đến thông tin này hoặc thông tin đó. Điều này được định cấu hình thông qua tệp "/ etc / export". Quyền là "đọc" và "đọc và ghi". Cách cấu hình điều này được mô tả trong phần "Khái niệm cơ bản
    NFS.

    Tất nhiên, thứ hai là tải trên máy chủ, tức là số lượng người dùng đang hoạt động và yêu cầu gần đúng của họ. Các yêu cầu tới máy chủ NFS thường được chia thành hai loại: loại thứ nhất - khi máy khách làm việc với các thuộc tính, loại thứ hai - khi máy khách trực tiếp yêu cầu dữ liệu. Các yêu cầu thuộc loại đầu tiên là tìm kiếm tệp, đọc danh sách quyền, v.v., tất nhiên, bạn hiểu rằng chúng tải nhẹ mạng. Yêu cầu của loại thứ hai là chuyển và nhận trực tiếp nội dung của tệp từ khách hàng; và đây là nơi đặt ra câu hỏi: "cái gì và tần suất sẽ được truyền đi?" Điều này đặc biệt phù hợp nếu bạn có mạng 10 Mbps (hay nói cách khác là mạng tiêu chuẩn của Nga). Nếu bạn biết, thì 10 Mb / giây là hơn 1 Mb / giây một chút; Đương nhiên, nếu các tệp có kích thước hàng chục MB được chuyển liên tục, mạng sẽ chết. Nếu đây là tình huống của bạn, thì bạn sẽ cần phải cài đặt bộ nhớ đệm dữ liệu trên máy khách (daemon biod). Sau đó, khi yêu cầu tệp và truy cập lại, máy khách sẽ không “tải xuống” lại từ máy chủ mà sẽ lấy tệp đó từ bộ nhớ cache; Đồng thời, nó sẽ thường xuyên được kiểm tra xem tệp trên máy chủ có thay đổi hay không, nếu sự thay đổi được phát hiện, thì tệp trong bộ nhớ cache sẽ được thay thế bằng “phiên bản mới”.
    (như bạn hiểu, việc kiểm tra “tệp đã thay đổi hay chưa” là một truy vấn “theo thuộc tính”, thường nhỏ hơn hàng trăm lần so với chính tệp đó).

    Chà: chúng tôi đã khởi chạy máy chủ NFS, xác định quyền truy cập, tìm ra tải ... Bây giờ, nó vẫn còn để điền vào vít các thông tin cần thiết và sử dụng
    Khả năng NFS ở mức tối đa ...

    Thay cho một kết luận:

    Nếu bạn đang phải đối mặt với câu hỏi tổ chức trao đổi dữ liệu trên mạng, thì đừng ngần ngại chọn NFS - NFS cao hơn ba đầu so với một đầu
    FTP là phần đầu và vai bên trên “quả bóng” vít và không quá khó để thiết lập ...

    Không phải ai cũng quen thuộc với các giao thức truyền dữ liệu. Nhưng nhiều người muốn kết nối máy tính của họ với một mạng hoặc sử dụng máy chủ để lưu trữ tệp. Một cách để làm điều này là NFS. Cách thiết lập máy chủ NFS trong Ubuntu - đọc tiếp.

    Bằng cách định cấu hình NFS đúng cách, bạn có thể kết hợp các máy tính trên các hệ điều hành khác nhau thành một mạng.

    Hệ thống tệp mạng là một giao thức để truy cập mạng vào tệp. Như thường lệ, nó bao gồm hai phần. Một - máy khách, được đặt trên máy tính mà từ đó dữ liệu từ xa được xem. Một - máy chủ - được đặt trên máy tính nơi dữ liệu này được lưu trữ. Việc sử dụng thêm dung lượng ổ đĩa khá tiện dụng, đặc biệt là trên mạng cục bộ. Và nếu chúng ta đang nói về một số PC công ty, thì điều này đơn giản là cần thiết.

    Sự khác biệt là gì?

    Ngày nay có một số lượng lớn các giao thức và nhiều loại phần mềm thực hiện các chức năng giống nhau. Điều gì làm cho NFS nổi bật?

    • Khả năng kết nối trong một mạng máy tính trên các hệ điều hành khác nhau. Thường thuận tiện khi kết nối hệ điều hành Windows qua NFS với hệ thống Unix, chẳng hạn như Ubuntu. Samba tồn tại và được sử dụng cho các mục đích tương tự, nhưng NFS nhẹ hơn, đơn giản hơn và nhanh hơn chương trình này, vì nó được thực hiện ở cấp hạt nhân. Do đó, việc thiết lập quyền truy cập thông qua nó, như một quy luật, sẽ dễ dàng hơn.
    • NFS cung cấp quyền truy cập minh bạch vào các tệp. Điều này có nghĩa là tất cả các tệp từ xa được phát giống hệt như các tệp cục bộ. Các chương trình không cần phải nâng cấp để phát bất kỳ tệp nào nằm trên máy chủ.
    • NFS chỉ gửi phần được yêu cầu của tệp, không gửi toàn bộ tệp.

    Đối với công việc chính thức, bạn cần cài đặt Hệ thống Tệp Mạng trên ít nhất hai máy tính: máy chủ và máy khách. Đương nhiên, người mới bắt đầu sẽ phải đổ mồ hôi hầu hết trên phần máy chủ, vì ở đó cần phải “chia sẻ” (truy cập mở) các thư mục. Tuy nhiên, điều này là khá dễ dàng để làm.

    Giống như hầu hết các giao thức truyền dữ liệu, NFS là bất cứ thứ gì nhưng trẻ. Nó được phát triển vào năm 1984 và dành cho các hệ thống UNIX. Đây vẫn là vai trò chính của NFS, nhưng nhiều người nhận thấy rằng nó rất tiện lợi khi sử dụng nó để kết nối máy tính Windows với máy tính Linux. Ngoài ra, NFS rất phù hợp để phát nội dung đa phương tiện qua mạng gia đình cục bộ. Samba trong vai trò này thường bị treo và chậm lại.

    Cài đặt NFS back end

    Chúng tôi sẽ cài đặt phần máy chủ của giao thức trên Ubuntu 16.04. Đương nhiên, nếu bạn có phiên bản Máy chủ, thì quá trình này không có gì khác biệt. Chỉ là trong phiên bản Ubuntu truyền thống, một số hành động có thể được thực hiện bằng giao diện đồ họa.

    Chúng tôi cài đặt chương trình. Để thực hiện việc này, bạn có thể sử dụng trung tâm tải xuống ứng dụng hoặc chỉ cần nhập lệnh:

    sudo apt cài đặt nfs-kernel-server

    Sau đó, sẽ rất hữu ích khi kiểm tra tính đúng đắn của cài đặt. Bạn không cần phải làm điều này, nhưng chúng tôi vẫn sẽ kiểm tra. Chúng tôi nhập lệnh:

    Cổng phải là 2049 ở mọi nơi.

    Bây giờ chúng ta kiểm tra xem hạt nhân có hỗ trợ NFS hay không. Để thực hiện việc này, hãy nhập:

    cat / proc / filesystems | grep nfs

    Giá trị kết quả sẽ giống như sau: nodev nfsd

    Điều này có nghĩa là mọi thứ đang hoạt động bình thường. Nếu không, hãy nhập lệnh:

    Với nó, chúng tôi tự cài đặt mô-đun hạt nhân.

    Thêm giao thức vào tự động chạy. Không nhất thiết phải làm như vậy nhưng mỗi lần bật lên thì rất bất tiện. Một lần nữa, bạn có thể thêm nó bằng cách sử dụng một mục menu đặc biệt trong cài đặt hoặc bạn có thể tự làm điều đó bằng cách sử dụng lệnh:

    sudo systemctl cho phép nfs

    Vì vậy, chúng tôi đã cài đặt phần máy chủ, nó vẫn phải cấu hình chính xác và chuyển sang phần máy khách.

    Cài đặt

    Thiết lập NFS trong Ubuntu liên quan đến việc chia sẻ các thư mục nhất định.

    Ngoài việc chỉ cần mở quyền truy cập, bạn cũng phải chỉ định các tham số xác định khả năng của người dùng liên quan đến thư mục này.

    • rw - đọc và ghi tùy chọn này cho phép đọc và ghi các tệp trong thư mục.
    • ro - chỉ đọc - chỉ cho phép đọc thư mục.
    • đồng bộ hóa (mặc định) - tham số đảm bảo độ tin cậy của quá trình truyền. Nếu nó được bật, thì sẽ không thể chuyển nhiều tệp cùng lúc hoặc sang các máy tính khác nhau. Cài đặt này sẽ ngăn không cho các yêu cầu khác được trả lời. Ngăn mất dữ liệu nhưng quá trình truyền có thể chậm hơn.
    • async - đảo ngược của tham số trước đó. Việc chuyển giao nhanh hơn, nhưng có nguy cơ thất thoát thông tin.
    • an toàn - tùy chọn này chỉ cho phép sử dụng các cổng dưới 1024. Được bật theo mặc định.
    • không an toàn - cho phép sử dụng bất kỳ cổng nào.
    • nohide - nếu bạn gắn kết một số thư mục, trong đó có những thư mục lồng nhau, thì những thư mục lồng nhau, không giống thư mục mẹ, sẽ được hiển thị là trống. Tham số sẽ giúp khắc phục điều này.
    • anonuid - chỉ định uid cho ẩn danh. Đây là một ID người dùng đặc biệt.
    • Anongid - chỉ định gid cho ẩn danh. GID (ID nhóm) - một ID người dùng khác.
    • no_subtree_check - chức năng tắt kiểm tra cây con. Thực tế là nếu không có nó, NFS cũng kiểm tra thêm rằng người dùng chỉ truy cập vào các phần cần thiết của thư mục. Điều này làm chậm mọi thứ. Tham số này cho phép bạn tăng tốc độ, nhưng làm giảm tính bảo mật.

    Chúng tôi sẽ sử dụng chúng tùy thuộc vào những gì cần thiết trong một tình huống cụ thể.

    Hãy tạo một thư mục mới. Bạn cũng có thể sử dụng mới. Thư mục của chúng ta sẽ là / var / network.

    Bây giờ chúng ta cần thêm thư mục này vào tệp / etc / export. Tất cả các tệp và thư mục có quyền truy cập mạng mở đều được lưu trữ ở đó. Mục nhập sẽ trông như thế này:

    /var/network168.1.1(rw,async,no_subtree_check)

    192.168.1.1 là IP mà chúng tôi đang truyền. Hãy chắc chắn để chỉ định nó.

    Cập nhật bảng xuất:

    Bây giờ chúng ta hãy thử truy cập vào thư mục từ phía máy khách.

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

    ubuntu

    Kết nối một máy chủ được cấu hình với Ubuntu không khó. Điều này được thực hiện chỉ trong một vài lệnh.

    Cài đặt gói ứng dụng khách đặc biệt:

    sudo apt install nfs-common

    sudo mount 192.168.1.1:/var/network/ / mnt /

    Thư mục mạng đã được kết nối. Sử dụng df, bạn có thể kiểm tra tất cả các thư mục mạng được kết nối:

    Bạn cũng có thể kiểm tra cấp độ truy cập của mình bằng một lệnh đặc biệt:

    Gỡ bỏ hệ thống tệp như sau:

    Lệnh mount được sử dụng hầu hết ở mọi nơi. Nó chịu trách nhiệm cho quá trình gắn kết, tức là chuẩn bị không gian trên đĩa cứng để hệ điều hành sử dụng. Nghe có vẻ phức tạp, nhưng nếu chúng ta đơn giản hóa nó, hóa ra chúng ta chỉ cần chuyển các tệp mạng vào máy tính của mình trong một thư mục mới. Ở đây nó được gọi là / mnt /.

    các cửa sổ

    Với Windows, mọi thứ phức tạp hơn nhiều. Máy khách NFS có thể chạy trên tất cả các máy chủ Windows mà không gặp bất kỳ sự cố nào. Từ tiêu chuẩn, nó hiện diện trên:

    • Windows 7 Ultimate / Enterprise
    • Windows 8 / 8.1 Enterprise
    • Windows 10 Enterprise

    Không nơi nào khác được tìm thấy. Nếu bạn có một trong các phiên bản này, hãy làm như sau:

    1. Mở menu "Chương trình và Tính năng".
    2. Nhấp vào "Thêm thành phần".
    3. Chúng tôi tìm thấy NFS ở đó và chỉ đặt "Máy khách cho NFS", chúng tôi không cần thành phần khác.

    Sau khi kết nối, mọi thứ được gắn kết với cùng một lệnh:

    mount 192.168.1.1:/var/network/ / mnt /

    Bạn có thể ngắt kết nối nó như thế này:

    Các lệnh được nhập vào dấu nhắc lệnh chạy với tư cách quản trị viên. Sau đó, bạn có thể dễ dàng tìm thấy ổ đĩa mạng mong muốn bằng Explorer.

    Nhưng nếu không có máy khách cho NFS trên máy tính thì sao? Bạn có thể thử tải xuống phần mềm thông qua trang web của Microsoft hoặc từ các tài nguyên của bên thứ ba. Có thể là các lệnh hoặc hành động khác là cần thiết ở đây.

    Bây giờ bạn đã có hiểu biết cơ bản về cách bạn có thể sử dụng NFC và thiết lập đơn giản. Kiến thức này đủ để thiết lập quyền truy cập từ máy tính này sang máy tính khác. Hơn nữa, PC Windows cũng có thể hoạt động như một máy khách.