Linux 系統實戰之 部署 NFS 服務器
一、NFS 協議
NFS服務工作在TCP的2049端口,UDP的2049端口。
NFS是Network File System的縮寫,即網絡文件系統,是一種使用于分散式文件系統的協定。功能是通過網絡讓不同的機器、不同的操作系統能夠彼此分享個別的數據,讓應用程序在客戶端通過網絡訪問位于服務器磁盤中的數據,是在類Unix系統間實現磁盤文件共享的一種方法。
這個NFS服務器可以讓你的PC來將網絡遠程的NFS服務器分享的目錄,掛載到本地端的機器當中, 在本地端的機器看起來,那個遠程主機的目錄就好像是自己的一個磁盤分區槽一樣。
1.1 工作原理
因為 NFS 支持的功能相當的多,而不同的功能都會使用不同的程序來啟動, 每啟動一個功能就會啟用一些端口來傳輸數據,因此, NFS 的功能所對應的端口才沒有固定住, 而是隨機取用一些未被使用的小于 1024 的端口來作為傳輸之用。但如此一來又造成客戶端想要連上服務器時的困擾, 因為客戶端得要知道服務器端的相關端口才能夠聯機吧!
NFS在文件傳送或信息傳送過程中依賴于RPC協議。RPC,即遠程過程調用的縮寫,是能使客戶端執行其他系統中程序的一種機制。RPC 最主要的功能就是在指定每個 NFS 功能所對應的端口號,并且回報給客戶端,讓客戶端可以連接到正確的端口上去。
NFS本身是沒有提供信息傳輸的協議和功能的,但NFS卻能讓我們通過網絡進行資料的分享,這是因為NFS使用了一些其它的傳輸協議。而這些傳輸協議用到這個RPC功能的。可以說NFS本身就是使用RPC的一個程序,或者說NFS也是一個RPC SERVER。所以只要用到NFS的地方都要啟動RPC服務,不論是NFS SERVER或者NFS CLIENT。這樣SERVER和CLIENT才能通過RPC來實現PROGRAM PORT的對應。可以這么理解RPC和NFS的關系:NFS是一個文件系統,而RPC是負責負責信息的傳輸。
事實上,有很多這樣的服務器都是向 RPC 注冊的,舉例來說,NIS (Network Information Service) 也是 RPC server 的一種。
那RPC又是如何知道每個NFS的端口呢?
- 這是因為當服務器在啟動 NFS 時會隨機取用數個端口,并主動的向 RPC 注冊,因此 RPC 可以知道每個埠口對應的 NFS 功能,然后 RPC 又是固定使用 111 端口來監聽客戶端的需求并報客戶端正確的埠口, 所以當然可以讓 NFS 的啟動更為輕松愉快了。
- 所以你要注意,要啟動 NFS 之前,RPC 就要先啟動了,否則 NFS 會無法向 RPC 注冊。另外,RPC 若重新啟動時,原本注冊的數據會不見,因此 RPC 重新啟動后,它管理的所有服務都要重新啟動來重新向 RPC 注冊。
那客戶端如何向NFS服務端交換數據數據呢?
- (1) 客戶端會向服務器端的 RPC 的111端口發出 NFS 檔案存取功能的詢問要求
- (2) 服務器端找到對應的已注冊的 NFS 守護進程端口后,會回報給客戶端
- (3) 客戶端了解正確的端口后,就可以直接與 NFS 守護進程來聯機
1.2 激活 NFS 服務
NFS 服務需要激活幾個重要的 RPC 守護進程
工作流程
nfs—client => portmapper => mountd => nfs-server(nfsd)
(1) rpc.nfsd
- 這個守護進程主要的功能,則是在管理客戶端是否能夠登入主機的權限,其中還包含這個登入者的 ID 的判別。
(2) rpc.mountd
主要功能
- 這個守護進程主要的功能,則是在管理 NFS 的檔案系統,用于給用戶提供訪問令牌。
- 訪問的令牌,由本地的RPC提供隨機端口。本地的RPC叫做portmapper,可以使用rpcinfo -P查看。
- RPC的portmapper服務工作在1111端口。
請求過程
- 當客戶端順利的通過 rpc.nfsd 而登入主機之后,在它可以使用 NFS server 提供的檔案之前,還會經過檔案使用權限 的認證程序,就是那個-rwxrwxrwx、owner、group那幾個權限啦。
- 然后它會去讀 NFS 的設定檔 /etc/exports 來比對客戶端的權限,當通過這一關之后,客戶端就可以取得使用 NFS 檔案的權限啦。
注釋:NFS需要有兩個套件
- nfs-utils
NFS服務的主要套件
提供rpc.nfsd和rpc.mountd兩個NFS守護進程和與其它相關文檔與說明文件、執行檔等的套件
- portmap
主要負責RPC端口和守護進程的映射關系,即portmapper
在激活任何一個RPC server之前,我們都需要激活portmapper才行
1.3 各個版本之間的比較
NFS是一種網絡文件系統,從1985年推出至今,共發布了3個版本:NFSv2、NFSv3、NFSv4,NFSv4包含兩個次版本NFSv4.0和NFSv4.1。經過20多年發展,NFS發生了非常大的變化,最大的變化就是推動者從Sun變成了NetApp,NFSv2和NFSv3基本上是Sun起草的,NetApp從NFSv4.0參與進來,并且主導了NFSv4.1標準的制定過程,而Sun已經被Oracle收購了。
1. NFSv2
- NFSv2·是第一個以RFC形式發布的版本,實現了基本的功能。
2. NFSv3
協議特點
- NFSv3修正了NFSv2的一些bug,兩者有如下一些差別,但是感覺沒有本質的差別。
區別差別
- (1) NFSv2只支持同步寫,如果客戶端向服務器端寫入數據,服務器必須將數據寫入磁盤中才能發送應答消息。NFSv3支持異步寫操作,服務器只需要將數據寫入緩存中就可以發送應答信息了。
- (2) NFSv3增加了ACCESS請求,ACCESS用來檢查用戶的訪問權限。因為服務器端可能進行uid映射,因此客戶端的uid和gid不能正確反映用戶的訪問權限。
- (3) 一些請求調整了參數和返回信息,畢竟NFSv3和NFSv2發布的間隔有6年,經過長期運行可能覺得NFSv2某些請求參數和返回信息需要改進。
3. NFSv4.0
協議特點
- 相比NFSv3,NFSv4發生了比較大的變化,最大的變化是NFSv4有狀態了。NFSv2和NFSv3都是無狀態協議,服務區端不需要維護客戶端的狀態信息。
- 無狀態協議的一個優點在于災難恢復,當服務器出現問題后,客戶端只需要重復發送失敗請求就可以了,直到收到服務器的響應信息。
區別差別
(1) NFSv4增加了安全性,支持RPCSEC-GSS身份認證。
(2) NFSv4設計成了一種有狀態的協議,自身實現了文件鎖功能和獲取文件系統根節點功能。
(3) NFSv4只提供了兩個請求NULL和COMPOUND,所有的操作都整合進了COMPOUND中,客戶端可以根據實際請求將多個操作封裝到一個COMPOUND請求中,增加了靈活性。
(4) NFSv4文件系統的命令空間發生了變化,服務器端必須設置一個根文件系統(fsid=0),其他文件系統掛載在根文件系統上導出。
(5) NFSv4支持delegation。由于多個客戶端可以掛載同一個文件系統,為了保持文件同步,NFSv3中客戶端需要經常向服務器發起請求,請求文件屬性信息,判斷其他客戶端是否修改了文件。如果文件系統是只讀的,或者客戶端對文件的修改不頻繁,頻繁向服務器請求文件屬性信息會降低系統性能。NFSv4可以依靠delegation實現文件同步。
(6) NFSv4修改了文件屬性的表示方法。由于NFS是Sun開發的一套文件系統,設計之出NFS文件屬性參考了UNIX中的文件屬性,可能Windows中不具備某些屬性,因此NFS對操作系統的兼容性不太好。
4. NFSv4.1
- 與NFSv4.0相比,NFSv4.1最大的變化是支持并行存儲了。在以前的協議中,客戶端直接與服務器連接,客戶端直接將數據傳輸到服務器中。
- 當客戶端數量較少時這種方式沒有問題,但是如果大量的客戶端要訪問數據時,NFS服務器很快就會成為一個瓶頸,抑制了系統的性能。NFSv4.1支持并行存儲,服務器由一臺元數據服務器(MDS)和多臺數據服務器(DS)構成,元數據服務器只管理文件在磁盤中的布局,數據傳輸在客戶端和數據服務器之間直接進行。由于系統中包含多臺數據服務器,因此數據可以以并行方式訪問,系統吞吐量迅速提升。
二、NFS 服務
CentOS7以NFSv4作為默認版本,NFSv4使用TCP協議(端口號是2049)和NFS服務器建立連接。
- # 系統環境
- 系統平臺:CentOS release 7.0 (Final)
- NFS Server IP:192.168.10.10
- 防火墻已關閉/iptables: Firewall is not running.
- SELINUX=disabled
2.1 安裝 NFS 服務
服務端
- 服務端,程序包名nfs-utils、rpcbind,默認都已經安裝了
- 可以通過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服務端口
- NFS啟動時會隨機啟動多個端口并向RPC注冊,為了方便配置防火墻,需要固定NFS服務端口。
- 這樣如果使用iptables對NFS端口進行限制就會有點麻煩,可以更改配置文件固定NFS服務相關端口
- 分配端口,編輯配置文件/etc/sysconfig/nfs
- # 使用rpcinfo -P會發現rpc啟動了很多監聽端口
- [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
啟動服務
- [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 服務文件配置
- 相關文件和命令
- 配置文件/etc/exports
我們可以按照“共享目錄的路徑 允許訪問的 NFS 客戶端(共享權限參數)”的格式,定義要共享的目錄與相應的權限
- [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)
三、實戰演示
如果有興趣,可以嘗試:兩臺 web 服務器,共享關系型數據庫,共享 NFS 服務器,利用 DNS 記錄輪詢提供負載均衡。
第 1 步:機器設置
- 創建服務端和客戶端
- 關閉iptables和selinux服務
主機名稱 | 操作系統 | IP地址 |
---|---|---|
NFS服務端 | RHEL 7 | 192.168.10.10 |
NFS客戶端 | RHEL 7 | 192.168.10.20 |
# 清空NFS服務器上面iptables防火墻的默認策略,以免默認的防火墻策略禁止正常的NFS共享服務- [root@localhost ~]# iptables -F
- [root@localhost ~]# service iptables save
- iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
第 2 步:創建共享目錄
- 在NFS服務器上,建立用于NFS文件共享的目錄
- 在NFS服務器上,設置足夠的權限確保其他人也有寫入權限
- [root@localhost ~]# mkdir /nfsfile
- [root@localhost ~]# chmod -Rf 777 /nfsfile
- [root@localhost ~]# echo "welcome to localhost.com" > /nfsfile/readme
第 3 步:編輯配置文件/etc/exports
- 定義要共享的目錄與相應的權限
- 請注意,NFS 客戶端地址與權限之間沒有空格
- # 把/nfsfile目錄共享給192.168.10.0/24網段內的所有主機,讓這些主機都擁有讀寫權限
- [root@localhost ~]# vim /etc/exports
- /nfsfile 192.168.10.*(rw,sync,root_squash)
第 4 步:啟動和啟用 NFS 服務程序
- 在啟動NFS服務之前,還需要順帶重啟并啟用rpcbind服務程序,并將這兩個服務一并加入開機啟動項中
- [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服務器的遠程共享信息
- showmount命令輸出格式為“共享的目錄名稱 允許使用客戶端地址”
showmount命令
參數 | 作用 |
---|---|
-e | 顯示NFS服務器的共享列表 |
-a | 顯示本機掛載的文件資源的情況NFS資源的情況 |
-v | 顯示版本號 |
exportfs命令
- 維護exports文件導出的文件系統表的專用工具,可以修改配置之后不重啟NFS服務
- export -ar:重新導出所有的文件系統
- export -au:關閉導出的所有文件系統
- export -u FS: 關閉指定的導出的文件系統
- # 查看NFS服務器端共享的文件系統
- # showmount -e NFSSERVER_IP
- [root@localhost ~]# showmount -e 192.168.10.10
- Export list for 192.168.10.10:
- /nfsfile 192.168.10.*
- # NFS客戶端創建一個掛載目錄,掛載服務端NFS文件系統到本地
- # 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
- # 掛載成功后就應該能夠順利地看到在執行前面的操作時寫入的文件內容了
- [root@localhost ~]# cat /nfsfile/readme
- welcome to linuxprobe.com
- # 如果希望NFS文件共享服務能一直有效,則需要將其寫入到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