NFS簡介及搭建
- 網路檔案系統
- 定義
- 演化
- 特點
- 作業原理
- 網路檔案系統架構
- 網路檔案系統協議
- 網路檔案系統中的創新
- 網路檔案系統的替代物
- 部署NFS
- 實驗環境
- 安裝nfs、rpcbind服務
- 在node1主機創建test目錄并給權限777
- 撰寫檔案/etc/exports
- 讓nfs生效,并開啟nfs和rpcbind服務
- 開啟防火墻
- 切換到node2主機進行創建掛載點目錄并進行掛載
- node1主機進行創建檔案,測驗一下是否同步
網路檔案系統
網路檔案系統,英文Network File System(NFS),是由SUN公司研制的UNIX表示層協議(presentation layer protocol),能使使用者訪問網路上別處的檔案就像在使用自己的計算機一樣,
定義
NFS是基于UDP/IP協議的應用,其實作主要是采用遠程程序呼叫RPC機制,RPC提供了一組與機器、作業系統以及低層傳送協議無關的存取遠程檔案的操作,RPC采用了XDR的支持,XDR是一種與機器無關的資料描述編碼的協議,他以獨立與任意機器體系結構的格式對網上傳送的資料進行編碼和解碼,支持在異構系統之間資料的傳送,
演化
網路檔案系統(NFS)是檔案系統之上的一個網路抽象,來允許遠程客戶端以與本地檔案系統類似的方式,來通過網路進行訪問,雖然 NFS 不是第一個此類系統,但是它已經發展并演變成 UNIX系統中最強大最廣泛使用的網路檔案系統,NFS 允許在多個用 戶之間共享公共檔案系統,并提供資料集中的優勢,來最小化所需的存盤空間,
網路檔案系統(NFS)從1984 年問世以來持續演變,并已成為分布式檔案系統的基礎,當前,NFS(通過 pNFS 擴展)通過網路對分布的檔案提供可擴展的訪問,
第一個網路檔案系統稱為 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(Network File System,網路檔案系統)是當前主流異構平臺共享檔案系統之一,主要應用在UNIX環境下,最早是由Sun Microsystems開發,現在能夠支持在不同型別的系統之間通過網路進行檔案共享,廣泛應用在FreeBSD、SCO、Solaris等異構作業系統平臺,允許一個系統在網路上與他人共享目錄和檔案,通過使用NFS,用戶和程式可以像訪問本地檔案一樣訪問遠端系統上的檔案,使得每個計算機的節點能夠像使用本地資源一樣方便地使用網上資源,換言之,NFS可用于不同型別計算機、作業系統、網路架構和傳輸協議運行環境中的網路檔案遠程訪問和共享,
NFS的作業原理是使用客戶端/服務器架構,由一個客戶端程式和服務器程式組成,服務器程式向其他計算機提供對檔案系統的訪問,其程序稱為輸出,NFS客戶端程式對共享檔案系統進行訪問時,把它們從NFS服務器中“輸送”出來,檔案通常以塊為單位進行傳輸,其大小是8KB(雖然它可能會將操作分成更小尺寸的分片),NFS傳輸協議用于服務器和客戶機之間檔案訪問和共享的通信,從而使客戶機遠程地訪問保存在存盤設備上的資料,
網路檔案系統架構
NFS 允許計算的客戶 — 服務器模型,服務器實施共享檔案系統,以及客戶端所連接的存盤,客戶端實施用戶介面來共享檔案系統,并加載到本地檔案空間當中,
在 Linux中,虛擬檔案系統交換(VFS)提供在一個主機上支持多個并發檔案系統的方法(比如 CD-ROM 上的 International Organization for Standardization [ISO] 9660,以及本地硬碟上的 ext3fs),VFS 確定需求傾向于哪個存盤,然后使用哪些檔案系統來滿足需求,由于這一原因,NFS 是與其他檔案系統類似的可插拔檔案系統,對于 NFS 來說,唯一的區別是輸入/輸出(I/O)需求無法在本地滿足,而是需要跨越網路來完成,
一旦發現了為 NFS 指定的需求,VFS 會將其傳遞給內核中的 NFS 實體,NFS 解釋 I/O 請求并將其翻譯為 NFS 程式(OPEN、ACCESS、CREATE、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 中的第一個操作稱為 mount,Mount 代表將遠程檔案系統加載到本地檔案系統空間中,該流程以對 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 的兩個最新版本(4 和 4.1)對于 NFS 來說是最有趣和最重要的,讓我們來看一下 NFS 創新最重要的一些方面,
在 NFSv4 之前,存在一定數量的輔助協議用于加載、鎖定、和檔案管理中的其他元素,NFSv4 將這一流程簡化為一個協議,并將對 UDP 協議的支持作為傳輸協議移除,NFSv4 還集成支持 UNⅨ 和基于 Windows? 的檔案訪問語意,將本地集成 NFS 擴展到其他作業系統中,
NFSv4.1 介紹針對更高擴展性和更高性能的并行 NFS(pNFS)的概念,要支持更高的可擴展性,NFSv4.1 具有腳本,與集群化檔案系統風格類似的拆分資料/元資料架構, 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 是在 UNIX和 Linux 系統中最流行的網路檔案系統,但它當然不是唯一的選擇,在 Windows系統中,Server Message 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
實驗環境
| IP | 服務 |
|---|---|
| 192.168.1.10 | nfs、rpcbind |
| 192.168.1.20 | nfs、rpcbind |
安裝nfs、rpcbind服務
192.168.1.10作為主服務器安裝
yum -y install nfs-utils rpcbind
保證互相能ping通
[root@node1 ~]# ping 192.168.1.20
PING 192.168.1.20 (192.168.1.20) 56(84) bytes of data.
64 bytes from 192.168.1.20: icmp_seq=1 ttl=64 time=0.531 ms
64 bytes from 192.168.1.20: icmp_seq=2 ttl=64 time=0.560 ms
------------------------------------------------------------
[root@node2 ~]# ping 192.168.1.10
PING 192.168.1.10 (192.168.1.10) 56(84) bytes of data.
64 bytes from 192.168.1.10: icmp_seq=1 ttl=64 time=0.435 ms
64 bytes from 192.168.1.10: icmp_seq=2 ttl=64 time=0.521 ms
64 bytes from 192.168.1.10: icmp_seq=3 ttl=64 time=0.315 ms
在node1主機創建test目錄并給權限777
[root@node1 ~]# mkdir /test
[root@node1 ~]# chmod 777 /test
撰寫檔案/etc/exports
[root@node1 ~]# vi /etc/exports
/test 192.168.1.20(rw,sync,no_root_squash)
#還可以設定其他權限ro權限為只讀,rw為可讀可寫
讓nfs生效,并開啟nfs和rpcbind服務
[root@node1 ~]# exportfs -rv
exporting 192.168.1.20:/test
exporting 192.168.1.20:/test to kernel
exportfs: 192.168.1.20:/test: Function not implemented
[root@node1 ~]# systemctl start nfs
[root@node1 ~]# systemctl start rpcbind
開啟防火墻
[root@node1 ~]# firewall-cmd --add-service=nfs --permanent
success
[root@node1 ~]# firewall-cmd --add-service=mountd --permanent
success
[root@node1 ~]# firewall-cmd --add-service=rpc-bind --permanent
success
[root@node1 ~]# firewall-cmd --reload
success
切換到node2主機進行創建掛載點目錄并進行掛載
[root@node2 ~]# mkdir /hello
[root@node2 ~]# mount -t nfs 192.168.1.10:/test /hello
node1主機進行創建檔案,測驗一下是否同步
[root@node1 ~]# cd /test
[root@node1 test]# echo 123 > test.log
[root@node1 test]# ls
test.log
----------------------------------------------
[root@node2 ~]# cd /hello
[root@node2 hello]# ls
test.log
[root@node2 hello]# cat test.log
123
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/253595.html
標籤:其他
