一、什么是NFS
(一)概念
NFS是Network File System的縮寫,它的主要功能是通過網絡讓不同的主機系統之間可以彼此共享文件或者目錄。NFS客戶端(一般為引用服務器,如web應用服務器)可以通過掛載的方式將NFS服務端共享的數據文件目錄掛載到NFS客戶端的本地系統中的一個掛載點下。
在企業集群的應用場景下,NFS網絡文件系統被用來存儲共享視頻、圖片等靜態資源文件。
假如A用戶請求服務,nginx分發這個請求到web1服務器上,然后將用戶A上傳的靜態資源到web1服務器上;這時如果靜態不同步到NFS上;一旦用戶B的請求被分發到web2服務器上,這時web2也從NFS上獲取靜態資源就不會出現靜態資源獲取不到的情況。可以看到web服務器都是一個NFS Client本地掛載的目錄可以和NFS Server的目錄不一定相同。
(二)掛載的原理
從上圖中可以看出NFS Server設置一個共享目錄/data ,其余有權限的NFS Client可以將NFS Server的共享目錄掛載到本地的目錄中,比如上圖中web1將/project/data目錄與NFS Server的共享目錄進行對應。當客戶端掛載完畢后,這時進入到/project/data目錄下,這時文件與NFS Server共享目錄下的文件一樣。
NFS 支持的功能很多,每一個功能啟動不同的程序,這樣會產生很多的隨機端口,但是既然是隨機啟動的端口,那么客戶端怎么會知道這些端口呢?這樣就會造成NFS客戶端與NFS服務端無法進行數據傳輸,如果要解決上面的問題,就需要RPC服務來實現這個過程的,RPC就相當於中間人一樣。
NFS的RPC服務的功能就是記錄NFS每一個功能啟動的端口號,在NFS客戶端請求時將該端口號和功能對應的信息傳遞給請求數據的NFS客戶端,從而確保客戶端可連接到正確的NFS端口號上去,達到數據傳輸的目的。
那么RPC服務是如何記錄NFS服務的每一個功能端口以及知道每一個NFS功能端口呢?這時因為當NFS服務啟動后會將隨機啟動的端口主動向RPC服務注冊相關的端口及功能信息,所以RPC服務知道NFS每一個端口對應的NFS功能,並且RPC服務使用固定的111端口來監聽NFS Client的請求,這樣就將正確的NFS端口信息返回給NFS Client。
上圖是NFS Client向NFS Server存取文件的過程,詳細過程如下:
(1)用戶訪問NFS Client,NFS Client的RPC服務向NFS Server的RPC的111端口發出請求
(2)NFS Server的RPC服務找到已經注冊的NFS Server的端口后,通知NFS Client的RPC服務
(3)NFS Client獲取正確的端口,與NFS Server交互存取數據
(4)NFS Client數據存取成功后,返回訪問前端應用程序用戶結果
注意:
- NFS Server在啟動之前應該先啟動RPC服務,否則NFS Server無法向RPC注冊端口
- 入股RPC服務重新啟動,之前注冊的NFS Server端口信息就會丟失,因此NFS Server也需要重新啟動
- NFS重新啟動通過/etc/init.d/nfs reload進行平滑啟動
- RPC服務在centos5.8為portmap服務,centos6.4下為rpcbind服務
二、NFS服務搭建
(一)環境准備
服務器系統 | 角色 | ip |
CentOS 7.3 x84_64 | NFS服務端 | 192.168.35.9 |
CentOS 7.3 x84_64 | NFS客戶端 | 192.168.35.10 |
服務器信息查看:
# 操作系統版本信息 [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) # 機器名稱 [root@localhost ~]# uname -n localhost.localdomain # 系統內核版本 [root@localhost ~]# uname -r 3.10.0-514.el7.x86_64 # 64位 [root@localhost ~]# uname -m x86_64
服務器設置主機名:
# 設置NFS Server的主機名 [root@localhost ~]# hostnamectl set-hostname nfs-server [root@localhost ~]# hostname nfs-server #設置NFS Client的主機名 [root@localhost ~]# hostnamectl set-hostname nfs-client [root@localhost ~]# hostname nfs-client
注意關閉服務端與客戶端的防火牆:
systemctl stop firewalld # 臨時關閉 systemctl disable firewalld # 永久關閉
(二)NFS軟件安裝
部署NFS服務需要安裝下面的軟件包:
- nfs-utils
- portmap(centos5.x)/rpcbind(centos6.x)
其中nfs-utils是NFS服務的主程序,包括rpc.nfsd、rpc.mounted等;啟動NFS服務前必須先啟動rpcbind服務。
1、NFS Server安裝
# 先查看機器上是否存在NFS和RPC安裝包 [root@nfs-server ~]# rpm -qa nfs-utils portmap rpcbind # 如果沒安裝通過yum進行安裝 [root@nfs-server ~]# yum install nfs-utils rpcbind -y
2、NFS Client安裝
# 先查看機器上是否存在NFS和RPC安裝包 [root@nfs-client ~]# rpm -qa portmap rpcbind [root@nfs-client ~]# yum install nfs-utils rpcbind -y
注意安裝上面的服務還有一種方式:
# 查看可安裝的組 [root@nfs-server ~]# yum grouplist # 安裝NFS和RPC服務 [root@nfs-server ~]# yum groupinstall "NFS file server" -y
注意兩種方式只需要選擇一種即可。
(三)啟動NFS服務
1、啟動rpcbind服務
# 查看rpcbind服務狀態 [root@nfs-server ~]# service rpcbind status
目前已經正常啟動。
2、查看NFS服務端口注冊信息
[root@nfs-server ~]# 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
因為NFS服務還沒有啟動,所以都是rpc服務的端口信息。
3、啟動NFS服務
# 查看狀態 [root@nfs-server ~]# service nfs status # 啟動nfs [root@nfs-server ~]# service nfs start
4、查看端口注冊信息
[root@nfs-server ~]# rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper ... 100024 1 udp 57594 status 100024 1 tcp 50545 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 43092 nlockmgr 100021 3 udp 43092 nlockmgr 100021 4 udp 43092 nlockmgr 100021 1 tcp 34213 nlockmgr 100021 3 tcp 34213 nlockmgr 100021 4 tcp 34213 nlockmgr
(四)啟動NFS客戶端
啟動nfs與rpc服務:
# 查看狀態 [root@nfs-server ~]# service nfs status # 啟動nfs [root@nfs-server ~]# service nfs start
[root@nfs-client ~]# service rpcbind status Redirecting to /bin/systemctl status rpcbind.service ● rpcbind.service - RPC bind service Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled) Active: active (running) since 一 2021-04-26 05:52:10 CST; 39min ago Process: 2713 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS) Main PID: 2714 (rpcbind) CGroup: /system.slice/rpcbind.service └─2714 /sbin/rpcbind -w 4月 26 05:52:10 nfs-client systemd[1]: Starting RPC bind service... 4月 26 05:52:10 nfs-client systemd[1]: Started RPC bind service.
(五)NFS服務端配置
NFS服務端的配置文件是/etc/exports,可以在該文件中進行配置參數,比如,連接的客戶端限制等。
[root@nfs-server /]# cat /etc/exports # shared directory /data 192.168.35.0/24(rw,sync)
其中括號后面的rw是客戶端的權限,允許對共享目錄中進行讀寫,sync同步到本地磁盤中。
重新加載NFS服務:
[root@nfs-server /]# service nfs reload Redirecting to /bin/systemctl reload nfs.service
查看配置生效掛載情況:
[root@nfs-server /]# showmount -e localhost Export list for localhost: /data 192.168.35.0/24
通過客戶端查看共享目錄:
[root@nfs-client /]# showmount -e 192.168.35.9 Export list for 192.168.35.9: /data 192.168.35.0/24
將共享目錄掛載到客戶端上:
# 掛載前 [root@nfs-client /]# df -h 文件系統 容量 已用 可用 已用% 掛載點 /dev/mapper/cl-root 47G 1.7G 46G 4% / devtmpfs 902M 0 902M 0% /dev tmpfs 912M 0 912M 0% /dev/shm tmpfs 912M 8.5M 904M 1% /run tmpfs 912M 0 912M 0% /sys/fs/cgroup /dev/sda1 1014M 139M 876M 14% /boot tmpfs 183M 0 183M 0% /run/user/0 # 進行掛載,將共享目錄映射到本地目錄/data [root@nfs-client /]# mount -t nfs 192.168.35.9:/data /data # 掛載后 [root@nfs-client /]# df -h 文件系統 容量 已用 可用 已用% 掛載點 /dev/mapper/cl-root 47G 1.7G 46G 4% / devtmpfs 902M 0 902M 0% /dev tmpfs 912M 0 912M 0% /dev/shm tmpfs 912M 8.5M 904M 1% /run tmpfs 912M 0 912M 0% /sys/fs/cgroup /dev/sda1 1014M 139M 876M 14% /boot tmpfs 183M 0 183M 0% /run/user/0 192.168.35.9:/data 47G 1.7G 46G 4% /data
三、測試
1、nfs服務器文件更改
# nfs服務器上創建文件 [root@nfs-server data]# touch test.txt [root@nfs-server data]# ll 總用量 0 -rw-r--r--. 1 root root 0 4月 27 04:43 test.txt # nfs客戶端查看 [root@nfs-client data]# ll 總用量 0 -rw-r--r--. 1 root root 0 4月 27 04:43 test.txt # nfs服務器上刪除文件 [root@nfs-server data]# rm -f test.txt # nfs客戶端查看 [root@nfs-client data]# ll 總用量 0
2、nfs客戶端文件更改
[root@nfs-client data]# touch test.txt touch: cannot touch 'test.txt': Permission denied
可以看到出現權限不足的情況。在上面的/data目錄中的文件對其他用戶無寫的權限。
這里可以設置nfs的默認用戶屬組,所以只要找到nfs的默認用戶設置屬組即可。
# 查看用戶uid [root@nfs-server data]# cat /var/lib/nfs/etab /data 192.168.35.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash) # 過濾nfs默認用戶 [root@nfs-server /]# grep 65534 /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin # 更改目錄屬組、用戶 [root@nfs-server /]# chown -R nfsnobody:nfsnobody /data [root@nfs-server /]# ll /data/ 總用量 0 -rw-r--r--. 1 nfsnobody nfsnobody 0 4月 27 04:57 test.txt
客戶端默認以nfsnobody用戶寫文件,現在文件屬組和用戶更改過來,客戶端就有權利進行寫入。
[root@nfs-client data]# touch test.txt [root@nfs-client data]# ll total 0 -rw-r--r--. 1 nfsnobody nfsnobody 0 Apr 27 05:05 test.txt
3、設置開機自啟動與掛載
# nfs服務端 [root@nfs-server /]# systemctl enable rpcbind [root@nfs-server /]# systemctl enable nfs # nfs客戶端啟動 [root@nfs-client data]# systemctl enable rpcbind [root@nfs-client data]# systemctl enable nfs # nfs客戶端執行掛載 [root@nfs-client data]# echo "mount -t nfs 192.168.35.9:/data /data" >> /etc/rc.local