NFS介紹、NFS服務端安裝配置、NFS配置選項

科技小能手發表於2017-11-12

NFS 介紹

NFS(Network File System)即網路檔案系統,是FreeBSD支援的檔案系統中的一種,它允許網路中的計算機之間通過TCP/IP網路共享資源。在NFS的應用中,本地NFS的客戶端應用可以透明地讀寫位於遠端NFS伺服器上的檔案,就像訪問本地檔案一樣。NFS的資料傳輸基於RPC(remote procedure call)協議。

  • NFS 應用場景是:A,B,C 三臺機器上需要保證被訪問到的檔案是一樣的。A共享資料出來,B和C分別去掛載A共享的資料目錄,從而B和C訪問到的資料和A上的一致。

    • 例子:跑了一個網站,上面傳輸了很多圖片,使用者訪問一個圖片時,需要從A機器上去請求,但A機器負載高,為了分擔負載,就多弄了兩臺機器,B機器C機器同時提供服務;正常的話,需要到A機器上才能拿到資料,但是B機器和C機器做了負載均衡,分擔了相同的伺服器,那麼使用者也有可能到B機器或者C機器上;那麼使用者請求到B機器上的時候,如何才能獲取到A機器上的資料呢;要麼把A機器的資料傳輸到B機器上,同時傳輸到C機器上,但是這個不能時時更新,(使用者上傳的資料是存放在A機器上,但使用者請求的時候資料是請求到B機器上)這樣A上的資料還沒到B上面去,就會導致使用者請求獲取的資料訪問不到,訪問為空,為404;那麼NFS服務就可以解決這個問題,將A機器的資料共享到B機器、C機器,通過NFS來實現。有NFS服務以後,上傳到A機器上的資料,B機器或C機器上就能馬上看到和呼叫。NFS可以實時同步資料。
  • NFS原理圖

p0TKJJ.jpg

NFS服務需藉助RPC協議實現通訊。

服務端需要啟動一個NFS服務,服務端要想給客戶端提供服務,需要藉助RPC協議,RPC協議是由rpcbind服務所實現的;在centos 5或者之前的版本叫portmap服務,centos6及之後的版本叫rpcbind服務,這兩個都是一個服務,最終實現了RPC協議的通訊,NFS服務預設不會監聽任何埠(啟動服務,但不會監聽埠),最終監聽埠,實現RPC通訊的過程是由rpcbind服務產生的RPC協議實現的,RPC協議 預設監聽的埠是111 埠;

整個流程為: 服務端的NFS服務監聽一個埠通過RPC協議監聽的埠,再去告訴客戶端RPC協議,然後NFS客戶端通過本機的RPC埠回傳資料資訊到服務端NFS監聽的埠,最終實現通訊.

NFS 服務端安裝配置

準備兩臺虛擬機器,一臺作為服務端,一臺作為客戶端。

服務端配置

服務端IP:192.168.159.131

  • 安裝NFS工具:

    [root@localhost ~]# yum install -y nfs-utils rpcbind

  • 配置

    編輯/etc/exports 檔案,加入下面內容:

    [root@localhost ~]# vim /etc/exports

    /home/nfstestdir 192.168.159.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)

    // /home/nfstestdir 要分享出去的目錄是哪一個,這個目錄是不存在的,後期還需要建立。

    // ip段 為指定要給哪個ip段機器去分享這個目錄,也可以寫單個ip。

  • 啟動NFS服務

    在yum安裝完成後,系統會自動啟動rpcbind服務(在服務端程式名為systemd),預設監聽的埠為111埠

    [root@localhost ~]# ps aux | grep rpc

    rpc 2390 0.0 0.0 64964 1044 ? Ss 21:19 0:00 /sbin/rpcbind -w

    root 3826 0.0 0.0 112680 972 pts/0 R+ 21:31 0:00 grep –color=auto rpcbind

    [root@localhost ~]# netstat -lntp 

    Active Internet connections (only servers)

    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name 

    tcp 0 0 0.0.0.0:111 0.0.0.0: LISTEN 1/systemd 

    ……

    tcp6 0 0 :::111 :::
     LISTEN 1/systemd 

    ……

    啟動NFS服務:

    [root@localhost ~]# systemctl start nfs

    //啟動NFS 服務是會自動幫你啟動rpc相關的服務

    將NFS服務加入開機啟動項:

    [root@localhost ~]# systemctl enable nfs

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

客戶端配置

IP : 192.168.159.132

  • 安裝NFS工具

    [root@localhost ~]# yum install -y nfs-utils

  • 客戶端掛載

    檢查客戶端是否有許可權訪問服務端檔案:

    [root@localhost ~]# showmount -e 192.168.159.131 //131為服務端ip

    clnt_create: RPC: Port mapper failure – Unable to receive: errno 113 (No route to host)

    // 報錯!說明網路不通,不能和192.168.159.131 的113埠通訊。

    解決辦法:

    1、檢查服務端NFS服務是否開啟(有沒有監聽111埠)

    2、如果確認服務端NFS服務已經開啟,那麼檢查防火牆狀態,關閉服務端和客戶端firewalld和SELinux防火牆(systemctl stop firewalld)

    關閉防火牆後再次檢查客戶端是否有許可權訪問服務端檔案:

    [root@localhost ~]# showmount -e 192.168.159.131

    Export list for 192.168.159.131:

    /home/nfstestdir 192.168.159.0/24

    // 客戶端已有許可權訪問服務端

    開始掛載:

    [root@localhost ~]# mount -t nfs 192.168.159.131:/home/nfstestdir /mnt/

    // -t 指定檔案系統型別

    [root@localhost ~]# df -h

    檔案系統 容量 已用 可用 已用% 掛載點

    ……

    192.168.159.131:/home/nfstestdir 16G 5.2G 11G 33% /mnt

  • 測試

    在客戶端/mnt目錄下建立test檔案

    [root@localhost ~]# touch /mnt/test

    [root@localhost ~]# ls -l /mnt/

    總用量 0

    -rw-r–r–. 1 mysql mysql 0 1月 16 22:05 test

    檢視服務端/home/nfstestdir/目錄:

    [root@localhost ~]# ls -l /home/nfstestdir/

    總用量 0

    -rw-r–r–. 1 mysql mysql 0 1月 16 22:05 test

    // 存在個客戶端上一樣的檔案,實現了同步共享。

其中,檔案的使用者和使用者組都為mysql,是因為之前nfs服務端配置時,指定了anonuid=1000,anongid=1000。

服務端:
[root@localhost ~]# awk -F `:` `$3==1000 {print $0}` /etc/passwd
mysql:x:1000:1000::/home/mysql:/bin/bash
客戶端:
[root@localhost ~]# awk -F `:` `$3==1000 {print $0}` /etc/passwd
mysql:x:1000:1000::/home/mysql:/bin/bash
// 由於兩邊uid都為1000,所以都為mysql使用者。所以檔案的所屬組和所屬主是由服務端配置檔案中定義的anonuid,anongid決定的。(假設兩個伺服器上uid1000不是同一個使用者,則同步檔案在兩個伺服器上的屬主和屬組是不一樣的。)

NFS配置選項

  • rw 讀寫
  • ro 只讀
  • sync 同步模式,記憶體資料實時寫入磁碟/ 記憶體資料實時寫入磁碟,這樣會降低磁碟效率。
  • async 非同步模式 // 每隔一段時間把記憶體資料刷入磁碟一次,如果突然斷電,會丟失一本分資料。
  • no_root_squash 客戶端掛載NFS共享目錄後,root使用者不受約束,許可權很大
  • root_squash 與上面選項相對,客戶端上的root使用者收到約束,被限定成某個普通使用者
  • all_squash 客戶端上所有使用者在使用NFS共享目錄時都被限定為一個普通使用者
  • anonuid/anongid 和上面幾個選項搭配使用,定義被限定使用者的uid和gid

本文轉自 豆渣鍋 51CTO部落格,原文連結:http://blog.51cto.com/754599082/2061798


相關文章