1. 程式人生 > >第十四章 NFS服務搭建與配置

第十四章 NFS服務搭建與配置

14.1 NFS介紹

rpcbind 監聽111埠

14.2 NFS服務端安裝配置

yum -y install nfs-utils rpcbind

NFS選項 功能描述 NFS選項 功能描述
ro 只讀共享 rw 可讀可寫共享
sync 同步寫操作 async 非同步寫操作
wdelay 延遲寫操作 root_squash 遮蔽遠端root許可權
no_root_squash 不遮蔽遠端root許可權 all_squash 遮蔽所有的遠端使用者許可權

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

mkdir /home/nfstestdir

chmod 777 /home/nfstestdir/ 為了方便實驗

systemctl start rpcbind.service

systemctl start nfs

服務端有rpcbind的程序

設定為開機啟動

systemctl enable nfs

14.3 NFS配置選項

NFS選項 功能描述 NFS選項 功能描述
ro 只讀共享 rw 可讀可寫共享
sync 同步寫操作 async 非同步寫操作
wdelay 延遲寫操作 root_squash 遮蔽遠端root許可權
no_root_squash 不遮蔽遠端root許可權 all_squash 遮蔽所有的遠端使用者許可權

客戶端上安裝nfs-utils

客戶端掛載

mount -t nfs 192.168.93.128:/home/nfstestdir /mnt

14.4 exportfs命令

nfs選項

https://www.cnblogs.com/pengdonglin137/p/3283316.html

-oonlock 檔案不加鎖

服務端上寫入配置檔案

/tmp    192.168.93.129(rw,sync,no_root_squash)

exportfs -arv 不用重啟服務,重新載入配置檔案

客戶端掛載

mount -t nfs 192.168.93.128:/tmp /mnt

客戶端 touch 123.txt

14.5 NFS客戶端問題

mount -t nfs -Oremount,nfsvers=3 192.168.93.128:/tmp /mnt

nfsvers=3 使用第三版本的NFS協議


http://blog.51cto.com/m51cto/2087738

課堂串講

14.1 NFS介紹
14.2 NFS服務端安裝配置
14.3 NFS配置選項

NFS介紹

  • NFS是Network File System的縮寫;這個檔案系統是基於網路層面,通過網路層面實現資料同步

  • NFS最早由Sun公司開發,分2,3,4三個版本,2和3由Sun起草開發,4.0開始Netapp公司參與並主導開發,目前最新為4.1版本——>4.1版本是2010年出來還沒更新過

  • NFS資料傳輸基於RPC協議,RPC為Remote Procedure Call的簡寫,意思為 遠端過程呼叫

    • 例子:
      • 服務端和客戶端通訊,A機器和B機器之間不能直接通訊,需要藉助RPC協議來實現
  • NFS應用場景是:A,B,C三臺機器上需要保證被訪問到的檔案是一樣的,A共享資料出來,B和C分別去掛載A共享的資料目錄,從而B和C訪問到的資料和A上的一致

  • NFS架構

    輸入圖片說明

    • 例子:
      • 跑了一個網站,上面傳輸了很多圖片,使用者訪問一個圖片時,需要從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原理圖

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

輸入圖片說明

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

NFS服務端安裝配置目錄概要

  • yum install -y nfs-utils rpcbind
  • vim /etc/exports //加入如下內容
/home/nfstestdir 192.168.180.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)
  • 儲存配置檔案後,執行如下準備操作
  • mkdir /home/nfstestdir
  • chmod 777 /home/nfstestdir
  • systemctl start rpcbind
  • systemctl start nfs
  • systemctl enable rpcbind
  • systemctl enable nfs

NFS服務端安裝配置

  1. 首先準備兩臺機器,我這裡準備兩臺虛擬機器,A機器IP分別為192.168.180.134,B機器IP為192.168.180.135
  2. 將A機器作為服務端,並安裝兩個包,分別為 nfs-utils 和 rpcbind
  • yum install -y nfs-utils rpcbind
[[email protected] ~]# yum install -y nfs-utils rpcbind
  • 將B機器作為客戶端,安裝 nfs-utils 包
  • 每次剛開機執行yum的時候都會很慢,因為需要重新生成一個快取檔案
  • 有時yum安裝的時候很慢,我們可以先禁掉,進入到/etc/yum.repos.d/目錄下,將目錄下的epel.repo檔案改個名字,重新安裝即可
  • yum install -y nfs-utils
[[email protected] ~]# yum install -y nfs-utils 
  • 在安裝完成後,需要去A機器中 /etc/exports 編輯配置檔案
  • vim /etc/exports //加入如下內容
[[email protected] ~]# vim /etc/exports

/home/nfstestdir     192.168.180.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)
  1. 下面就可以啟動服務了,啟動服務前需要先建立目錄,並設定許可權
  2. 在A機器上建立分享的目錄 並設定成777的許可權,這裡設定777許可權是為了方便接下里的實驗
[[email protected] ~]# mkdir /home/nfstestdir
[[email protected] ~]# chmod 777 /home/nfstestdir/
  • 啟動 rpcbind ,再啟動前檢視A機器上監聽的埠,就會看到啟動了systemd,這是centos7系統的一個特性——>111埠是rpcbind服務監聽的
  • 用ps可以檢視服務已經啟動,因為有這個服務,所以監聽了111埠
[[email protected] ~]# 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      3428/rpcbind        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1110/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1467/master         
tcp6       0      0 :::111                  :::*                    LISTEN      3428/rpcbind        
tcp6       0      0 :::22                   :::*                    LISTEN      1110/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      1467/master         
tcp6       0      0 :::3306                 :::*                    LISTEN      1423/mysqld         
[[email protected] ~]# ps aux |grep rpc
rpc       3428  0.0  0.0  64956  1044 ?        Ss   22:42   0:00 /sbin/rpcbind -w
root      3431  0.0  0.0 112676   980 pts/0    R+   22:43   0:00 grep --color=auto rpc
  • 再到B機器上檢視下埠,會看到也啟動了rpcbind
[[email protected] mysql]# 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      2755/rpcbind        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      996/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1215/master         
tcp6       0      0 :::111                  :::*                    LISTEN      2755/rpcbind        
tcp6       0      0 :::22                   :::*                    LISTEN      996/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1215/master         
tcp6       0      0 :::3306                 :::*                    LISTEN      2360/mysqld         
[[email protected] mysql]# ps aux |grep rpc
rpc       2755  0.0  0.0  64956  1044 ?        Ss   22:42   0:00 /sbin/rpcbind -w
root      2789  0.0  0.0 112676   980 pts/0    R+   22:45   0:00 grep --color=auto rpc
  • 在A機器啟動了rpcbind,下面就可以啟動nfs服務,在使用ps檢視
  • systemctl start nfs
[[email protected] ~]# systemctl start nfs
[[email protected] ~]# ps aux |grep nfs
root      3479  0.0  0.0      0     0 ?        S<   22:46   0:00 [nfsd4_callbacks]
root      3485  0.0  0.0      0     0 ?        S    22:46   0:00 [nfsd]
root      3486  0.0  0.0      0     0 ?        S    22:46   0:00 [nfsd]
root      3487  0.0  0.0      0     0 ?        S    22:46   0:00 [nfsd]
root      3488  0.0  0.0      0     0 ?        S    22:46   0:00 [nfsd]
root      3489  0.0  0.0      0     0 ?        S    22:46   0:00 [nfsd]
root      3490  0.0  0.0      0     0 ?        S    22:46   0:00 [nfsd]
root      3491  0.0  0.0      0     0 ?        S    22:46   0:00 [nfsd]
root      3492  0.0  0.0      0     0 ?        S    22:46   0:00 [nfsd]
root      3496  0.0  0.0 112676   976 pts/0    R+   22:46   0:00 grep --color=auto nfs
  • 同時也可以在A機器上ps aux |grep rpc查詢,在啟動nfs服務的時候,它會自動幫你啟動rpc相關的一些服務
[[email protected] ~]# ps aux |grep rpc
rpc       3428  0.0  0.0  64956  1424 ?        Ss   22:42   0:00 /sbin/rpcbind -w
rpcuser   3449  0.0  0.0  42376  1756 ?        Ss   22:46   0:00 /usr/sbin/rpc.statd
root      3451  0.0  0.0      0     0 ?        S<   22:46   0:00 [rpciod]
root      3468  0.0  0.0  42564   948 ?        Ss   22:46   0:00 /usr/sbin/rpc.mountd
root      3469  0.0  0.0  43816   544 ?        Ss   22:46   0:00 /usr/sbin/rpc.idmapd
root      3499  0.0  0.0 112676   980 pts/0    R+   22:47   0:00 grep --color=auto rpc
  • 而在客戶端B機器上是沒有的這些服務的
  • 如果想讓nfs開機啟動,還需要執行systemctl enable nfs 命令,在服務端A機器上呼叫
  • systemctl enable nfs 開機啟動nfs
  • systemctl disable nfs 關閉開機啟動
[[email protected] ~]# systemctl enable nfs 
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

NFS配置選項

  • rw 讀寫
  • ro 只讀
  • sync 同步模式,記憶體資料實時寫入磁碟,相應的就會降低磁碟效率
  • async 非同步模式,它會每隔一段時間才會將資料重新整理到磁碟
    • 優勢:能夠保證磁碟的效率
    • 劣勢:萬一斷電,就會有可能丟失一部門資料
  • no_root_squash 客戶端掛載NFS共享目錄後,root使用者不受約束,許可權很大
    • NFS,要想在客戶端上去使用服務端上共享的目錄,需要去把它掛載到客戶端上的一個掛載點,那就跟本地上的目錄是一樣的,在操作本地的目錄時候,肯定會有一些許可權設定,如果加上no_root_squash,這樣root使用者去共享目錄下讀寫檔案的時候,就不會受到限制(就相當於root使用者在本地上讀寫)
  • root_squash 與上面選項相對,客戶端上的root使用者收到約束,被限定成某個普通使用者
  • all_squash 客戶端上所有使用者(包括root使用者)在使用NFS共享目錄時都被限定為一個普通使用者
  • anonuid/anongid 和上面幾個選項搭配使用,定義被限定使用者的uid和gid

客戶端上掛載

  1. 首先在客戶端B機器上安裝了rpcbind,它是由nfs-utils 這個包自動安裝的
  2. 在B機器上安裝完成後不需要啟動任何服務
  3. 在B機器上執行 showmount -e 命令
  • showmount -e 192.168.180.134 //檢視在NFS服務端是否有許可權
    • 該ip為NFS服務端ip
[[email protected] mysql]# showmount -e 192.168.180.134
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
  • 這時候會看到報錯了,RPC: Port mapper failure說明網路不通,無法與192.168.180.134埠通訊
  • 不能通訊的兩種情況
    • 要麼是對方沒有開啟rpcbind的服務,沒有監聽111埠
    • 要麼是防火牆導致的原因
  1. 因為之前在服務端已經開啟了rpcbind服務,那這時只能說明是防火牆導致的,所以要想讓NFS實現正常的通訊,還需要把防火牆關閉,因為NFS服務比較特殊,雖然rpc可以通訊,就算iptables把111埠放行但NFS也不一定能正常通訊,因為它們使用了一個不固定的埠
  2. 這時先把A機器服務端和B機器客戶端,防火牆關閉,命令systemctl stop firewalld  setenforce 0
  3. 這時再去B機器客戶端來showmount -e 192.168.180.134 ,這時會看到可以能show到遠端服務端192.168.180.134這臺機器,它共享的目錄是/home/nfstestdir
[[email protected] ~]# showmount -e 192.168.180.134
Export list for 192.168.180.134:
/home/nfstestdir 192.168.180.0/24
  • 這時候在B機器客戶端上來掛載了,然後檢視——>掛載的時間可能有點慢
[[email protected] ~]# mount -t nfs 192.168.180.134:/home/nfstestdir /mnt/
[[email protected] ~]# df -h
檔案系統                          容量  已用  可用 已用% 掛載點
/dev/mapper/centos-root            18G  5.6G   13G   32% /
devtmpfs                          905M     0  905M    0% /dev
tmpfs                             916M     0  916M    0% /dev/shm
tmpfs                             916M  8.6M  908M    1% /run
tmpfs                             916M     0  916M    0% /sys/fs/cgroup
/dev/sda1                         197M  121M   77M   62% /boot
tmpfs                             184M     0  184M    0% /run/user/0
192.168.180.134:/home/nfstestdir   18G  8.1G  9.8G   46% /mnt
  1. 這個就是遠端NFS服務端共享的目錄
  2. 這時到B機器客戶端共享的目錄下建立檔案
[[email protected] ~]# cd /mnt/
[[email protected] mnt]# ls 
[[email protected] mnt]# touch yueyong.txt
[[email protected] mnt]# ll
總用量 0
-rw-r--r-- 1 user1 user1 0 6月  21 23:15 yueyong.txt
[[email protected] mnt]# id user1
uid=1000(user1) gid=1000(user1) 組=1000(user1)
  • 到A機器的服務端檢視,可以看到檔案的屬主和屬組都為1000
[[email protected] ~]# ll /home/nfstestdir/
總用量 0
-rw-r--r-- 1 yyl yyl 0 6月  21 23:15 yueyong.txt
[[email protected] ~]# id yyl
uid=1000(yyl) gid=1000(yyl) 組=1000(yyl)
  • 原因是配置 /etc/export 檔案時,配置了anonuid=1000,anongid=1000
  • 客戶端顯示 user 使用者 是因為客戶端機器user就是1000許可權的使用者
  • 同樣,服務端顯示yyl,是因為服務端上的機器yyl 就是1000許可權的使用者

總結

  • 在/etc/exports檔案中的/home/nfstestdir 192.168.180.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000) ,其中ip與(rw之間不能有空格, 否則客戶端掛載的目錄會變成只讀..