複製鏈接
請複製以下鏈接發送給好友

網絡文件系統

鎖定
網絡文件系統,英文Network File System(NFS),是由SUN公司研製的UNIX表示層協議(presentation layer protocol),能使使用者訪問網絡上別處的文件就像在使用自己的計算機一樣。 [1] 
中文名
網絡文件系統
外文名
Network File System
簡    稱
NFS
拼    音
wǎng luò wén jiàn xì tǒng
性    質
UNIX表示層協議
相關機制
遠程過程調用RPC機制

網絡文件系統定義

NFS是基於UDP/IP協議的應用,其實現主要是採用遠程過程調用RPC機制,RPC提供了一組與機器、操作系統以及底層傳送協議無關的存取遠程文件的操作。RPC採用了XDR的支持。XDR是一種與機器無關的數據描述編碼的協議,他以獨立與任意機器體系結構的格式對網上傳送的數據進行編碼和解碼,支持在異構系統之間數據的傳送。 [2] 

網絡文件系統演化

網絡文件系統(NFS)是文件系統之上的一個網絡抽象,來允許遠程客户端以與本地文件系統類似的方式,來通過網絡進行訪問。雖然 NFS 不是第一個此類系統,但是它已經發展並演變成UNIX系統中最強大最廣泛使用的網絡文件系統。NFS允許在多個用户之間共享公共文件系統,並提供數據集中的優勢,來最小化所需的存儲空間 [3] 
網絡文件系統(NFS)從1984 年問世以來持續演變,並已成為分佈式文件系統的基礎。當前,NFS(通過 pNFS 擴展)通過網絡對分佈的文件提供可擴展的訪問。 [3] 
第一個網絡文件系統稱為 File Access Listener — 由 Digital Equipment Corporation(DEC)在 1976 年開發。Data Access Protocol(DAP)的實施,這是 DECnet 協議集的一部分。比如 TCP/IP,DEC 為其網絡協議發佈了協議規範,包括DAP。 [3] 
NFS 是第一個現代網絡文件系統(構建於 IP 協議之上)。在 20 世紀 80 年代,它首先作為實驗文件系統,由 Sun Microsystems 在內部完成開發。NFS 協議已歸檔為 Request for Comments(RFC)標準,並演化為大家熟知的 NFSv2。作為一個標準,由於 NFS 與其他客户端和服務器的互操作能力而發展快速。 [3] 
標準持續地演化為 NFSv3,在 RFC 1813 中有定義。這一新的協議比以前的版本具有更好的可擴展性,支持大文件(超過 2GB),異步寫入,以及將 TCP 作為傳輸協議,為文件系統在更廣泛的網絡中使用鋪平了道路。在 2000 年,RFC 3010(由 RFC 3530 修訂)將 NFS 帶入企業設置。Sun 引入了具有較高安全性,帶有狀態協議的 NFSv4(NFS 之前的版本都是無狀態的)。NFS 最新版本是版本 4.1(由 RFC 5661 定義),它增加了對跨越分佈式服務器的並行訪問的支持(稱為 pNFS extension)。 [3] 
NFS 已經歷了幾乎 30 年的開發。它代表了一個非常穩定的(及可移植)網絡文件系統,它可擴展、高性能、並達到企業級質量。由於網絡速度的增加和延遲的降低,NFS 一直是通過網絡提供文件系統服務具有吸引力的選擇。甚至在本地網絡設置中,虛擬化驅動存儲進入網絡,來支持更多的移動虛擬機。NFS 甚至支持最新的計算模型,來優化虛擬的基礎設施。 [3] 

網絡文件系統特點

(1)提供透明文件訪問以及文件傳輸; [2] 
(2)容易擴充新的資源或軟件,不需要改變現有的工作環境; [2] 
(3) 高性能,可靈活配置。 [2] 

網絡文件系統工作原理

NFS(Network File System,網絡文件系統)是當前主流異構平台共享文件系統之一。主要應用在UNIX環境下。最早是由Sun Microsystems開發,現在能夠支持在不同類型的系統之間通過網絡進行文件共享,廣泛應用在FreeBSD、SCO、Solaris等異構操作系統平台,允許一個系統在網絡上與他人共享目錄和文件。通過使用NFS,用户和程序可以像訪問本地文件一樣訪問遠端系統上的文件,使得每個計算機的節點能夠像使用本地資源一樣方便地使用網上資源。換言之,NFS可用於不同類型計算機、操作系統、網絡架構和傳輸協議運行環境中的網絡文件遠程訪問和共享。 [4] 
NFS的工作原理是使用客户端/服務器架構,由一個客户端程序和服務器程序組成。服務器程序向其他計算機提供對文件系統的訪問,其過程稱為輸出。NFS客户端程序對共享文件系統進行訪問時,把它們從NFS服務器中“輸送”出來。文件通常以塊為單位進行傳輸。其大小是8KB(雖然它可能會將操作分成更小尺寸的分片)。NFS傳輸協議用於服務器和客户機之間文件訪問和共享的通信,從而使客户機遠程地訪問保存在存儲設備上的數據。 [4] 

網絡文件系統系統架構

NFS 允許計算的客户 — 服務器模型。服務器實施共享文件系統,以及客户端所連接的存儲。客户端實施用户接口來共享文件系統,並加載到本地文件空間當中。 [3] 
Linux中,虛擬文件系統交換(VFS)提供在一個主機上支持多個併發文件系統的方法(比如 CD-ROM 上的 International Organization for Standardization [ISO] 9660,以及本地硬盤上的 ext3fs)。VFS 確定需求傾向於哪個存儲,然後使用哪些文件系統來滿足需求。由於這一原因,NFS 是與其他文件系統類似的可插拔文件系統。對於 NFS 來説,唯一的區別是輸入/輸出(I/O)需求無法在本地滿足,而是需要跨越網絡來完成。 [3] 
一旦發現了為 NFS 指定的需求,VFS 會將其傳遞給內核中的 NFS 實例。NFS 解釋 I/O 請求並將其翻譯為 NFS 程序(OPEN、ACCESS、CREATE、READ、CLOSE、REMOVE 等等)。這些程序,歸檔在特定 NFS RFC 中,指定了 NFS 協議中的行為。一旦從 I/O 請求中選擇了程序,它會在遠程程序調用(RPC)層中執行。正如其名稱所暗示的,RPC 提供了在系統間執行程序調用的方法。它將封送 NFS 請求,並伴有參數,管理將它們發送到合適的遠程對等級,然後管理並追蹤響應,提供給合適的請求者。 [3] 
進一步來説,RPC 包括重要的互操作層,稱為外部數據表示XDR),它確保當涉及到數據類型時,所有 NFS 參與者使用相同的語言。當給定架構執行請求時,數據類型表示可能不同於滿足需求的目標主機上的數據類型。XDR 負責將類型轉換為公共表示(XDR),便於所有架構能夠與共享文件系統互操作。XDR 指定類型字節格式(比如 float)和類型的字節排序(比如修復可變長數組)。雖然 XDR 以其在 NFS 中的使用而聞名,當在公共應用程序設置中處理多個架構時,它是一個有用的規範。 [3] 
一旦XDR將數據轉換為公共表示,需求就通過網絡傳輸給出傳輸層協議。早期 NFS 採用 Universal Datagram ProtocolUDP),但是,今天TCP因為其優越的可靠性而更加通用。 [3] 
服務器端,NFS 以相似的風格運行。需求到達網絡協議棧,通過 RPC/XDR(將數據類型轉換為服務器架構) 然後到達 NFS 服務器。NFS 服務器負責滿足需求。需求向上提交給NFS守護進程,它為需求標示出目標文件系統樹,並且 VFS 再次用於在本地存儲中獲取文件系統。整個流程在圖 3 中有展示。注意,服務器中的本地文件系統是典型的 Linux 文件系統(比如 ext4fs)。因此,NFS 不是傳統意義上的文件系統,而是訪問遠程文件系統的協議。 [3] 
對於高延遲網絡,NFSv4 實現稱為 compound procedure 的程序。這一程序從本質上允許在單個請求中嵌入多個 RPC 調用,來最小化通過網絡請求的 transfer tax。它還為響應實現回調模式。 [3] 

網絡文件系統系統協議

從客户端的角度來説,NFS 中的第一個操作稱為 mount。Mount 代表將遠程文件系統加載到本地文件系統空間中。該流程以對 mount(Linux 系統調用)的調用開始,它通過 VFS 路由到 NFS 組件。確認了加載端口號之後(通過 get_port 請求對遠程服務器 RPC 調用),客户端執行 RPC mount 請求。這一請求發生在客户端和負責 mount 協議(rpc.mountd)的特定守護進程之間。這一守護進程基於服務器當前導出文件系統來檢查客户端請求;如果所請求的文件系統存在,並且客户端已經訪問了,一個 RPC mount 響應為文件系統建立了文件句柄。客户端這邊存儲具有本地加載點的遠程加載信息,並建立執行 I/O 請求的能力。這一協議表示一個潛在的安全問題;因此,NFSv4 用內部 RPC 調用替換這一輔助 mount 協議,來管理加載點。 [3] 
要讀取一個文件,文件必須首先被打開。在 RPC 內沒有 OPEN 程序;反之,客户端僅檢查目錄和文件是否存在於所加載的文件系統中。客户端以對目錄的 GETATTR RPC 請求開始,其結果是一個具有目錄屬性或者目錄不存在指示的響應。接下來,客户端發出 LOOKUP RPC 請求來查看所請求的文件是否存在。如果是,會為所請求的文件發出 GETATTR RPC 請求,為文件返回屬性。基於以上成功的 GETATTRs 和 LOOKUPs,客户端創建文件句柄,為用户的未來需求而提供的。 [3] 
利用在遠程文件系統中指定的文件,客户端能夠觸發 READ RPC 請求。READ 包含文件句柄、狀態、偏移、和讀取計數。客户端採用狀態來確定操作是否可執行(那就是,文件是否被鎖定)。偏移指出是否開始讀取,而計數指出所讀取字節的數量。服務器可能返回或不返回所請求字節的數量,但是會指出在 READ RPC 回覆中所返回(隨着數據)字節的數量。 [3] 

網絡文件系統創新性

NFS 的兩個最新版本(4 和 4.1)對於 NFS 來説是最有趣和最重要的。下面介紹一下NFS創新最重要的一些方面。 [3] 
在 NFSv4 之前,存在一定數量的輔助協議用於加載、鎖定、和文件管理中的其他元素。NFSv4 將這一流程簡化為一個協議,並將對 UDP 協議的支持作為傳輸協議移除。NFSv4 還集成支持 UNⅨ 和基於 Windows 的文件訪問語義,將本地集成 NFS 擴展到其他操作系統中。 [3] 
NFSv4.1 介紹針對更高擴展性和更高性能的並行 NFS(pNFS)的概念。要支持更高的可擴展性,NFSv4.1 具有腳本,與集羣化文件系統風格類似的拆分數據/元數據架構。pNFS 將生態系統拆分為三個部分:客户端、服務器和存儲。可看到存在兩個路徑:一個用於數據,另一個用於控制。pNFS 將數據佈局與數據本身拆分,允許雙路徑架構。當客户想要訪問文件時,服務器以佈局響應。佈局描述了文件到存儲設備的映射。當客户端具有佈局時,它能夠直接訪問存儲,而不必通過服務器(這實現了更大的靈活性和更優的性能)。當客户端完成文件操作時,它會提交數據(變更)和佈局。如果需要,服務器能夠請求從客户端返回佈局。 [3] 
pNFS 實施多個新協議操作來支持這一行為。LayoutGet 和 LayoutReturn 分別從服務器獲取發佈和佈局,而 LayoutCommit 將來自客户端的數據提交到存儲庫,以便於其他用户使用。服務器採用 LayoutRecall 從客户端回調佈局。佈局跨多個存儲設備展開,來支持並行訪問和更高的性能。 [3] 
數據和元數據都存儲在存儲區域中。客户端可能執行直接 I/O ,給出佈局的回執,而 NFSv4.1 服務器處理元數據管理和存儲。雖然這一行為不一定是新的,pNFS 增加功能來支持對存儲的多訪問方法。當前,pNFS 支持採用基於塊的協議(光纖通道),基於對象的協議,和 NFS 本身(甚至以非 pNFS 形式)。 [3] 
通過 2010 年 9 月發佈的對 NFSv2 的請求,繼續開展 NFS 工作。其中以新的提升定位了虛擬環境中存儲的變化。例如,數據複製與在虛擬機環境中非常類似(很多操作系統讀取/寫入和緩存相同的數據)。由於這一原因,存儲系統從整體上理解複製發生在哪裏是很可取的。這將在客户端保留緩存空間,並在存儲端保存容量。NFSv4.2 建議用共享塊來處理這一問題。因為存儲系統已經開始在後端集成處理功能,所以服務器端複製被引入,當服務器可以高效地在存儲後端自己解決數據複製時,就能減輕內部存儲網絡的負荷。其他創新出現了,包括針對 flash 存儲的子文件緩存,以及針對 I/O 的客户端提示 (潛在地採用 mapadvise 作為路徑)。 [3] 

網絡文件系統系統的替代物

雖然 NFS 是在 UNIX和 Linux 系統中最流行的網絡文件系統,但它當然不是唯一的選擇。在 Windows系統中,Server Message Block [SMB](也稱為 CIFS)是最廣泛使用的選項(如同 Linux 支持 SMB一樣,Windows 也支持 NFS)。 [3] 
最新的分佈式文件系統之一,在 Linux 中也支持,是 Ceph。Ceph 設計為容錯的分佈式文件系統,它具有 UNⅨ 兼容的 Portable Operating System Interface(POSⅨ)。可在參考資料中深入瞭解Ceph。 [3] 
其他例子包括 OpenAFS,是 Andrew 分佈式文件系統的開源版(來自 Carnegie Mellon 和 IBM),GlusterFS,關注於可擴展存儲的通用分佈式文件系統,以及 Lustre,關注於集羣計算的大規模並行分佈式文件系統。所有都是用於分佈式存儲的開源軟件解決方案。 [3] 
參考資料
  • 1.    沈健,王夢龍主編;畢雨,朱斌峯編著.Linux系統管理:華東理工大學出版社,2014.08:第103頁
  • 2.    劉湛,錢薇,李斯波. 網絡文件系統的數據一致性研究[J]. 艦船電子工程,2008,(07):157-161.
  • 3.    郭英見. 網絡文件系統(NFS)的工作原理和應用技術[J]. 計算機與通信,1996,(11):6-8.
  • 4.    王曉英等主編.計算機系統平台:中國鐵道出版社,2016.08:第187頁