NFS原理

一、什麼是NFS?
全稱 network file system 網絡文件系統
經過網絡存儲和組織文件的一種方法或機制。
什麼是文件系統?
二、爲何要用共享存儲?
前端全部的應用服務器接收到用戶上傳的圖片、文件、視頻,都會統一
的放到後端的存儲上。
爲何要共享?全部節點服務器都須要將內容存到存儲上,取的統一來取。
三、RPC與NFS如何通信
   由於NFS支持的功能至關多,而不一樣的功能都會使用不一樣的程序來啓動,每啓動一個功能就會啓用一些端口來傳輸數據,所以NFS的功能對應的端口並不固定 ,客戶端要知道NFS服務器端的相關端口才能創建鏈接進行數據傳輸,而RPC就是用來統一管理NFS端口的服務,而且統一對外的端口是111,RPC會記錄NFS端口的信息,如此咱們就可以經過RPC實現服務端和客戶端溝通端口信息。PRC最主要的功能就是指定每一個NFS功能所對應的port number,而且通知客戶端,記客戶端能夠鏈接到正常端口上去。
  那麼RPC又是如何知道每一個NFS功能的端口呢?
  首先當NFS啓動後,就會隨機的使用一些端口,而後NFS就會向RPC去註冊這些端口,RPC就會記錄下這些端口,而且RPC會開啓111端口,等待客戶端RPC的請求,若是客戶端有請求,那麼服務器端的RPC就會將以前記錄的NFS端口信息告知客戶端。如此客戶端就會獲取NFS服務器端的端口信息,就會以實際端口進行數據的傳輸了。
提示:在啓動NFS SERVER以前,首先要啓動RPC服務(即portmap服務,下同)不然NFS SERVER就沒法向RPC服務區註冊,另外,若是RPC服務從新啓動,原來已經註冊好的NFS端口數據就會所有丟失。所以此時RPC服務管理的NFS程序也要從新啓動以從新向RPC註冊。特別注意:通常修改NFS配置文檔後,是不須要重啓NFS的,直接在命令執行/etc/init.d/nfs  reload或exportfs –rv便可使修改的/etc/exports生效
四、NFS客戶端和NFS服務端通信過程
1)首先服務器端啓動RPC服務,並開啓111端口
2)服務器端啓動NFS服務,並向RPC註冊端口信息
3)客戶端啓動RPC(portmap服務),向服務端的RPC(portmap)服務請求服務端的NFS端口
4)服務端的RPC(portmap)服務反饋NFS端口信息給客戶端。
5)客戶端經過獲取的NFS端口來創建和服務端的NFS鏈接並進行數據的傳輸。
NFS部署
1.0、NFS軟件安裝
要部署NFS服務,必須安裝下面兩個軟件包: nfs-utils :NFS主程序, rpcbind :PRC主程序; 
NFS服務器端和Client端都須要這安裝這兩個軟件。
注意:NFS的RPC服務器,Centos5下名字爲portmap,CentOS6和CentOS7下名稱爲rcpbind
NFS軟件包
nfs-utils:NFS主程序,包含rpc.nfsd  rpc.mount兩個deamons
rpcbind:RPC主程序
一、查看NFS軟件包
       [root@server7 ~]# rpm -qa | egrep "nfs|rpcbind"
      [root@server7 ~]#
個人CentOS release 7.3.1611是最小化安裝,默認沒有安裝nfs和rpcbind
Yum搜尋下安裝包是否存在
[root@server7 ~]# yum search nfs-utils  rpcbind
二、安裝NFS和RPC服務
       [root@server7 ~]# yum install nfs-utils  rpcbind
       [root@server7 ~]# rpm -qa  | egrep "nfs|rpcbind"
  rpcbind-0.2.0-38.el7_3.1.i686
  nfs-utils-1.3.0-0.33.el7_3.i686
  libnfsidmap-0.25-15.el7.i686
 
查看這兩個軟件包在電腦裏都安裝了什麼文件;
[root@server7 ~]# rpm -ql nfs-utils
三、啓動NFS服務
3.一、啓動NFS服務以前先啓動rpcbind服務
查看rcpbind狀態
[root@server7 ~]# systemctl status rpcbind
注:rpcbind安裝成功後默認已經開啓,而且爲開機自動啓動。若是沒有啓動的話,咱們來從新啓動rcpbind服務
[root@server7 ~]# systemctl restart  rpcbind
查看PRC端口
[root@server7 ~]# netstat -tlunp |grep rpcbind
未啓動NFS以前查看NFS服務向PRC註冊的端口信息
[root@server7 ~]# rpcinfo -p localhost
3.二、RPC服務啓動後再啓動NFS服務
查看狀態
[root@server7 ~]# systemctl status  nfs
默認未啓動,系統開機重啓後不啓動,啓動nfs服務,將設置爲開機啓動。
[root@server7 ~]# systemctl start nfs
[root@server7 ~]# systemctl enable nfs
啓動NFS後咱們再次查看rpc註冊的端口信息
[root@server7 ~]# rpcinfo -p localhost
在確認啓動沒用問題後咱們看一看NFS到底開了哪些端口
[root@server7 ~]# netstat -tulnp |grep -E '(rpc|nfs)'
四、NFS常見進程詳解
[root@server7 ~]# ps -ef |egrep "rpc|nfs「
  • nfsd
   最主要的NFS服務提供程序,這個daemon主要的功能就是管理客戶端是否可以使用服務器文件系統掛載信息,其中還包含判斷這個登陸用戶的ID。
  •   rpc.mountd
   這個daemon主要功能則是管理NFS的文件系統。 當client端順利經過rpc.nfsd登入主機後,在它可使用NFS服務器提供規定文件以前,還會通過文件使用權限的認證程序。它會去讀取NFS的配置  文件/etc/exports來對比客戶端的權限,當經過這一關以後,client端也就取得使用NFS文件的權限。
  •   rpc.lockd (非必要)
  這個daemon用於管理文件的鎖定方面,當多個客戶端同時嘗試寫入某個文件時就能夠對該文件形成一些問題。rpc.lockd則能夠用來克服這此問題。但rpc.lockd必需要同時在客戶端和服務器端都開  啓才行。
  •  rpc.statd(非必要)
  這個daemon能夠用來檢查文件的一致性,若發生由於客戶端同時使用同一個文件形成文件損壞時,rpc.statd能夠用來檢測並嘗試恢復該文件
五、配置NFS服務
  NFS軟件很簡單,主要配置文件:/etc/exports,默認這個裏面內容是空的,若是沒有這個文件,可使用vim主動創建這個文件。至於NFS服務器的搭建也很簡單,只要編輯好主要配置文件/etc/exports以後,先啓動rpcbind(若已經啓動了,就不要從新啓動),而後再啓動nfs,NFS就成功了。
     那麼/etc/exports應該如何設置?
[root@server7 etc]# vi /etc/exports
/tmp/data      192.168.1.0/24(ro)          client-A.ctos.zu(rw,sync)
#[共享目錄]   [客戶端地址1(權限)]        [客戶端地址2(權限)]
以上是一個簡單案例配置, 每一行最前面是要共享出來的目錄,注意是以目錄爲單位的
共享目錄 :存在於咱們本機上的目錄,咱們想共享給網絡上的其餘主機使用。如我要共享/tmp/data目錄,那麼此選項能夠就直接寫/tmp/data目錄,這個目錄能夠依照不一樣的權限共享給不一樣的主機。
客戶端地址1(參數1,參數2):客戶端地址可以設置一個網絡,也能夠設置單個主機。
參數:如讀寫權限rw,同步更新sync,壓縮來訪帳號all_squash,壓縮後的匿名帳號anonuid=uid,anongid=gid等等;
客戶端地址的設置主要有如下幾種方式:
1)、 可使用完整的IP或者是網絡號,例如192.168.100.100 或 192.168.8.0/24
2)、 可使用主機名,但這個主機名必需要在/etc/hosts內,或可使用DNS找到該名稱才行 ,反正重點是可找到IP就行,若是是主機名的話,還能夠支持通配符,例如‘*’或‘?’都可接受;例如:host[1-8].ctos.zu,server?.test.com
NFS權限設置
NFS配置權限設置,即/etc/exports文件配置格式中小括號()裏的參數集;
參數命令
參數用途
rw
表示可讀寫
ro
Read-only表示只能讀權限
Sync
請求或者寫入數據時,數據同步寫入到NFS server的硬盤中後纔會返回
no_root_squas
訪問nfs server共享目錄的用戶若是是root的話,它對該目錄具備root權限。這個配置本來爲無盤用戶準備的。用戶應避免使用!
root_squash
對於訪問NFS server共享目錄的用戶,若是是root的話會被壓縮成爲nobody用戶身份。
all_squash
無論訪問nfs server共享目錄的用戶身份如何包括root,它的權限都將被壓縮成爲匿名用戶,同時他們的udi和gid都會變成nobody或nfsnobody帳戶的uid,gid。在多個nfs客戶端同時讀寫nfs server數據時,這個參數頗有用能夠確保你們寫入的數據的權限是同樣的。
但不一樣系統有可能匿名用戶的uid,gid不一樣。由於此處咱們須要服務端和客戶端之間的用戶是同樣的。好比說:服務端指定匿名用戶的UID爲2000,那麼客戶端也必定要存在2000這個帳號才能夠
anonuid
anonuid就是匿名的uid和gid。說明客戶端以什麼權限來訪問服務端,在默認狀況下是nfsnobody。Uid65534.
anongid
同anongid,就是把uid換成gid而已
 async 寫入數據時,只寫入到緩衝區
配置實例:
/home/test  192.168.1.0/ 24(rw, sync,all_squash,anonuid=2000,anongid=2000)
###注意紅色部分不能有空格!!生產環境中經常使用的一種配置,適合多客戶端共享一個NFS目錄。All_squash 也就是說無論客戶端是以什麼樣的身份來進行訪問的,都會被壓縮成爲all_squash後面所接的用戶和羣組身份。這邊用anonuid、anongid編號來標示。=
NFS默認用戶nfsnobody
[root@nfs01 ~]# grep nfsno /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data
[root@nfs01 ~]# ls -ld /data
drwxr-xr-x 2 nfsnobody nfsnobody 51 4月 16 10:24 /data
重啓NFS
[root@nfs01 ~]# systemctl reload nfs #《==生產場景必需要實現平滑重啓。
[root@nfs01 ~]# exportfs -r
上述兩者等價,選一個便可。
客戶端以什麼身份來訪問?
客戶端訪問服務端默認是使用nfsnobody這個用戶來進行訪問的。uid和gid爲65534。服務器默認共享時,也是加上了all_squash這個參數。並制定anonuid爲65534(也就是nfsnobayd用戶)。固然若是系統中nfsnobody是其餘的uid,那麼就有可能形成訪問權限出現問題。因此最好咱們能夠經過一設置一個用戶來訪問,統一UID、GID。
相關文章
相關標籤/搜索