NFS 部署

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目錄下,並且用 //客戶端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