NFS概述
NFS是Network File System的縮寫,即網絡文件系統。它的主要功能是通過局域網讓不同的主機系統之間可以共享文件或者目錄,實現多臺服務器之間數據的一致性。它和我們Windows下的網絡共享和網絡驅動器類似,只不過它用於局域網的環境下。而NFS多應用於企業集羣架構中,作爲所有前端web服務的共享存儲。如果是大型的網站,可能會用到更復雜的方式,比如Moosefs、glusterfs等。
NFS通過網絡進行數據傳輸,傳輸端口爲2049,由於文件系統非常複雜,因此NFS還要依賴其它程序去啓動額外的端口(小於1024)傳輸數據,將端口告知給客戶端依賴於RPC(remote procedure call)協議。當NFS服務啓動時,會隨機選取數個端口,並向RPC註冊,因此RPC就可以知道每個端口對應的 NFS功能,以便客戶端連接正確的端口號。
NFS實現原理
首先服務器啓動rpc服務開啓111端口,當用戶進程訪問NFS客戶端,客戶端使用相應的函數對數據進行處理,再通過TCP/IP的方式傳遞給NFS服務器,當服務端收到請求後,會先調用portmap進程進行端口映射反饋給客戶端,客戶端再通過獲取的端口和服務端建立連接並進行數據的傳輸。
服務部署
實驗環境:
NFS服務端:172.16.1.51/24
NFS客戶端:172.16.1.41/24
服務端:
1.安裝服務軟件包
[root@nfs ~]# yum install -y nfs-utils rpcbind
2.配置服務文件
[root@nfs ~]# vim /etc/exports
[root@nfs ~]# cat /etc/exports
#可以指定主機、網段或域名
/data 172.16.1.0/24(rw,sync,all_squash,anonuid678,anongid678)
參數詳解:
參數 | 說明 |
---|---|
rw | 可讀寫 |
ro | 只讀 |
root_squash | 當NFS客戶端以root管理員訪問時,映射爲NFS服務端的匿名用戶 |
no_root_squash | 當NFS客戶端以root管理員訪問時,映射爲NFS服務端的root管理員 |
all_squash | 無論NFS客戶端使用什麼賬戶訪問,映射爲NFS服務端的匿名用戶 |
sync | 同時將數據寫入內存和磁盤,保證數據不丟失 |
async | 優先將數據保存到內存再寫入磁盤;效率到,但數據可能會丟失 |
anonuid | 配置all_squash使用,指定NFS的用戶UID,必須存在系統 |
anongid | 配置all_squash使用,指定NFS的用戶GID,必須存在系統 |
4.修改共享目錄所屬主、組
[root@nfs ~]# useradd -u 678 -g 678 www
[root@nfs ~]# groupadd -u 678 -g 678 www
[root@nfs ~]# mkdir /data
[root@nfs ~]# chown -R nfsnobody:nfsnobody /data/
5.啓動服務
[root@nfs ~]# systemctl start rpcbind
[root@nfs ~]# systemctl start nfs
==注意:==在啓動NFS之前要先啓動RPC,否則NFS就無法向RPC進行註冊。另外如果RPC重新啓動,原來註冊的數據就會消失。所以,在重啓RPC之後,它所管理的服務都要重啓以重新向RPC註冊。
客戶端:
1.安裝服務軟件包
[root@localhost ~]# yum install -y nfs-utils rpcbind
2.查看服務端是否生效
[root@localhost ~]# showmount -e 172.16.1.51
Export list for 172.16.1.51:
/data 172.16.1.0/24 //可以查看到信息說明已生效.
3.掛載
[root@localhost ~]# mkdir /nfs
[root@localhost ~]# mount 172.16.1.51:/data /nfs
4.啓動服務,客戶端只需啓動rpcbind
[root@localhost ~]# systemctl start rpcbind
nfs既然是通過網絡和服務端建立通信實現掛載到本地,那如果網絡中斷了怎麼辦?強制卸載並設置永久掛載
umount -lf /nfs
[root@localhost nfs]# echo "172.16.1.51:/data /nfs nfs defaults,netdev 0 0" >>/etc/fstab