概述
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 touch ‘1’: Read-only file system