網路文件系統

SUN公司研製的系統

網路文件系統,英文Network File System(NFS)。是由SUN公司研製的UNIX表示層協議(pressentation layer protocol),能使使用者訪問網路上別處的文件就像在使用自己的計算機一樣。

定義


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

特點


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

演化


網路文件系統(NFS)是文件系統之上的一個網路抽象,來允許遠程客戶端以與本地文件系統類似的方式,來通過網路進行訪問。雖然 NFS 不是第一個此類系統,但是它已經發展並演變成 UNIX系統中最強大最廣泛使用的網路文件系統。NFS 允許在多個用戶之間共享公共文件系統,並提供數據集中的優勢,來最小化所需的存儲空間。
網路文件系統(NFS)從1984 年問世以來持續演變,並已成為分散式文件系統的基礎。當前,NFS(通過 pNFS 擴展)通過網路對分佈的文件提供可擴展的訪問。探索分散式文件系背後的理念,特別是,最近 NFS 文件進展。
NFS 的簡短歷史
第一個網路文件系統 — 稱為 File Access Listener — 由 Digital Equipment Corporation(DEC)在 1976 年開發。Data Access Protocol(DAP)的實施,這是 DECnet 協議集的一部分。比如 TCP/IP,DEC 為其網路協議發布了協議規範,包括 DAP。
NFS 是第一個現代網路文件系統(構建於 IP 協議之上)。在 20 世紀 80 年代,它首先作為實驗文件系統,由 Sun Microsystems 在內部完成開發。NFS 協議已歸檔為 Request for Comments(RFC)標準,並演化為大家熟知的 NFSv2。作為一個標準,由於 NFS 與其他客戶端和伺服器的互操作能力而發展快速。
標準持續地演化為 NFSv3,在 RFC 1813 中有定義。這一新的協議比以前的版本具有更好的可擴展性,支持大文件(超過 2GB),非同步寫入,以及將 TCP 作為傳輸協議,為文件系統在更廣泛的網路中使用鋪平了道路。在 2000 年,RFC 3010(由 RFC 3530 修訂)將 NFS 帶入企業設置。Sun 引入了具有較高安全性,帶有狀態協議的 NFSv4(NFS 之前的版本都是無狀態的)。今天,NFS 是版本 4.1(由 RFC 5661 定義),它增加了對跨越分散式伺服器的并行訪問的支持(稱為 pNFS extension)。
令人驚訝的是,NFS 已經歷了幾乎 30 年的開發。它代表了一個非常穩定的(及可移植)網路文件系統,它可擴展、高性能、並達到企業級質量。由於網路速度的增加和延遲的降低,NFS 一直是通過網路提供文件系統服務具有吸引力的選擇。甚至在本地網路設置中,虛擬化驅動存儲進入網路,來支持更多的移動虛擬機。NFS 甚至支持最新的計算模型,來優化虛擬的基礎設施。
NFS 架構
NFS 允許計算的客戶 — 伺服器模型(見圖 2)。伺服器實施共享文件系統,以及客戶端所連接的存儲。客戶端實施用戶介面來共享文件系統,並載入到本地文件空間當中。
在 Linux中,虛擬文件系統交換(VFS)提供在一個主機上支持多個併發文件系統的方法(比如 CD-ROM 上的 International Organization for Standardization [ISO] 9660,以及本地硬碟上的 ext3fs)。VFS 確定需求傾向於哪個存儲,然後使用哪些文件系統來滿足需求。由於這一原因,NFS 是與其他文件系統類似的可插拔文件系統。對於 NFS 來說,唯一的區別是輸入/輸出(I/O)需求無法在本地滿足,而是需要跨越網路來完成。
一旦發現了為 NFS 指定的需求,VFS 會將其傳遞給內核中的 NFS 實例。NFS 解釋 I/O 請求並將其翻譯為 NFS 程序(OPEN、ACCESSCREATE、READ、CLOSE、REMOVE 等等)。這些程序,歸檔在特定 NFS RFC 中,指定了 NFS 協議中的行為。一旦從 I/O 請求中選擇了程序,它會在遠程程序調用(RPC)層中執行。正如其名稱所暗示的,RPC 提供了在系統間執行程序調用的方法。它將封送 NFS 請求,並伴有參數,管理將它們發送到合適的遠程對等級,然後管理並追蹤響應,提供給合適的請求者。
進一步來說,RPC 包括重要的互操作層,稱為外部數據表示(XDR),它確保當涉及到數據類型時,所有 NFS 參與者使用相同的語言。當給定架構執行請求時,數據類型表示可能不同於滿足需求的目標主機上的數據類型。XDR 負責將類型轉換為公共表示(XDR),便於所有架構能夠與共享文件系統互操作。XDR 指定類型位元組格式(比如 float)和類型的位元組排序(比如修復可變長數組)。雖然 XDR 以其在 NFS 中的使用而聞名,當您在公共應用程序設置中處理多個架構時,它是一個有用的規範。
一旦 XDR 將數據轉換為公共表示,需求就通過網路傳輸給出傳輸層協議。早期 NFS 採用 Universal Datagram Protocol(UDP),但是,今天TCP 因為其優越的可靠性而更加通用。
在伺服器端,NFS 以相似的風格運行。需求到達網路協議棧,通過 RPC/XDR(將數據類型轉換為伺服器架構)然後到達 NFS 伺服器。NFS 伺服器負責滿足需求。需求向上提交給 NFS 守護進程,它為需求標示出目標文件系統樹,並且 VFS 再次用於在本地存儲中獲取文件系統。整個流程在圖 3 中有展示。注意,伺服器中的本地文件系統是典型的 Linux 文件系統(比如ext4fs)。因此,NFS 不是傳統意義上的文件系統,而是訪問遠程文件系統的協議。
對於高延遲網路,NFSv4 實現稱為 compound procedure 的程序。這一程序從本質上允許在單個請求中嵌入多個 RPC 調用,來最小化通過網路請求的 transfer tax。它還為響應實現回調模式。
NFS 協議
從客戶端的角度來說,NFS 中的第一個操作稱為 mountMount 代表將遠程文件系統載入到本地文件系統空間中。該流程以對mount(Linux 系統調用)的調用開始,它通過 VFS 路由到 NFS 組件。確認了載入埠號之後(通過 get_port 請求對遠程伺服器 RPC 調用),客戶端執行 RPC mount 請求。這一請求發生在客戶端和負責 mount 協議(rpc.mountd)的特定守護進程之間。這一守護進程基於伺服器當前導出文件系統來檢查客戶端請求;如果所請求的文件系統存在,並且客戶端已經訪問了,一個 RPC mount 響應為文件系統建立了文件句柄。客戶端這邊存儲具有本地載入點的遠程載入信息,並建立執行 I/O 請求的能力。這一協議表示一個潛在的安全問題;因此,NFSv4 用內部 RPC 調用替換這一輔助 mount 協議,來管理載入點。
要讀取一個文件,文件必須首先被打開。在 RPC 內沒有 OPEN 程序;反之,客戶端僅檢查目錄和文件是否存在於所載入的文件系統中。客戶端以對目錄的 GETATTR RPC 請求開始,其結果是一個具有目錄屬性或者目錄不存在指示的響應。接下來,客戶端發出 LOOKUP RPC 請求來查看所請求的文件是否存在。如果是,會為所請求的文件發出 GETATTR RPC 請求,為文件返回屬性。基於以上成功的 GETATTRs 和 LOOKUPs,客戶端創建文件句柄,為用戶的未來需求而提供的。
利用在遠程文件系統中指定的文件,客戶端能夠觸發 READ RPC 請求。READ 包含文件句柄、狀態、偏移、和讀取計數。客戶端採用狀態來確定操作是否可執行(那就是,文件是否被鎖定)。偏移指出是否開始讀取,而計數指出所讀取位元組的數量。伺服器可能返回或不返回所請求位元組的數量,但是會指出在 READ RPC 回復中所返回(隨著數據)位元組的數量。
NFS 中的創新
NFS 的兩個最新版本(4 和 4.1)對於 NFS 來說是最有趣和最重要的。讓我們來看一下 NFS 創新最重要的一些方面。
在 NFSv4 之前,存在一定數量的輔助協議用於載入、鎖定、和文件管理中的其他元素。NFSv4 將這一流程簡化為一個協議,並將對UDP 協議的支持作為傳輸協議移除。NFSv4 還集成支持 UNⅨ 和基於 Windows? 的文件訪問語義,將本地集成 NFS 擴展到其他操作系統中。
NFSv4.1 介紹針對更高擴展性和更高性能的并行 NFS(pNFS)的概念。要支持更高的可擴展性,NFSv4.1 具有腳本,與集群化文件系統風格類似的拆分數據/元數據架構。如 圖 4 所展示的,pNFS 將生態系統拆分為三個部分:客戶端、伺服器和存儲。您可看到存在兩個路徑:一個用於數據,另一個用於控制。pNFS 將數據布局與數據本身拆分,允許雙路徑架構。當客戶想要訪問文件時,伺服器以布局響應。布局描述了文件到存儲設備的映射。當客戶端具有布局時,它能夠直接訪問存儲,而不必通過伺服器(這實現了更大的靈活性和更優的性能)。當客戶端完成文件操作時,它會提交數據(變更)和布局。如果需要,伺服器能夠請求從客戶端返回布局。
pNFS 實施多個新協議操作來支持這一行為。LayoutGet 和 LayoutReturn 分別從伺服器獲取發布和布局,而 LayoutCommit 將來自客戶端的數據提交到存儲庫,以便於其他用戶使用。伺服器採用 LayoutRecall 從客戶端回調布局。布局跨多個存儲設備展開,來支持并行訪問和更高的性能。
數據和元數據都存儲在存儲區域中。客戶端可能執行直接 I/O ,給出布局的回執,而 NFSv4.1 伺服器處理元數據管理和存儲。雖然這一行為不一定是新的,pNFS 增加功能來支持對存儲的多訪問方法。當前,pNFS 支持採用基於塊的協議(光纖通道),基於對象的協議,和 NFS 本身(甚至以非 pNFS 形式)。
通過 2010 年 9 月發布的對 NFSv2 的請求,繼續開展 NFS 工作。其中以新的提升定位了虛擬環境中存儲的變化。例如,數據複製與在虛擬機環境中非常類似(很多操作系統讀取/寫入和緩存相同的數據)。由於這一原因,存儲系統從整體上理解複製發生在哪裡是很可取的。這將在客戶端保留緩存空間,並在存儲端保存容量。NFSv4.2 建議用共享塊來處理這一問題。因為存儲系統已經開始在後端集成處理功能,所以伺服器端複製被引入,當伺服器可以高效地在存儲後端自己解決數據複製時,就能減輕內部存儲網路的負荷。其他創新出現了,包括針對 flash 存儲的子文件緩存,以及針對 I/O 的客戶端提示(潛在地採用 mapadvise 作為路徑)。
NFS 的替代物
雖然 NFS 是在 UNⅨ 和 Linux 系統中最流行的網路文件系統,但它當然不是唯一的選擇。在 Windows? 系統中,ServerMessage Block [SMB](也稱為 CIFS)是最廣泛使用的選項(如同 Linux 支持 SMB一樣,Windows 也支持 NFS)。
最新的分散式文件系統之一,在 Linux 中也支持,是Ceph。Ceph 設計為容錯的分散式文件系統,它具有 UNⅨ 兼容的 Portable Operating System Interface(POSⅨ)。您可在 參考資料 中深入了解 Ceph。
其他例子包括 OpenAFS,是 Andrew 分散式文件系統的開源版(來自 Carnegie Mellon 和 IBM),GlusterFS,關注於可擴展存儲的通用分散式文件系統,以及 Lustre,關注於集群計算的大規模并行分散式文件系統。所有都是用於分散式存儲的開源軟體解決方案。
更進一步
NFS 持續演變,並與 Linux 的演變類似(支持低端、嵌入式、和高端性能),NFS 為客戶和企業實施可擴展存儲解決方案。關注 NFS 的未來可能會很有趣,但是根據歷史和近期的情況看,它將會改變人們查看和使用文件存儲的方法。