nfs不同版本的掛載與解析
NFS,是Network File System的簡寫,即網絡文件系統。網絡文件系統是FreeBSD支持的文件系統中的一種,也被稱為NFS. NFS允許一個系統在網絡上與他人共享目錄和文件。通過使用NFS,用戶和程序可以像訪問本地文件一樣訪問遠端系統上的文件 。
運行模式: C/S
版本異同:RHEL6.5以NFSv3作為默認版本,NFSv3使用TCP、UDP協議(端口號是2049),默認是UDP; RHEL7以NFSv4作為默認版本,NFSv4使用TCP協議(端口號是2049)和NFS服務器建立連接。原理示意圖:
RHEL6.5環境:
服務端配置安裝
1、包安裝
# rpm -qa | grep nfs-utils
# yum install nfs-utils rpcbind
要部署NFS服務,需要安裝上面兩個軟件包
1.nfs-utils:NSF主程序
包括rpc.nfsd,rpc.mountd等等
2.rpcbind:rpc主程序
NFS可以被視為一個RPC程序,在啟動任何一個RPC程序之前,需要做好端口映射工作,這個映射工作
就是由rpcbind服務來完成的,因此必須先啟動rpcbind服務,再啟動nfs服務
2、NFS文件配置:
[[email protected] /]# vi /etc/exports
#增加一行:
/tmp/test0920 11.11.165.0/24(rw,no_root_squash,no_all_squash,sync)
:x保存退出;
3、使配置生效:
[[email protected] /]# exportfs -r
註:配置文件說明:
/tmp/test0920 為共享的目錄,使用絕對路徑。
192.168.1.0/24(rw,no_root_squash,no_all_squash,sync) 為客戶端的地址及權限,地址可以是一個網段,一個IP地址或者是一個域名,域名支持通配符,如:*.cnpc.com
4、測試:
[[email protected] ~]# showmount -e
Export list for test1:
/tmp/test0920 11.11.165.0/24
5、設置服務開機自啟
Chkconfig rpcbind on
Chkconfig --level 345 rpcbind on
Chkconfig nfs on
Chkconfig --level 345 nfs on
客戶端的配置:
1、yum -y install nfs-utils
2、mount -t nfs 11.11.165.115:/tmp/test0920 /data
3、編輯/etc/fstab
增加11.11.165.115:/tmp/test0920 /data nfs defaults 0 0
註意默認是nfs掛載
如果選擇nfs4掛載,則可以用以下語句
mount -t nfs4 11.11.165.115:/tmp/test0920 /data
編輯/etc/fstab
則可以
11.11.165.115:/tmp/test0920 /data nfs4 defaults 0 0
或者
11.11.165.115:/tmp/test0920 /data nfs defaults,v4 0 0
容易出現的問題:
在/etc/sysconfig/nfs文件裏,將
# Turn off v2 and v3 protocol support
#RPCNFSDARGS="-N 2 -N 3"
# v4 protocol support
#RPCNFSDARGS="-N 4" 將這句的#去掉後
則出現
[[email protected] ~]# mount -t nfs 11.11.165.115:/tmp/test0920 /data
mount.nfs: Protocol not supported
[[email protected] ~]# mount -t nfs4 11.11.165.115:/tmp/test0920 /data
mount.nfs4: Protocol not supported
因為關閉了nfs4, 則4和4以下的協議都不支持了
當你加上#號後,nfs4和nfs3都可以掛載了
RHEL7.3環境:
在/etc/sysconfig/nfs文件裏
RPCNFSDARGS="-V 4.2"
編輯/etc/fstab
則可以
11.11.165.115:/tmp/test0920 /data nfs4.2 defaults 0 0
或者
11.11.165.115:/tmp/test0920 /data nfs defaults, 0 0
服務和防火墻稍有差別
[[email protected] ~]# systemctl start rpcbind
[[email protected] ~]# systemctl enable rpcbind
[[email protected] ~]# systemctl start nfs-server
[[email protected] ~]# systemctl enable nfs-server
進站允許策略
# firewall-cmd --add-service=nfs --zone=internal --permanent
# firewall-cmd --add-service=mountd --zone=internal --permanent
# firewall-cmd --add-service=rpc-bind --zone=internal --permanent
加安全認證的配置
在desktop30上掛載來自於server30的NFS共享,要求
1 /public掛載在目錄/mnt/nfsmount上
2 /protected掛載在目錄/mnt/nfssecure,並使用安全的方式,秘鑰在http://ldap.example.com/pub/desktop30.keytab
3 這些文件系統在系統啟動時自動掛載
[[email protected] mnt]# systemctl enable nfs-server.service
[[email protected] mnt]# systemctl enable nfs-secure.service
ln -s ‘/usr/lib/systemd/system/nfs-secure.service‘ ‘/etc/systemd/system/nfs.target.wants/nfs-secure.service‘
[[email protected] mnt]# systemctl start nfs-secure.service
[[email protected] mnt]# mkdir nfsmount
[[email protected] mnt]# mkdir nfssecure
[[email protected] mnt]# wget -O /etc/krb5.keytab http://ldap.example.com/pub/desktop30.keytab
[[email protected] mnt]# vim /etc/fstab
172.16.30.130:/public /mnt/nfsmount nfs ro 0 0
server30.example.com:/protected /mnt/nfssecure nfs rw,sec=krb5p 0 0
協議版本解析:
NFS協議到現在經歷了V1,V2,V3,V4版本,但是它有一個缺點就是協議沒有用戶認證機制,而且數據在網絡上傳送的時候是明文傳送,所以安全性極差,一般只能在局域網中使用。
NFSv3是1995年發布的,相比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: 這是操作系統可以自己實現的一些文件屬性。
(7)服務器端拷貝:
如果客戶需要從一個NFS服務器拷貝數據到另外一個NFS服務器,nfsv4可以讓兩臺NFS服務器之間直接拷貝數據,不需要經過客戶端。
(8)資源預留和回收:
NFSv4為虛擬分配提供的新特性。隨著存儲虛擬分配功能的普及使用,nfsv4可以為預留固定大小的存儲空間;同樣在文件系統上刪除文件後,也能夠在存儲上面釋放相應空間。
(9)國際化支持:
NFSv4文件名、目錄、鏈接、用戶與組可以使用 UTF-8字符集,UTF-8兼容ASCII碼,使得NFSv4支持更多語言。
(10)RPC合並調用:
NFSv4允許將多個請求合並為一個rpc引用,在NFSv3每個請求對應一個rpc調用。WAN環境中,NFSv4合並rpc調用可以顯著降低延遲。
(11)安全性:
NFSv4用戶驗證采用“用戶名+域名”的模式,與Windows AD驗證方式類似,NFSv4強制使用Kerberos驗證方式。(Kerberos與Windows AD都遵循相同RFC1510標準),這樣方便windows和*nix環境混合部署。
(12)pNFS
並行NFS文件系統,元數據服務器負責用戶請求調度、數據服務器負責客戶請求處理。pNFS需要NFS服務器和客戶端協同支持
後來的 NFSv4.1
與NFSv4.0相比,NFSv4.1最大的變化是支持並行存儲了。在以前的協議中,客戶端直接與服務器連接,客戶端直接將數據傳輸到服務器中。當客戶端數量較少時這種方式沒有問題,但是如果大量的客戶端要訪問數據時,NFS服務器很快就會成為一個瓶頸,抑制了系統的性能。NFSv4.1支持並行存儲,服務器由一臺元數據服務器(MDS)和多臺數據服務器(DS)構成,元數據服務器只管理文件在磁盤中的布局,數據傳輸在客戶端和數據服務器之間直接進行。由於系統中包含多臺數據服務器,因此數據可以以並行方式訪問,系統吞吐量迅速提升。現在新的是nfsv4.2
所以盡可能用nfs4
補充:
nfs4掛載的fsid問題
問題現象:
掛載nfs4時,報錯:reason given by server :No such file or directory
背景知識:
NFSv4將所有共享使用一個虛擬文件系統展示給客戶端。偽文件系統根目錄(/)使用fsid=0標示,只有一個共享可以是fsid=0。客戶端需要使用“nfs server ip:/”掛載偽文件系統,偽文件系統一般使用RO方式共享,其他共享可以通過mount –bind選項在偽文件系統目錄下掛載。客戶端掛載過程需要通過mount –t nfs4指定NFS版本為4,默認采用nfsv3。
解決:
以下是我的配置文件,我想掛在/datapool/nfs目錄
/ *(rw,fsid=0,insecure,no_root_squash)
/datapool/nfs *(rw,fsid=1000,insecure,no_root_squash
然後mount -t nfs4 ip:/datapool/nfs /mnt/nfs/
nfs配置參數選項說明:
ro:共享目錄只讀;
rw:共享目錄可讀可寫;
all_squash:所有訪問用戶都映射為匿名用戶或用戶組;
no_all_squash(默認):訪問用戶先與本機用戶匹配,匹配失敗後再映射為匿名用戶或用戶組;
root_squash(默認):將來訪的root用戶映射為匿名用戶或用戶組;
no_root_squash:來訪的root用戶保持root帳號權限;
anonuid=<UID>:指定匿名訪問用戶的本地用戶UID,默認為nfsnobody(65534);
anongid=<GID>:指定匿名訪問用戶的本地用戶組GID,默認為nfsnobody(65534);
secure(默認):限制客戶端只能從小於1024的tcp/ip端口連接服務器;
insecure:允許客戶端從大於1024的tcp/ip端口連接服務器;
sync:將數據同步寫入內存緩沖區與磁盤中,效率低,但可以保證數據的一致性;
async:將數據先保存在內存緩沖區中,必要時才寫入磁盤;
wdelay(默認):檢查是否有相關的寫操作,如果有則將這些寫操作一起執行,這樣可以提高效率;
no_wdelay:若有寫操作則立即執行,應與sync配合使用;
subtree_check(默認) :若輸出目錄是一個子目錄,則nfs服務器將檢查其父目錄的權限;
no_subtree_check :即使輸出目錄是一個子目錄,nfs服務器也不檢查其父目錄的權限,這樣可以提高效率;
Troubleshooting
1、在上面的操作過程中,如果你不幸遇到下面這個問題的話,可以嘗試更新 Linux kernel 或通過打開 IPv6 來解決這個問題,這是1個 bug:
# mount -t nfs4 172.16.20.1:/ /home/vpsee/bak/
mount.nfs4: Cannot allocate memory
2、如果遇到如下問題,可能是因為你的 mount -t nfs 使用的是 nfsv3 協議,需要明確指出使用 nfsv4 協議掛載 mount -t nfs4:
# mount -t nfs 172.16.20.1:/ /home/vpsee/bak/
mount: mount to NFS server ‘172.16.20.1‘ failed: RPC Error: Program not registered.
# mount -t nfs4 172.16.20.1:/ /home/vpsee/bak/
如果網絡不穩定
NFS默認是用UDP協議,換成TCP協議掛載即可:
mount -t nfs 11.11.165.115:/tmp/test0920 /data -o proto=tcp -o nolock
VMware ESXi5.5主機無法掛載RHEL6.5 NFS存儲
http://xjsunjie.blog.51cto.com/999372/1577582
本文出自 “滴水穿石孫傑” 博客,請務必保留此出處http://xjsunjie.blog.51cto.com/999372/1967324
nfs不同版本的掛載與解析