Centos7 NFS實戰


 

概述


 

NFS:Network file system,網絡文件系統;

 

由sun公司1984年推出,用來在網絡中的多台計算機間實現資源共享(包括象文件或cd-rom);

 

設計的目的是:實現在不同系統間交互使用,所以它的通信協議采用與主機和操作系統無關的技術;

 

NFS Server可以看作是File Server,它可以讓你的PC通過網絡將遠端得NFS SERVER共享出來的檔案MOUNT到自己的系統中,在CLIENT看來使用NFS的遠端文件就象是在使用本地文件一樣;

 

  

 

版本


 

NFS協議從誕生到現在共發布了3個版本:NFSv2、NFSv3、NFSv4,NFSv4包含兩個次版本NFSv4.0和NFSv4.1。

 

經過20多年發展,NFS發生了非常大的變化,最大的變化就是推動者從Sun變成了NetApp,NFSv2和NFSv3基本上是Sun起草的,NetApp從NFSv4.0參與進來,並且主導了NFSv4.1標准的制定過程,而Sun已經被Oracle收購了。

 

編號 版本 RFC 時間 頁數
1 NFSv2 rfc1094 1989年3月 27頁
2 NFSv3 rfc1813 1995年6月 126頁
3 NFSv4.0 rfc3530 2003年4月 275頁
4 NFSv4.1 rfc5661 2010年1月 617頁

 

1. NFSv2

  NFSv2是第一個以RFC形式發布的版本,實現了基本的功能。

 

 

2. NFSv3

  NFSv3是1995年發布的,這時NFSv2已經發布了6年了,NFSv3修正了NFSv2的一些bug。兩者有如下一些差別,但是感覺沒有本質的差別。

 

  (1) NFSv2對每次讀寫操作中傳輸數據的最大長度進行了限制,上限值為8192字節,NFSv3取消了這個限制。

 

  (2) NFSv3對文件名稱長度進行了限制,上限值為255字節,NFSv3取消了這個限制。

 

  (3) NFSv2對文件長度進行了限制,上限值為0x7FFFFFFF,NFSv3取消了這個限制。

 

  (4) NFSv2中文件句柄長度固定為32字節,NFSv3中文件句柄長度可變,上限值是64字節。

 

  (5) NFSv2只支持同步寫,如果客戶端向服務器端寫入數據,服務器必須將數據寫入磁盤中才能發送應答消息。

  NFSv3支持異步寫操作,服務器只需要將數據寫入緩存中就可以發送應答信息了。NFSv3增加了COMMIT請求,COMMIT請求可以將服務器緩存中的數據刷新到磁盤中。

 

  (6) NFSv3增加了ACCESS請求,ACCESS用來檢查用戶的訪問權限。

  因為服務器端可能進行uid映射,因此客戶端的uid和gid不能正確反映用戶的訪問權限。

  NFSv2的處理方法是不管訪問權限,直接返送請求,如果沒有訪問權限就出錯。NFSv3中增加了ACCESS請求,客戶端可以檢查是否有訪問權限。

 

  (7) 一些請求調整了參數和返回信息,畢竟NFSv3和NFSv2發布的間隔有6年,經過長期運行可能覺得NFSv2某些請求參數和返回信息需要改進。

 

 

3. NFSv4.0

  相比NFSv3,NFSv4發生了比較大的變化,最大的變化是NFSv4有狀態了。

 

  NFSv2和NFSv3都是無狀態協議,服務區端不需要維護客戶端的狀態信息。

 

  無狀態協議的一個優點在於災難恢復,當服務器出現問題后,客戶端只需要重復發送失敗請求就可以了,直到收到服務器的響應信息。

 

  但是某些操作必須需要狀態,如文件鎖。如果客戶端申請了文件鎖,但是服務器重啟了,由於NFSv3無狀態,客戶端再執行鎖操作可能就會出錯了。NFSv3需要NLM協助才能實現文件鎖功能,但是有的時候兩者配合不夠協調。

 

  NFSv4設計成了一種有狀態的協議,自身實現了文件鎖功能,就不需要NLM協議了。NFSv4和NFSv3的差別如下:

 

  (1) NFSv4設計成了一種有狀態的協議,自身實現了文件鎖功能和獲取文件系統根節點功能,不需要NLM和MOUNT協議協助了。

 

  (2) NFSv4增加了安全性,支持RPCSEC-GSS身份認證。

 

  (3) NFSv4只提供了兩個請求NULL和COMPOUND,所有的操作都整合進了COMPOUND中,客戶端可以根據實際請求將多個操作封裝到一個COMPOUND請求中,增加了靈活性。

 

  (4) NFSv4文件系統的命令空間發生了變化,服務器端必須設置一個根文件系統(fsid=0),其他文件系統掛載在根文件系統上導出。

 

  (5) NFSv4支持delegation。

    由於多個客戶端可以掛載同一個文件系統,為了保持文件同步,NFSv3中客戶端需要經常向服務器發起請求,請求文件屬性信息,判斷其他客戶端是否修改了文件。

    如果文件系統是只讀的,或者客戶端對文件的修改不頻繁,頻繁向服務器請求文件屬性信息會降低系統性能。

    NFSv4可以依靠delegation實現文件同步。當客戶端A打開一個文件時,服務器會分配給客戶端A一個delegation。只要客戶端A具有delegation,就可以認為與服務器保持了一致。

    如果另外一個客戶端B訪問同一個文件,則服務器會暫緩客戶端B的訪問請求,向客戶端A發送RECALL請求。

    當客戶端A接收到RECALL請求時將本地緩存刷新到服務器中,然后將delegation返回服務器,這時服務器開始處理客戶端B的請求。

 

(6) NFSv4修改了文件屬性的表示方法。由於NFS是Sun開發的一套文件系統,設計之出NFS文件屬性參考了UNIX中的文件屬性,可能Windows中不具備某些屬性,因此NFS對操作系統的兼容性不太好。NFSv4將文件屬性划分成了三類:

        Mandatory Attributes: 這是文件的基本屬性,所有的操作系統必須支持這些屬性。

        Recommended Attributes: 這是NFS建議的屬性,如果可能操作系統盡量實現這些屬性。

        Named Attributes: 這是操作系統可以自己實現的一些文件屬性。

 

 

4. NFSv4.1

       與NFSv4.0相比,NFSv4.1最大的變化是支持並行存儲了。

 

  在以前的協議中,客戶端直接與服務器連接,客戶端直接將數據傳輸到服務器中。

 

  當客戶端數量較少時這種方式沒有問題,但是如果大量的客戶端要訪問數據時,NFS服務器很快就會成為一個瓶頸,抑制了系統的性能。

 

  NFSv4.1支持並行存儲,服務器由一台元數據服務器(MDS)和多台數據服務器(DS)構成,元數據服務器只管理文件在磁盤中的布局,數據傳輸在客戶端和數據服務器之間直接進行。

 

  由於系統中包含多台數據服務器,因此數據可以以並行方式訪問,系統吞吐量迅速提升。

 

服務端使用:nfsstat -s

客戶端使用:nfsstat -c

 

 

 

安裝


 

centos7安裝nfs很簡單

yum install nfs-utils rpcbind

 

要部署NFS服務,需要安裝上面兩個軟件包

1.nfs-utils:NSF主程序

包括rpc.nfsd,rpc.mountd等等

 

2.rpcbind:rpc主程序NFS可以被視為一個RPC程序,

在啟動任何一個RPC程序之前,需要做好端口映射工作,這個映射工作就是由rpcbind服務來完成的,因此必須先啟動rpcbind服務,再啟動nfs服務

 

 

  

   

 

 

   

 

配置文件


 

配置文件:/etc/exports

 

 

格式:


 

[共享的目錄] [訪問目標(參數,參數)]

 

當將同一目錄共享給多個客戶機,但對每個客戶機提供的權限不同時,可以這樣: 


[共享的目錄] [訪問目標(參數1,參數2)] [訪問目標(參數3,參數4)]

 

 

訪問目標可以是:


 

192.168.152.13        指定IP地址的主機 

nfsclient.test.com   指定域名的主機 

192.168.1.0/24         指定網段中的所有主機 

*.test.com                 指定域下的所有主機 

*                                所有主機 

 

 

共享參數:


 

ro:只讀權限

rw:共享目錄可讀可寫;

 

sync:將數據同步寫入內存緩沖區與磁盤中,效率低,但可以保證數據的一致性;

async:資料先存內存,再存硬盤

 

no_root_squash:登入nfs主機時,擁有共享目錄所有者權限

root_squash(默認):登入nfs主機時,擁有共享目錄所有者權限,但如果共享目錄的擁有者時root用戶,那么登入者權限為nobody權限

all_squash:登入nfs主機時,擁有nobody用戶權限。所有訪問用戶都映射為匿名用戶或用戶組;

no_all_squash(默認):訪問用戶先與本機用戶匹配,匹配失敗后再映射為匿名用戶或用戶組;

anonuid:指定匿名訪問用戶的本地用戶UID,默認為nfsnobody(65534);

anongid:指定匿名訪問用戶的本地用戶組GID,默認為nfsnobody(65534);

 

subtree_check(默認) :若輸出目錄是一個子目錄,則nfs服務器將檢查其父目錄的權限;

no_subtree_check :即使輸出目錄是一個子目錄,nfs服務器也不檢查其父目錄的權限,這樣可以提高效率;

secure(默認):限制客戶端只能從小於1024的tcp/ip端口連接服務器;限制client port(<1024)

insecure:允許客戶端從大於1024的tcp/ip端口連接服務器;

wdelay(默認):檢查是否有相關的寫操作,如果有則將這些寫操作一起執行,這樣可以提高效率;

no_wdelay:若有寫操作則立即執行,應與sync配合使用;

hide                在NFS共享目錄中不共享其子目錄 

no_hide           共享NFS目錄的子目錄

 

 

 相關命令


 

exportfs 

如果我們在啟動了NFS之后又修改了/etc/exports,是不是還要重新啟動nfs呢?這個時候我們就可以用exportfs命令來使改動立刻生效,該命令格式如下:

exportfs [-aruv] 

-a :全部mount或者unmount /etc/exports中的內容 

-r :重新mount /etc/exports中分享出來的目錄 

-u :umount目錄 

-v :在export的時候,將詳細的信息輸出到屏幕上。

 

具體例子: 

# exportfs -au 卸載所有共享目錄

# exportfs -rv 重新共享所有目錄並輸出詳細信息

 

 

showmount

-a :這個參數是一般在NFS SERVER上使用,是用來顯示已經mount上本機nfs目錄的cline機器。 

-e :顯示指定的NFS SERVER上export出來的目錄。 


mount 

mount -t nfs hostname(orIP):/directory /mount/point 

 

具體例子: 

Linux: mount -t nfs 192.168.0.1:/tmp /mnt/nfs 

 

mount nfs的其它可選參數: 

HARD mount和SOFT MOUNT: 

HARD: NFS CLIENT會不斷的嘗試與SERVER的連接(在后台,不會給出任何提示信息,在LINUX下有的版本仍然會給出一些提示),直到MOUNT上。 

SOFT:會在前台嘗試與SERVER的連接,是默認的連接方式。當收到錯誤信息后終止mount嘗試,並給出相關信息。 

例如:mount -F nfs -o hard 192.168.0.10:/nfs /nfs

 

rsize和wsize: 

文件傳輸尺寸設定:wsize 來進行設定。這兩個參數的設定對於NFS的執行效能有較大的影響 

 

bg:在執行mount時如果無法順利mount上時,系統會將mount的操作轉移到后台並繼續嘗試mount,直到mount成功為止。(通常在設定/etc/fstab文件時都應該使用bg,以避免可能的mount不上而影響啟動速度) 

fg:和bg正好相反,是默認的參數 

 

nfsvers=n:設定要使用的NFS版本,默認是使用2,這個選項的設定還要取決於server端是否支持NFS VER 3 

 

mountport:設定mount的端口 

port:根據server端export出的端口設定,例如如果server使用5555端口輸出NFS,那客戶端就需要使用這個參數進行同樣的設定 

 

timeo=n:設置超時時間,當數據傳輸遇到問題時,會根據這個參數嘗試進行重新傳輸。默認值是7/10妙(0.7秒)。如果網絡連接不是很穩定的話就要加大這個數值,並且推薦使用HARD MOUNT方式,同時最好也加上INTR參數,這樣你就可以終止任何掛起的文件訪問。 

intr 允許通知中斷一個NFS調用。當服務器沒有應答需要放棄的時候有用處。

 

udp:使用udp作為nfs的傳輸協議(NFS V2只支持UDP) 

tcp:使用tcp作為nfs的傳輸協議 

 

namlen=n:設定遠程服務器所允許的最長文件名。這個值的默認是255 

acregmin=n:設定最小的在文件更新之前cache時間,默認是3 

acregmax=n:設定最大的在文件更新之前cache時間,默認是60 

acdirmin=n:設定最小的在目錄更新之前cache時間,默認是30 

acdirmax=n:設定最大的在目錄更新之前cache時間,默認是60 

actimeo=n:將acregmin、acregmax、acdirmin、acdirmax設定為同一個數值,默認是沒有啟用。 

 

retry=n:設定當網絡傳輸出現故障的時候,嘗試重新連接多少時間后不再嘗試。默認的數值是10000 minutes 

 

noac:關閉cache機制。 

 

同時使用多個參數的方法:mount -t nfs -o timeo=3,udp,hard 192.168.0.30:/tmp /nfs 

 

請注意,NFS客戶機和服務器的選項並不一定完全相同,而且有的時候會有沖突。

比如說服務器以只讀的方式導出,客戶端卻以可寫的方式mount,雖然可以成功mount上,但嘗試寫入的時候就會發生錯誤。一般服務器和客戶端配置沖突的時候,會以服務器的配置為准

 

 

實戰


 

服務端

[root@n130 etc]# cat exports
/mnt/test1 192.168.1.131(rw,sync,all_squash)
/mnt/test2 192.168.1.0/24(ro,async,all_squash)
[root@n130 etc]# exportfs -r

 

客戶端

[root@N131 mnt]# showmount -e 192.168.1.130
Export list for 192.168.1.130:
/mnt/test2 192.168.1.0/24
/mnt/test1 192.168.1.131
[root@N131 mnt]# mount -t nfs 192.168.1.130:/mnt/test1 nfs1/
[root@N131 mnt]# mount -t nfs 192.168.1.130:/mnt/test2 nfs2/
[root@N131 mnt]# cd nfs1/
[root@N131 nfs1]# ls
1  2
[root@N131 nfs1]# touch 3
[root@N131 nfs1]# ls
1  2  3
[root@N131 nfs1]# cd ../nfs2/
[root@N131 nfs2]# ls
[root@N131 nfs2]# touch 1
touch: cannot touch1’: Read-only file system

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM