NFS 部署

HammerZe發表於2021-12-30

NFS 部署

image

部署NFS實現多主機檔案共享,Web01、Web02、Web03做示例客戶端,實現功能如下:

image


NFS簡介

NFS是Network File System的縮寫及網路檔案系統。NFS主要功能是通過區域網路讓不同的主機系統之間可以共享檔案或目錄。

NFS系統和Windows網路共享、網路驅動器類似, 只不過windows用於區域網, NFS用於企業叢集架構中, 如果是大型網站, 會用到更復雜的分散式檔案系統FastDFS,glusterfs,HDFS,ceph。

NFS應用

  • 使用者訪問NFS客戶端,將請求轉化為函式;
  • NFS通過TCP/IP連線服務端;
  • NFS服務端接收請求,會先呼叫portmap程式進行埠對映
  • Rpc.nfsd程式用於判斷NFS客戶端能否連線服務端;
  • Rpc.mount程式用於判斷客戶端對服務端的操作許可權;
  • 如果通過許可權驗證,可以對服務端進行操作,修改或讀取;

NFS工作流程圖

這裡的服務端是存檔案的,服務端裡沒有安全認證但是有許可權認證,客戶端查詢檔案先從本地找,如果沒有去服務端,從服務端找到返回到客戶端~(portmap不需要安裝,NFS自帶了)

image

image


NFS部署

image

服務端

  1. 安裝NFS和rpcbind
[root@nfs ~]# yum install nfs-utils rpcbind -y
  1. 建立掛載點
# 根下建立
[root@nfs ~]# mkdir -p /web/nfs{1..9}
  1. 配置掛載點
[root@nfs ~]# vim /etc/exports

/etc/exports檔案配置格式:
[掛載點] [可以訪問的IP]([許可權])
/web/nfs1  172.16.1.0/20(rw,sync,all_squash)
  1. 關閉selinux和防火牆
[root@nfs ~]# setenforce 0
[root@nfs ~]# systemctl disable --now firewalld
  1. 啟動Nfs和rpcbind服務
[root@nfs ~]# systemctl start nfs-server 
[root@nfs ~]# systemctl start rpcbind
  1. 檢查服務端是否正常
# 格式:showmount -e [服務端的地址,預設是本機地址]
[root@nfs ~]# showmount -e
Export list for nfs:
/web/nfs1 172.16.1.0/20

# 可以跟著ip地址
[root@nfs ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/web/nfs1 172.16.1.0/20

[root@nfs ~]# cat /var/lib/nfs/etab
  1. 給掛載點授權
[root@nfs ~]# chown -R nfsnobody.nfsnobody /web

客戶端

  1. 安裝NFS
[root@web01 opt]# yum install -y nfs-utils
  1. 建立目錄
[root@web01 opt]# mkdir /opt/nfs/
  1. 掛載NFS
[root@web01 opt]# mount -t nfs 172.16.1.31:/web/nfs1  /opt/nfs/
  1. 測試
# 在web01中、在/opt/nfs/目錄下建立檔案,到NFS服務端/web/nfs1/目錄下檢視是否同步
[root@web01 opt]# touch /opt/nfs/test{1..9}.txt
  1. 最終實現網路同步儲存!
    image

web02和web03客戶端同樣的操作,使用同樣的掛載點,最終實現網路同步儲存

image

測試NFS檔案同步功能

NFS配置詳解

nfs共享引數 引數作用
rw 讀寫許可權 (常用)
ro 只讀許可權 (不常用)
root_squash 當NFS客戶端以root管理員訪問時,對映為NFS伺服器的匿名使用者 (不常用)
no_root_squash 當NFS客戶端以root管理員訪問時,對映為NFS伺服器的root管理員 (不常用)
all_squash 無論NFS客戶端使用什麼賬戶訪問,均對映為NFS伺服器的匿名使用者 (常用)
no_all_squash 無論NFS客戶端使用什麼賬戶訪問,都不進行壓縮 (不常用)
sync 同時將資料寫入到記憶體與硬碟中,保證不丟失資料 (常用)
async 優先將資料儲存到記憶體,然後再寫入硬碟;這樣效率更高,但可能會丟失資料 (不常用)
anonuid 配置all_squash使用,指定NFS的使用者UID,必須存在系統 (常用)
anongid 配置all_squash使用,指定NFS的使用者GID,必須存在系統 (常用)

NFS部分引數案例

所有的引數都是在NFS服務端中的檔案/etc/exports中修改,修改完成服務端(NFS)需要重啟nfs-serverrpcbind 服務,客戶端需要解除安裝掛載重新掛載

  1. rw,讀寫許可權 (常用)
# NFS部署就是rw的案例
[root@nfs ~]# vim /etc/exports
/web/nfs1  172.16.1.0/20(rw,sync,all_squash)

image

  1. ro,只讀許可權 (不常用)
# NFS服務端的操作
# 修改配置檔案
[root@nfs nfs1]# vim /etc/exports
/web/nfs1  172.16.1.0/20(ro,sync,all_squash)
# 重啟服務
[root@nfs nfs1]# systemctl restart nfs-server
[root@nfs nfs1]# systemctl restart rpcbind

# web01客戶端的操作
# 檢視掛載
[root@web01 nfs]# df -h
172.16.1.31:/web/nfs1     20G  3.1G   17G  16% /opt/nfs
# 解除安裝掛載,如果在nfs目錄下解除安裝會報錯:umount.nfs4: /opt/nfs: device is busy
[root@web01 /]# umount /opt/nfs/

# 再次掛載
[root@web01 opt]# mount -t nfs 172.16.1.31:/web/nfs1  /opt/nfs/
[root@web01 opt]# touch /opt/nfs/test.txt
touch: cannot touch ‘/opt/nfs/test.txt’: Read-only file system
# 這樣就建立不了,系統提示只讀

控制檔案許可權案例

  1. root_squash,當NFS客戶端以root管理員訪問時,對映為NFS伺服器的匿名使用者 (不常用)
# 修改服務端配置檔案引數
[root@nfs nfs1]# vim /etc/exports
/web/nfs1  172.16.1.0/20(rw,sync,root_squash)
# 服務端重啟服務
[root@nfs nfs1]# systemctl restart nfs-server
[root@nfs nfs1]# systemctl restart rpcbind

# 客戶端解除安裝和掛載
[root@web01 /]# umount /opt/nfs/
[root@web01 opt]# mount -t nfs 172.16.1.31:/web/nfs1  /opt/nfs/
# 建立檔案檢視是否為匿名使用者
[root@web01 opt]# touch nfs/test.txt
[root@web01 nfs]# ll /opt/nfs/
-rw-r--r-- 1 nfsnobody nfsnobody 0 Dec 30 17:01 test.txt
# 驗證成功nfsnobody為匿名使用者
  1. no_root_squash,當NFS客戶端以root管理員訪問時,對映為NFS伺服器的root管理員 (不常用)
# 修改服務端配置檔案引數
[root@nfs nfs1]# vim /etc/exports
/web/nfs1  172.16.1.0/20(rw,sync,no_root_squash)
# 服務端重啟服務
[root@nfs nfs1]# systemctl restart nfs-server
[root@nfs nfs1]# systemctl restart rpcbind

# 客戶端解除安裝和掛載
[root@web01 /]# umount /opt/nfs/
[root@web01 opt]# mount -t nfs 172.16.1.31:/web/nfs1  /opt/nfs/ 
# 建立檔案檢視是否為root使用者
[root@web01 opt]# touch nfs/10.txt
[root@web01 nfs]# ll /opt/nfs/
-rw-r--r-- 1 root      root      0 Dec 30 17:07 10.txt
# 驗證成功使用者為root
  1. all_squash,無論NFS客戶端使用什麼賬戶訪問,均對映為NFS伺服器的匿名使用者 (常用)
# 修改服務端配置檔案引數
[root@nfs nfs1]# vim /etc/exports
/web/nfs1  172.16.1.0/20(rw,sync,all_squash)
# 服務端重啟服務
[root@nfs nfs1]# systemctl restart nfs-server
[root@nfs nfs1]# systemctl restart rpcbind


# 客戶端使用普通使用者驗證
[root@web01 /]# useradd hammer
[root@web01 nfs]# cat /etc/passwd
hammer:x:1000:1000::/home/hammer:/bin/bash
# 客戶端解除安裝和掛載
[root@web01 /]# umount /opt/nfs/
[root@web01 opt]# mount -t nfs 172.16.1.31:/web/nfs1  /opt/nfs/ 
# 普通使用者建立檔案檢視是否為匿名使用者
[hammer@web01 nfs]$ touch 11.txt
[hammer@web01 nfs]$ ll
-rw-rw-r-- 1 nfsnobody nfsnobody 0 Dec 30 17:18 11.txt
# 驗證成功,普通使用者建立檔案也是匿名使用者

統一使用者

解決NFS如果取消檔案許可權,客戶端使用者不能操作的問題,使用統一使用者(其實是固定統一使用者id)解決

  1. 所有服務端和客戶端都新增使用者和使用者組
# NFS和web01-03中建立www使用者和使用者組
[root@nfs nfs1]# groupadd www -g 666
[root@nfs nfs1]# useradd www -u 666 -g 666 -M -r -s /sbin/nologin 
  1. 使用anonuid,anongid統一使用者和組id
[root@nfs nfs1]# vim /etc/exports
/web/nfs1  172.16.1.0/20(rw,sync,all_squash,anonuid=666,anongid=666)
  1. 修改掛載點
[root@nfs nfs1]# chown -R www.www /web/

# 檢視
[root@nfs web]# ll
total 0
drwxr-xr-x 2 www www 320 Dec 30 17:18 nfs1
drwxr-xr-x 2 www www   6 Dec 30 13:42 nfs2
drwxr-xr-x 2 www www   6 Dec 30 13:42 nfs3
drwxr-xr-x 2 www www   6 Dec 30 13:42 nfs4
drwxr-xr-x 2 www www   6 Dec 30 13:42 nfs5
drwxr-xr-x 2 www www   6 Dec 30 13:42 nfs6
drwxr-xr-x 2 www www   6 Dec 30 13:42 nfs7
drwxr-xr-x 2 www www   6 Dec 30 13:42 nfs8
drwxr-xr-x 2 www www   6 Dec 30 13:42 nfs9
  1. 重啟服務
# 服務端重啟服務
[root@nfs nfs1]# systemctl restart nfs-server
[root@nfs nfs1]# systemctl restart rpcbind
  1. 客戶端驗證
# web01中,分別用root使用者和hammer使用者驗證建立檔案所屬使用者和使用者組是誰
# 普通使用者驗證
[hammer@web01 nfs]$ touch 13.txt
[hammer@web01 nfs]$ ll
-rw-rw-r-- 1 www www 0 Dec 30 17:37 13.txt

# root使用者驗證
[root@web01 nfs]# touch 12.txt
[root@web01 nfs]# ll
-rw-r--r-- 1 www www 0 Dec 30 17:36 12.txt

# 驗證成功,結果都為www使用者

搭建考試系統

統一使用者的實際案例

搭建步驟

所有客戶端都操作如下步驟

  1. 客戶端安裝Web軟體
# 客戶端下載
[root@web01 opt]# yum install httpd php php-devel -y
  1. 將程式碼放置於網站的根目錄
[root@web01 opt]# cd /var/www/html/
  1. 上傳程式碼檔案

    程式碼檔案,想練習的留言發給你,檔案我是用xftp傳輸

image

# 將檔案解壓
[root@web01 html]# ll
total 28
-rw-r--r-- 1 root root 26995 Dec 30 17:47 kaoshi.zip
[root@web01 html]# unzip kaoshi.zip
Archive:  kaoshi.zip
  inflating: info.php                
  inflating: bg.jpg                  
  inflating: index.html              
  inflating: upload_file.php         
[root@web01 html]# ll
total 80
-rw-r--r-- 1 root root 38772 Apr 27  2018 bg.jpg
-rw-r--r-- 1 root root  2633 May  4  2018 index.html
-rw-r--r-- 1 root root    52 May 10  2018 info.php
-rw-r--r-- 1 root root 26995 Dec 30 17:47 kaoshi.zip
-rw-r--r-- 1 root root  1192 Jan 10  2020 upload_file.php
  1. 授權
[root@web01 html]# chown -R www.www /var/www/html
[root@web01 html]# ll
total 80
-rw-r--r-- 1 www www 38772 Apr 27  2018 bg.jpg
-rw-r--r-- 1 www www  2633 May  4  2018 index.html
-rw-r--r-- 1 www www    52 May 10  2018 info.php
-rw-r--r-- 1 www www 26995 Dec 30 17:47 kaoshi.zip
-rw-r--r-- 1 www www  1192 Jan 10  2020 upload_file.php
  1. 關閉selinux和防火牆
[root@web01 html]# setenforce 0
setenforce: SELinux is disabled
[root@web01 html]# systemctl disable --now firewalld
  1. 修改web軟體的使用者
[root@web01 html]# vim /etc/httpd/conf/httpd.conf
將User apache 和 Group apache 改為 User www 和 Group www
# 注.不然不會同步檔案,出錯!!
  1. 啟動web軟體
[root@web01 html]# systemctl start httpd

訪問成功!
image


  1. 建立存放上傳檔案目錄(忘記寫了,可以在修改使用者主和組前建立!)
[root@web01 html]# mkdir upload
[root@web01 html]# chown www.www upload
# 重啟服務
[root@web01 html]# systemctl restart httpd
  1. 測試

下載二哈圖片

image

image

# 從考試系統上傳圖片,驗證是否上傳到upload目錄下,並且用 http://客戶端ip/upload/檔名 訪問到檔案
[root@web01 upload]# ll
total 204
-rw-r--r-- 1 www www 205464 Dec 30 18:22 2_dog.jpg

image

驗證成功!!!

配合NFS實現檔案共享

所有客戶端搭建完NFS,可以在自己的所有客戶端上傳驗證檔案,我分別在web01,web02和web03上傳了二哈,吉娃娃和杜賓圖片,用來驗證

在服務端搭建NFS,實現多主機檔案共享,通過一臺客戶端就能看到所有的狗狗帥照!!!

  1. 修改NFS配置檔案
[root@nfs nfs1]# vim /etc/exports
/web/upload  172.16.1.0/20(rw,sync,all_squash,anonuid=666,anongid=666)
  1. 建立掛載點 並且 統一使用者(授權)
[root@nfs nfs1]# mkdir /web/upload
[root@nfs nfs1]# chown www.www /web/upload
  1. 重啟NFS和rpcbind服務
[root@nfs nfs1]# systemctl restart nfs-server rpcbind
  1. 所有客戶端安裝NFS軟體
[root@web01 html]# yum install nfs-utils -y
[root@web02 html]# yum install nfs-utils -y
[root@web03 html]# yum install nfs-utils -y
  1. 所有客戶端掛載
[root@web01 html]# mount -t nfs 172.16.1.31:/web/upload /var/www/html/upload
[root@web02 html]# mount -t nfs 172.16.1.31:/web/upload /var/www/html/upload
[root@web03 html]# mount -t nfs 172.16.1.31:/web/upload /var/www/html/upload
  1. 測試,上傳狗狗圖片!用一臺客戶端主機能看到其他客戶端主機的狗狗圖片~

image


三臺客戶端主機上傳檔案成功,客戶端之間實現同步共享!

image

網頁驗證結果如下

image