企業(yè)級(jí)共享存儲(chǔ)系統(tǒng) NFS 全面講解
原文鏈接:http://33h.co/2jps9

一、NFS 協(xié)議

NFS服務(wù)工作在
TCP的2049端口,UDP的2049端口。
NFS是Network File System的縮寫,即網(wǎng)絡(luò)文件系統(tǒng),是一種使用于分散式文件系統(tǒng)的協(xié)定。功能是通過網(wǎng)絡(luò)讓不同的機(jī)器、不同的操作系統(tǒng)能夠彼此分享個(gè)別的數(shù)據(jù),讓應(yīng)用程序在客戶端通過網(wǎng)絡(luò)訪問位于服務(wù)器磁盤中的數(shù)據(jù),是在類Unix系統(tǒng)間實(shí)現(xiàn)磁盤文件共享的一種方法。
這個(gè)NFS服務(wù)器可以讓你的PC來將網(wǎng)絡(luò)遠(yuǎn)程的NFS服務(wù)器分享的目錄,掛載到本地端的機(jī)器當(dāng)中, 在本地端的機(jī)器看起來,那個(gè)遠(yuǎn)程主機(jī)的目錄就好像是自己的一個(gè)磁盤分區(qū)槽一樣。
1.1 工作原理
NFS 支持的功能相當(dāng)?shù)亩?,而不同的功能都?huì)使用不同的程序來啟動(dòng), 每啟動(dòng)一個(gè)功能就會(huì)啟用一些端口來傳輸數(shù)據(jù),因此, NFS 的功能所對(duì)應(yīng)的端口才沒有固定住, 而是隨機(jī)取用一些未被使用的小于 1024 的端口來作為傳輸之用。但如此一來又造成客戶端想要連上服務(wù)器時(shí)的困擾, 因?yàn)榭蛻舳说靡婪?wù)器端的相關(guān)端口才能夠聯(lián)機(jī)吧!RPC協(xié)議。RPC,即遠(yuǎn)程過程調(diào)用的縮寫,是能使客戶端執(zhí)行其他系統(tǒng)中程序的一種機(jī)制。RPC 最主要的功能就是在指定每個(gè) NFS 功能所對(duì)應(yīng)的端口號(hào),并且回報(bào)給客戶端,讓客戶端可以連接到正確的端口上去。NFS是一個(gè)文件系統(tǒng),而RPC是負(fù)責(zé)負(fù)責(zé)信息的傳輸。
那RPC又是如何知道每個(gè)NFS的端口呢?
這是因?yàn)楫?dāng)服務(wù)器在啟動(dòng) NFS 時(shí)會(huì)隨機(jī)取用數(shù)個(gè)端口,并主動(dòng)的向 RPC 注冊(cè),因此 RPC 可以知道每個(gè)埠口對(duì)應(yīng)的 NFS 功能,然后 RPC 又是固定使用 111 端口來監(jiān)聽客戶端的需求并報(bào)客戶端正確的埠口, 所以當(dāng)然可以讓 NFS 的啟動(dòng)更為輕松愉快了。 所以你要注意,要啟動(dòng) NFS 之前,RPC 就要先啟動(dòng)了,否則 NFS 會(huì)無法向 RPC 注冊(cè)。另外,RPC 若重新啟動(dòng)時(shí),原本注冊(cè)的數(shù)據(jù)會(huì)不見,因此 RPC 重新啟動(dòng)后,它管理的所有服務(wù)都要重新啟動(dòng)來重新向 RPC 注冊(cè)。
那客戶端如何向NFS服務(wù)端交換數(shù)據(jù)數(shù)據(jù)呢?
(1) 客戶端會(huì)向服務(wù)器端的 RPC 的111端口發(fā)出 NFS 檔案存取功能的詢問要求
(2) 服務(wù)器端找到對(duì)應(yīng)的已注冊(cè)的 NFS 守護(hù)進(jìn)程端口后,會(huì)回報(bào)給客戶端
(3) 客戶端了解正確的端口后,就可以直接與 NFS 守護(hù)進(jìn)程來聯(lián)機(jī)
NFS服務(wù)需要激活幾個(gè)重要的RPC守護(hù)進(jìn)程
工作流程
nfs—client => portmapper => mountd => nfs-server(nfsd)

(1) rpc.nfsd
這個(gè)守護(hù)進(jìn)程主要的功能,則是在管理客戶端是否能夠登入主機(jī)的權(quán)限,其中還包含這個(gè)登入者的 ID 的判別。
(2) rpc.mountd
主要功能
這個(gè)守護(hù)進(jìn)程主要的功能,則是在管理 NFS的檔案系統(tǒng),用于給用戶提供訪問令牌。訪問的令牌,由本地的RPC提供隨機(jī)端口。本地的RPC叫做 portmapper,可以使用rpcinfo -P查看。RPC的 portmapper服務(wù)工作在1111端口。
請(qǐng)求過程
當(dāng)客戶端順利的通過
rpc.nfsd而登入主機(jī)之后,在它可以使用NFS server提供的檔案之前,還會(huì)經(jīng)過檔案使用權(quán)限 的認(rèn)證程序,就是那個(gè)-rwxrwxrwx、owner、group那幾個(gè)權(quán)限啦。然后它會(huì)去讀
NFS的設(shè)定檔/etc/exports來比對(duì)客戶端的權(quán)限,當(dāng)通過這一關(guān)之后,客戶端就可以取得使用NFS檔案的權(quán)限啦。
注釋:NFS需要有兩個(gè)套件
nfs-utils
NFS服務(wù)的主要套件
提供rpc.nfsd和rpc.mountd兩個(gè)NFS守護(hù)進(jìn)程和與其它相關(guān)文檔與說明文件、執(zhí)行檔等的套件
portmap
主要負(fù)責(zé)RPC端口和守護(hù)進(jìn)程的映射關(guān)系,即portmapper
在激活任何一個(gè)RPC server之前,我們都需要激活portmapper才行
1.3 各個(gè)版本之間的比較
1985年推出至今,共發(fā)布了3個(gè)版本:NFSv2、NFSv3、NFSv4,NFSv4包含兩個(gè)次版本NFSv4.0和NFSv4.1。經(jīng)過20多年發(fā)展,NFS發(fā)生了非常大的變化,最大的變化就是推動(dòng)者從Sun變成了NetApp,NFSv2和NFSv3基本上是Sun起草的,NetApp從NFSv4.0參與進(jìn)來,并且主導(dǎo)了NFSv4.1標(biāo)準(zhǔn)的制定過程,而Sun已經(jīng)被Oracle收購了。
1. NFSv2
·NFSv2·是第一個(gè)以 RFC形式發(fā)布的版本,實(shí)現(xiàn)了基本的功能。
2. NFSv3
協(xié)議特點(diǎn)
NFSv3修正了NFSv2的一些bug,兩者有如下一些差別,但是感覺沒有本質(zhì)的差別。
區(qū)別差別
(1)
NFSv2只支持同步寫,如果客戶端向服務(wù)器端寫入數(shù)據(jù),服務(wù)器必須將數(shù)據(jù)寫入磁盤中才能發(fā)送應(yīng)答消息。NFSv3支持異步寫操作,服務(wù)器只需要將數(shù)據(jù)寫入緩存中就可以發(fā)送應(yīng)答信息了。(2)
NFSv3增加了ACCESS請(qǐng)求,ACCESS用來檢查用戶的訪問權(quán)限。因?yàn)榉?wù)器端可能進(jìn)行uid映射,因此客戶端的uid和gid不能正確反映用戶的訪問權(quán)限。(3) 一些請(qǐng)求調(diào)整了參數(shù)和返回信息,畢竟
NFSv3和NFSv2發(fā)布的間隔有6年,經(jīng)過長期運(yùn)行可能覺得NFSv2某些請(qǐng)求參數(shù)和返回信息需要改進(jìn)。
3. NFSv4.0
協(xié)議特點(diǎn)
相比
NFSv3,NFSv4發(fā)生了比較大的變化,最大的變化是NFSv4有狀態(tài)了。NFSv2和NFSv3都是無狀態(tài)協(xié)議,服務(wù)區(qū)端不需要維護(hù)客戶端的狀態(tài)信息。無狀態(tài)協(xié)議的一個(gè)優(yōu)點(diǎn)在于災(zāi)難恢復(fù),當(dāng)服務(wù)器出現(xiàn)問題后,客戶端只需要重復(fù)發(fā)送失敗請(qǐng)求就可以了,直到收到服務(wù)器的響應(yīng)信息。
區(qū)別差別
(1) NFSv4增加了安全性,支持RPCSEC-GSS身份認(rèn)證。
(2) NFSv4設(shè)計(jì)成了一種有狀態(tài)的協(xié)議,自身實(shí)現(xiàn)了文件鎖功能和獲取文件系統(tǒng)根節(jié)點(diǎn)功能。
(3) NFSv4只提供了兩個(gè)請(qǐng)求NULL和COMPOUND,所有的操作都整合進(jìn)了COMPOUND中,客戶端可以根據(jù)實(shí)際請(qǐng)求將多個(gè)操作封裝到一個(gè)COMPOUND請(qǐng)求中,增加了靈活性。
(4) NFSv4文件系統(tǒng)的命令空間發(fā)生了變化,服務(wù)器端必須設(shè)置一個(gè)根文件系統(tǒng)(fsid=0),其他文件系統(tǒng)掛載在根文件系統(tǒng)上導(dǎo)出。
(5) NFSv4支持delegation。由于多個(gè)客戶端可以掛載同一個(gè)文件系統(tǒng),為了保持文件同步,NFSv3中客戶端需要經(jīng)常向服務(wù)器發(fā)起請(qǐng)求,請(qǐng)求文件屬性信息,判斷其他客戶端是否修改了文件。如果文件系統(tǒng)是只讀的,或者客戶端對(duì)文件的修改不頻繁,頻繁向服務(wù)器請(qǐng)求文件屬性信息會(huì)降低系統(tǒng)性能。NFSv4可以依靠delegation實(shí)現(xiàn)文件同步。
(6) NFSv4修改了文件屬性的表示方法。由于NFS是Sun開發(fā)的一套文件系統(tǒng),設(shè)計(jì)之出NFS文件屬性參考了UNIX中的文件屬性,可能Windows中不具備某些屬性,因此NFS對(duì)操作系統(tǒng)的兼容性不太好。
4. NFSv4.1
與
NFSv4.0相比,NFSv4.1最大的變化是支持并行存儲(chǔ)了。在以前的協(xié)議中,客戶端直接與服務(wù)器連接,客戶端直接將數(shù)據(jù)傳輸?shù)椒?wù)器中。當(dāng)客戶端數(shù)量較少時(shí)這種方式?jīng)]有問題,但是如果大量的客戶端要訪問數(shù)據(jù)時(shí),
NFS服務(wù)器很快就會(huì)成為一個(gè)瓶頸,抑制了系統(tǒng)的性能。NFSv4.1支持并行存儲(chǔ),服務(wù)器由一臺(tái)元數(shù)據(jù)服務(wù)器(MDS)和多臺(tái)數(shù)據(jù)服務(wù)器(DS)構(gòu)成,元數(shù)據(jù)服務(wù)器只管理文件在磁盤中的布局,數(shù)據(jù)傳輸在客戶端和數(shù)據(jù)服務(wù)器之間直接進(jìn)行。由于系統(tǒng)中包含多臺(tái)數(shù)據(jù)服務(wù)器,因此數(shù)據(jù)可以以并行方式訪問,系統(tǒng)吞吐量迅速提升。

二、NFS 服務(wù)

CentOS7以NFSv4作為默認(rèn)版本,NFSv4使用TCP協(xié)議(端口號(hào)是2049)和NFS服務(wù)器建立連接。
# 系統(tǒng)環(huán)境
系統(tǒng)平臺(tái):CentOS release 7.0 (Final)
NFS Server IP:192.168.10.10
防火墻已關(guān)閉/iptables: Firewall is not running.
SELINUX=disabled2.1 安裝 NFS 服務(wù)
服務(wù)端
服務(wù)端,程序包名 nfs-utils、rpcbind,默認(rèn)都已經(jīng)安裝了可以通過 rpm -ql nfs-utils查看幫助文檔等信息
客戶端
客戶端,需要安裝程序包名 nfs-utils,提供基本的客戶端命令工具
[root@localhost ~]# yum install nfs-utils
Loaded plugins: langpacks, product-id, subscription-manager
......
Package 1:nfs-utils-1.3.0-0.el7.x86_64 already installed and latest version
Nothing to do
查看NFS服務(wù)端口
NFS啟動(dòng)時(shí)會(huì)隨機(jī)啟動(dòng)多個(gè)端口并向 RPC注冊(cè),為了方便配置防火墻,需要固定NFS服務(wù)端口。這樣如果使用 iptables對(duì)NFS端口進(jìn)行限制就會(huì)有點(diǎn)麻煩,可以更改配置文件固定NFS服務(wù)相關(guān)端口分配端口,編輯配置文件 /etc/sysconfig/nfs
# 使用rpcinfo -P會(huì)發(fā)現(xiàn)rpc啟動(dòng)了很多監(jiān)聽端口
[root@localhost ~]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 49979 mountd
100005 1 tcp 58393 mountd
100003 2 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
......
# 添加如下
[root@localhost ~]# vim /etc/sysconfig/nfs
RQUOTAD_PORT=30001
LOCKD_TCPPORT=30002
LOCKD_UDPPORT=30002
MOUNTD_PORT=30003
STATD_PORT=30004
啟動(dòng)服務(wù)
[root@localhost ~]# service nfs start
Starting NFS services: [OK]
Starting NFS quotas: [OK]
Starting NFS mountd: [OK]
Starting NFS daemon: [OK]
Starting NFS idmapd: [OK]
2.2 服務(wù)文件配置
相關(guān)文件和命令

配置文件/etc/exports
我們可以按照“共享目錄的路徑 允許訪問的 NFS 客戶端(共享權(quán)限參數(shù))”的格式,定義要共享的目錄與相應(yīng)的權(quán)限

[root@localhost ~]# cat /etc/exports
/nfsfile 192.168.10.*(rw,sync,root_squash)
/tmp/serverdir 192.168.174.132(rw,sync,no_root_squash) 192.168.174.133(ro,sync,no_root_squash)
三、實(shí)戰(zhàn)演示

如果有興趣,可以嘗試:兩臺(tái) web 服務(wù)器,共享關(guān)系型數(shù)據(jù)庫,共享 NFS 服務(wù)器,利用 DNS 記錄輪詢提供負(fù)載均衡。
第 1 步:機(jī)器設(shè)置
創(chuàng)建服務(wù)端和客戶端 關(guān)閉 iptables和selinux服務(wù)
| 主機(jī)名稱 | 操作系統(tǒng) | IP地址 |
|---|---|---|
| NFS服務(wù)端 | RHEL 7 | 192.168.10.10 |
| NFS客戶端 | RHEL 7 | 192.168.10.20 |
# 清空NFS服務(wù)器上面iptables防火墻的默認(rèn)策略,以免默認(rèn)的防火墻策略禁止正常的NFS共享服務(wù)
[root@localhost ~]# iptables -F
[root@localhost ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
第 2 步:創(chuàng)建共享目錄
在 NFS服務(wù)器上,建立用于NFS文件共享的目錄在NFS服務(wù)器上,設(shè)置足夠的權(quán)限確保其他人也有寫入權(quán)限
[root@localhost ~]# mkdir /nfsfile
[root@localhost ~]# chmod -Rf 777 /nfsfile
[root@localhost ~]# echo "welcome to localhost.com" > /nfsfile/readme第 3 步:編輯配置文件/etc/exports
定義要共享的目錄與相應(yīng)的權(quán)限 請(qǐng)注意,NFS 客戶端地址與權(quán)限之間沒有空格
# 把/nfsfile目錄共享給192.168.10.0/24網(wǎng)段內(nèi)的所有主機(jī),讓這些主機(jī)都擁有讀寫權(quán)限
[root@localhost ~]# vim /etc/exports
/nfsfile 192.168.10.*(rw,sync,root_squash)第 4 步:啟動(dòng)和啟用 NFS 服務(wù)程序
在啟動(dòng)NFS服務(wù)之前,還需要順帶重啟并啟用 rpcbind服務(wù)程序,并將這兩個(gè)服務(wù)一并加入開機(jī)啟動(dòng)項(xiàng)中
[root@localhost ~]# systemctl restart rpcbind
[root@localhost ~]# systemctl enable rpcbind
[root@localhost ~]# systemctl start nfs-server
[root@localhost ~]# systemctl enable nfs-server
ln -s '/usr/lib/systemd/system/nfs-server.service' '/etc/systemd/system/nfs.target.wants/nfs-server.service'第 5 步:NFS 客戶端的配置
使用 showmount命令查詢NFS服務(wù)器的遠(yuǎn)程共享信息showmount命令輸出格式為“共享的目錄名稱 允許使用客戶端地址”
showmount命令
| 參數(shù) | 作用 |
|---|---|
| -e | 顯示NFS服務(wù)器的共享列表 |
| -a | 顯示本機(jī)掛載的文件資源的情況NFS資源的情況 |
| -v | 顯示版本號(hào) |
exportfs命令
維護(hù)exports文件導(dǎo)出的文件系統(tǒng)表的專用工具,可以修改配置之后不重啟NFS服務(wù) export -ar:重新導(dǎo)出所有的文件系統(tǒng)export -au:關(guān)閉導(dǎo)出的所有文件系統(tǒng)export -u FS: 關(guān)閉指定的導(dǎo)出的文件系統(tǒng)
# 查看NFS服務(wù)器端共享的文件系統(tǒng)
# showmount -e NFSSERVER_IP
[root@localhost ~]# showmount -e 192.168.10.10
Export list for 192.168.10.10:
/nfsfile 192.168.10.*
# NFS客戶端創(chuàng)建一個(gè)掛載目錄,掛載服務(wù)端NFS文件系統(tǒng)到本地
# mount -t nfs SERVER:/path/to/sharedfs /path/to/mount_point
[root@localhost ~]# mkdir /nfsfile
[root@localhost ~]# mount -t nfs 192.168.10.10:/nfsfile /nfsfile
# 掛載成功后就應(yīng)該能夠順利地看到在執(zhí)行前面的操作時(shí)寫入的文件內(nèi)容了
[root@localhost ~]# cat /nfsfile/readme
welcome to linuxprobe.com
# 如果希望NFS文件共享服務(wù)能一直有效,則需要將其寫入到fstab文件中
# SERVER:/PATH/TO/EXPORTED_FS /mount_point nfs defaults,_netdev 0 0
[root@localhost ~]# vim /etc/fstab
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
192.168.10.10:/nfsfile /nfsfile nfs defaults 0 0- END -
推薦閱讀 31天拿下K8s含金量最高的CKA+CKS證書! 編寫 Dockerfile 最佳實(shí)踐 運(yùn)維工程師不得不看的經(jīng)驗(yàn)教訓(xùn)和注意事項(xiàng) Kubernetes 的這些核心資源原理,你一定要了解 終于搞懂了服務(wù)器為啥產(chǎn)生大量的TIME_WAIT! Kubernetes 網(wǎng)絡(luò)方案之炫酷的 Cilium Prometheus+InfluxDB+Grafana 打造高逼格監(jiān)控平臺(tái) 這些 K8S 日常故障處理集錦,運(yùn)維請(qǐng)收藏~ 豬八戒網(wǎng) CI/CD 最佳實(shí)踐之路 從零開始搭建創(chuàng)業(yè)公司DevOps技術(shù)棧 12年資深運(yùn)維老司機(jī)的成長感悟 搭建一套完整的企業(yè)級(jí) K8s 集群(二進(jìn)制方式)
點(diǎn)亮,服務(wù)器三年不宕機(jī)


