NFS筆記(一)NFS服務器工做原理及詳細配置

1、NFS工做原理

一、什麼是NFS服務器

  NFS就是Network File System的縮寫,它最大的功能就是能夠經過網絡,讓不一樣的機器、不一樣的操做系統能夠共享彼此的文件。vim

  NFS服務器可讓PC將網絡中的NFS服務器共享的目錄掛載到本地端的文件系統中,而在本地端的系統中來看,那個遠程主機的目錄就好像是本身的一個磁盤分區同樣,在使用上至關便利;centos

二、NFS掛載原理

  NFS服務器的掛載結構圖:服務器

 

  如上圖示:網絡

  當咱們在NFS服務器設置好一個共享目錄/home/public後,其餘的有權訪問NFS服務器的NFS客戶端就能夠將這個目錄掛載到本身文件系統的某個掛載點,這個掛載點能夠本身定義,如上圖客戶端A與客戶端B掛載的目錄就不相同。而且掛載好後咱們在本地可以看到服務端/home/public的全部數據。若是服務器端配置的客戶端只讀,那麼客戶端就只可以只讀。若是配置讀寫,客戶端就可以進行讀寫。掛載後,NFS客戶端查看磁盤信息命令:#df –h。app

既然NFS是經過網絡來進行服務器端和客戶端之間的數據傳輸,那麼二者之間要傳輸數據就要有想對應的網絡端口,NFS服務器到底使用哪一個端口來進行數據傳輸呢?基本上NFS這個服務器的端口開在2049,但因爲文件系統很是複雜。所以NFS還有其餘的程序去啓動額外的端口,這些額外的用來傳輸數據的端口是隨機選擇的,是小於1024的端口;既然是隨機的那麼客戶端又是如何知道NFS服務器端到底使用的是哪一個端口呢?這時就須要經過遠程過程調用(Remote Procedure Call,RPC)協議來實現了!tcp

三、RPC與NFS如何通信

  由於NFS支持的功能至關多,而不一樣的功能都會使用不一樣的程序來啓動,每啓動一個功能就會啓用一些端口來傳輸數據,所以NFS的功能對應的端口並不固定,客戶端要知道NFS服務器端的相關端口才能創建鏈接進行數據傳輸,而RPC就是用來統一管理NFS端口的服務,而且統一對外的端口是111,RPC會記錄NFS端口的信息,如此咱們就可以經過RPC實現服務端和客戶端溝通端口信息。PRC最主要的功能就是指定每一個NFS功能所對應的port number,而且通知客戶端,記客戶端能夠鏈接到正常端口上去。ui

  那麼RPC又是如何知道每一個NFS功能的端口呢?spa

  首先當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生效rest

四、NFS客戶端和NFS服務端通信過程

 

1)首先服務器端啓動RPC服務,並開啓111端口

2)服務器端啓動NFS服務,並向RPC註冊端口信息

3)客戶端啓動RPC(portmap服務),向服務端的RPC(portmap)服務請求服務端的NFS端口

4)服務端的RPC(portmap)服務反饋NFS端口信息給客戶端。

5)客戶端經過獲取的NFS端口來創建和服務端的NFS鏈接並進行數據的傳輸。

 

2、NFS部署

 

一、  查看系統信息

[root@server7 ~]# cat /etc/redhat-release
CentOS release 7.3.1611 (AltArch)
root@server7 ~]# uname -a
Linux server7.ctos.zu 3.10.0-514.el7.centos.plus.i686 #1 SMP Wed Jan 25 12:55:04 UTC 2017 i686 i686 i386 GNU/Linux

要養成一個習慣,就是先查看系統版本和內核參數。同一個軟件在不一樣版本,內核之間是有差別的,因此部署的方法也不同,不要由於這個而形成沒必要要的錯誤。

 

二、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主程序

2.一、查看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

2.二、安裝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.service - RPC bind service

   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled)

   Active: active (running) since 一 2017-09-04 10:03:20 CST; 1s ago

  Process: 3583 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)

 Main PID: 3584 (rpcbind)

   CGroup: /system.slice/rpcbind.service

           └─3584 /sbin/rpcbind -w

9月 04 10:03:19 server7.ctos.zu systemd[1]: Starting RPC bind service...

9月 04 10:03:20 server7.ctos.zu systemd[1]: Started RPC bind service.

注:rpcbind安裝成功後默認已經開啓,而且爲開機自動啓動。若是沒有啓動的話,咱們來從新啓動rcpbind服務

[root@server7 ~]# systemctl restart  rpcbind

查看PRC端口

[root@server7 ~]# yum install net-tools lsof

[root@server7 ~]# lsof  -i:111

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

systemd    1 root   56u  IPv6  43164      0t0  TCP *:sunrpc (LISTEN)

systemd    1 root   57u  IPv4  43165      0t0  TCP *:sunrpc (LISTEN)

rpcbind 3584  rpc    4u  IPv6  43164      0t0  TCP *:sunrpc (LISTEN)

rpcbind 3584  rpc    5u  IPv4  43165      0t0  TCP *:sunrpc (LISTEN)

rpcbind 3584  rpc    8u  IPv4  44975      0t0  UDP *:sunrpc

rpcbind 3584  rpc   10u  IPv6  44977      0t0  UDP *:sunrpc

[root@server7 ~]# netstat -tlunp |grep rpcbind

udp        0      0 0.0.0.0:111             0.0.0.0:*                         3584/rpcbind      

udp        0      0 0.0.0.0:791             0.0.0.0:*                           3584/rpcbind      

udp6       0      0 :::111                  :::*                                3584/rpcbind      

udp6       0      0 :::791                  :::*                                3584/rpcbind

未啓動NFS以前查看NFS服務向PRC註冊的端口信息

[root@server7 ~]# rpcinfo -p localhost

   program vers proto   port  service

    100000    4   tcp    111  portmapper

    100000    3   tcp    111  portmapper

    100000    2   tcp    111  portmapper

    100000    4   udp    111  portmapper

    100000    3   udp    111  portmapper

   100000    2   udp    111  portmapper

3.二、RPC服務啓動後再啓動NFS服務

查看狀態

[root@server7 ~]# systemctl status  nfs

● nfs-server.service - NFS server and services

   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)

   Active: inactive (dead)

默認未啓動,系統開機重啓後不啓動,啓動nfs服務,將設置爲開機啓動。

[root@server7 ~]# systemctl start nfs

[root@server7 ~]# systemctl enable nfs

Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

[root@server7 ~]# systemctl status  nfs

● nfs-server.service - NFS server and services

   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)

   Active: active (exited) since 一 2017-09-04 10:15:21 CST; 19s ago

 Main PID: 3654 (code=exited, status=0/SUCCESS)

   CGroup: /system.slice/nfs-server.service

 

9月 04 10:15:21 server7.ctos.zu systemd[1]: Starting NFS server and services...

9月 04 10:15:21 server7.ctos.zu systemd[1]: Started NFS server and services.

啓動NFS後咱們再次查看rpc註冊的端口信息

[root@server7 ~]# rpcinfo -p localhost

   program vers proto   port  service

    100000    4   tcp    111  portmapper

    100000    3   tcp    111  portmapper

    100000    2   tcp    111  portmapper

    100000    4   udp    111  portmapper

    100000    3   udp    111  portmapper

    100000    2   udp    111  portmapper

    100024    1   udp  56626  status

    100024    1   tcp  42691  status

    100005    1   udp  20048  mountd

    100005    1   tcp  20048  mountd

    100005    2   udp  20048  mountd

    100005    2   tcp  20048  mountd

   100005    3   udp  20048  mountd

    100005    3   tcp  20048  mountd

    100003    3   tcp   2049  nfs

    100003    4   tcp   2049  nfs

    100227    3   tcp   2049  nfs_acl

    100003    3   udp   2049  nfs

    100003    4   udp   2049  nfs

    100227    3   udp   2049  nfs_acl

    100021    1   udp  57225  nlockmgr

    100021    3   udp  57225  nlockmgr

    100021    4   udp  57225  nlockmgr

   100021    1   tcp  35665  nlockmgr

    100021    3   tcp  35665  nlockmgr

  100021    4   tcp  35665  nlockmgr

在確認啓動沒用問題後咱們看一看NFS到底開了哪些端口

[root@server7 ~]# netstat -tulnp |grep -E '(rpc|nfs)'

tcp        0      0 0.0.0.0:42691           0.0.0.0:*               LISTEN      3634/rpc.statd    

tcp        0      0 0.0.0.0:20048           0.0.0.0:*               LISTEN      3642/rpc.mountd   

tcp6       0      0 :::39614                :::*                    LISTEN      3634/rpc.statd    

tcp6       0      0 :::20048                :::*                    LISTEN      3642/rpc.mountd   

udp        0      0 127.0.0.1:842           0.0.0.0:*                           3634/rpc.statd    

udp        0      0 0.0.0.0:20048           0.0.0.0:*                           3642/rpc.mountd   

udp        0      0 0.0.0.0:111             0.0.0.0:*                           3584/rpcbind      

udp        0      0 0.0.0.0:791             0.0.0.0:*                           3584/rpcbind      

udp        0      0 0.0.0.0:56626           0.0.0.0:*                           3634/rpc.statd    

udp6       0      0 :::56122                :::*                                3634/rpc.statd    

udp6       0      0 :::20048                :::*                                3642/rpc.mountd   

udp6       0      0 :::111                  :::*                                3584/rpcbind      

udp6       0      0 :::791                  :::*                                3584/rpcbind      

四、NFS常見進程詳解

[root@server7 ~]# ps -ef |egrep "rpc|nfs「

rpc       3584     1  0 10:03 ?        00:00:00 /sbin/rpcbind -w

rpcuser   3634     1  0 10:15 ?        00:00:00 /usr/sbin/rpc.statd --no-notify

root      3637     2  0 10:15 ?        00:00:00 [rpciod]

root      3642     1  0 10:15 ?        00:00:00 /usr/sbin/rpc.mountd

root      3652     1  0 10:15 ?        00:00:00 /usr/sbin/rpc.idmapd

root      3657     2  0 10:15 ?        00:00:00 [nfsd4_callbacks]

root      3663     2  0 10:15 ?        00:00:00 [nfsd]

root      3664     2  0 10:15 ?        00:00:00 [nfsd]

root      3665     2  0 10:15 ?        00:00:00 [nfsd]

root      3666     2  0 10:15 ?        00:00:00 [nfsd]

root      3667     2  0 10:15 ?        00:00:00 [nfsd]

root      3668     2  0 10:15 ?        00:00:00 [nfsd]

root      3669     2  0 10:15 ?        00:00:00 [nfsd]

root      3670     2  0 10:15 ?        00:00:00 [nfsd]

root      3705  3267  0 10:23 pts/0    00:00:00 grep -E --color=auto 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而已

 

配置實例:

/home/test  1192.168.1.0/24(rw,sync,all_squash,anonuid=2000,anongid=2000)

###注意紅色部分不能有空格!!生產環境中經常使用的一種配置,適合多客戶端共享一個NFS目錄。All_squash 也就是說無論客戶端是以什麼樣的身份來進行訪問的,都會被壓縮成爲all_squash後面所接的用戶和羣組身份。這邊用anonuid、anongid編號來標示。=

小結:

服務器共享配置格式:

1)基本格式:共享目錄 ip/24(共享屬性)  ->注意無空格

2)共享權限設置:

rw讀寫屬性

sync文件實際寫入磁盤後才返回

all_squash:全部訪問用戶均被壓縮成後續接的用戶。

anonuid:默認壓縮的用戶

anongid:默認壓縮的用戶組

那麼客戶端以什麼身份來訪問?

客戶端訪問服務端默認是使用nfsnobody這個用戶來進行訪問的。uid和gid爲65534。服務器默認共享時,也是加上了all_squash這個參數。並制定anonuid爲65534(也就是nfsnobayd用戶)。固然若是系統中nfsnobody是其餘的uid,那麼就有可能形成訪問權限出現問題。因此最好咱們能夠經過一設置一個用戶來訪問,統一UID、GID。

掛載狀況怎樣呢?

有兩個重要的文件,可以解決這個疑問。/var/lib/nfs/etab、/var/lib/nfs/rmtab這兩個文件就可以查看服務器上共享了什麼目錄,到底有多少客戶端掛載了共享,能查看到客戶端掛載的具體信息。

一、etab這個文件能看到服務器上共享了哪些目錄,執行哪些人可使用,而且設定的參數爲什麼。

二、rmtab這個文件就是可以查看到共享目錄被掛載的狀況。

相關文章
相關標籤/搜索