NFS介紹
NFS(Network File System)
即網絡文件系統,它最大的功能就是通過TCP/IP
網絡共享資源。在NFS
的應用中,本地NFS
的客戶端應用可以透明地讀寫位於遠端NFS
服務器上的文件,就像訪問本地文件一樣。
NFS
客戶端一般是應用服務器(比如web
,負載均衡等),可以通過掛載的方式將NFS
服務器端共享的目錄掛載到NFS
客戶端本地的目錄下。
因為NFS
支持的功能相當的多,而不同的功能都會使用不同的程序來啟動,每啟動一個功能就會啟用一些端口來傳輸數據,因此,NFS
的功能所對應的端口才沒有固定住,而是隨機取用一些未被使用的小於1024
的端口來作為傳輸之用。但如此一來又造成了客戶端想要連上服務器時的困擾,因為客戶端得要知道服務器端的相關端口才能夠進行連接。
因此就需要遠程過程調用(RPC)
的服務,RPC
最主要的功能就是在指定每個NFS
功能所對應的port number
,並且回報給客戶端,讓客戶端可以連接正確的端口上去。那RPC
又是如何知道每個NFS
的端口呢?這是因為當服務器在啟動NFS
時會隨機取用數個端口,並主動的想RPC
注冊,因此RPC
可以知道每個端口對應的NFS
功能,然后RPC
又是固定使用port 111
來監聽客戶端的需求並回報給客戶端正確的端口,所以當然可以讓NFS
的啟動更為輕松愉快了。
NFS
在文件傳送過程中依賴與RPC
(遠程過程調用)協議。NFS
本身是沒有提供信息傳送的協議和功能的,但是能夠用過網絡進行圖片,視頻,附件等分享功能。只要用到NFS的地方都需要啟動RPC
服務,不論是NFS
的服務端還是客戶端。
NFS
和RPC
的關系:可以理解為NFS
是一個網絡文件系統(比喻為租房的房主),而RPC
是負責信息的傳輸(中介),客戶端(相當於租房的租客)。
NFS網絡文件系統存在的意義
實現數據共享,數據保持一致。如圖所示:
NFS網絡文件系統工作方式
1、在nfs
服務器端創建共享目錄
2、通過mount
網絡掛載,將NFS
服務端共享目錄掛載到NFS
客戶端本地目錄
3、NFS
客戶端在掛載目錄上創建、刪除、查看數據等操作,等價於在服務端進行的創建、刪除、查看數據等操作。
如上圖所示,在NFS
服務器端設置一個共享目錄/web
后,其他有權限訪問NFS
服務器端的客戶端都可以將這個共享目錄/web
掛載到客戶端本地的某個掛載點(其實就是一個目錄,這個掛載點可以自己隨意指定),不同的客戶端的掛載點可以不相同。
客戶端正確掛載完畢后,就可以通過NFS
客戶端的掛載點所在的/opt/www
目錄查看到NFS
服務端/web
共享出來的目錄下的所有數據。在客戶端查看時,NFS
服務端的/web
目錄就相當於客戶端本地的磁盤分區或目錄,幾乎感覺不到使用上的區別,根據NFS
服務器端授予的NFS
共享權限以及共享目錄的本地系統權限,只要在指定的NFS
客戶端操作掛載的/opt/www
目錄,就可以將數據輕松的存取到NFS
服務器端上的/web
目錄中了。
NFS工作流程
RPC服務工作原理
NFS部署示例
操作系統 | 角色 | IP | HOST |
---|---|---|---|
CentOS release 7.4 | NFS Server | 192.168.1.31 | nfs-server.com |
CentOS release 7.4 | NFS Client1 (web server1) | 192.168.1.32 | nfs-client1.com |
CentOS release 7.4 | NFS Client2 (web server2) | 192.168.1.33 | nfs-client2.com |
說明:
這里NFS
客戶端是web
服務器,站點目錄掛載NFS
服務端。
實驗環境關閉防火牆、selinux、時間同步等
具體操作步驟
服務端安裝配置
1)檢查是否安裝NFS、RPC
服務
[root@nfs-server ~]# rpm -aq |egrep "nfs-utils|rpcbind" rpcbind-0.2.0-42.el7.x86_64 nfs-utils-1.3.0-0.48.el7.x86_64 # 如果沒有安裝則進行安裝 # yum -y install nfs-utils rpcbind
2)啟動rpc
和nfs
服務
[root@nfs-server ~]# systemctl start rpcbind [root@nfs-server ~]# systemctl enable rpcbind [root@nfs-server ~]# systemctl start nfs
3)可以通過rpcinfo -p localhost
可以查看到綁定了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 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 100024 1 udp 60358 status 100024 1 tcp 34912 status 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 38577 nlockmgr 100021 3 udp 38577 nlockmgr 100021 4 udp 38577 nlockmgr 100021 1 tcp 42193 nlockmgr 100021 3 tcp 42193 nlockmgr 100021 4 tcp 42193 nlockmgr
4)配置共享目錄並重啟nfs
[root@nfs-server ~]# mkdir /web [root@nfs-server ~]# vim /etc/exports /web 192.168.1.0/24(rw,sync,no_root_squash) #不壓制root(當client端使用root掛載時,也有root權限) [root@nfs-server ~]# systemctl restart nfs [root@nfs-server ~]# exportfs -v /web 192.168.1.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
客戶端掛載測試
1)創建掛載目錄並進行掛載
[root@nfs-client1 ~]# mkdir /opt/www [root@nfs-client1 ~]# showmount -e 192.168.1.31 #查看服務器共享目錄 Export list for 192.168.1.31: /web 192.168.1.0/24 [root@nfs-client1 ~]# mount -t nfs 192.168.1.31:/web /opt/www/ [root@nfs-client1 ~]# df -h 文件系統 容量 已用 可用 已用% 掛載點 /dev/mapper/centos-root 20G 3.6G 16G 19% / devtmpfs 473M 0 473M 0% /dev tmpfs 489M 0 489M 0% /dev/shm tmpfs 489M 14M 475M 3% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda1 497M 154M 344M 31% /boot tmpfs 98M 0 98M 0% /run/user/0 192.168.1.31:/web 20G 3.6G 16G 19% /opt/www [root@nfs-client1 ~]# [root@nfs-client1 ~]# vim /etc/fstab #開機自動掛載 192.168.1.31:/web /opt/www nfs defaults 0 0
2)在client1
上的/opt/www
創建一個測試文件
[root@nfs-client1 ~]# echo "client1 create test file" >> /opt/www/client1.txt
3)回到nfs
上進行查看
[root@nfs-server ~]# ll /web/ 總用量 4 -rw-r--r-- 1 root root 25 8月 9 14:41 client1.txt
4)安裝nginx
並配置站點目錄為/opt/www
[root@nfs-client1 ~]# yum -y install nginx [root@nfs-client1 ~]# vim /etc/nginx/nginx.conf server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /opt/www; ... [root@nfs-client1 ~]# systemctl start nginx
上面的步驟同樣在client2
上面操作。
在nfs服務端創建站點首頁,訪問client客戶端測試
[root@nfs-server ~]# ll /web/ 總用量 8 -rw-r--r-- 1 root root 25 8月 9 14:41 client1.txt -rw-r--r-- 1 root root 25 8月 9 15:37 client2.txt [root@nfs-server ~]# echo "<h1>NFS server</h1>" >> /web/index.html #nfs服務端共享目錄創建首頁文件 [root@nfs-server ~]# curl 192.168.1.32 <h1>NFS server</h1> [root@nfs-server ~]# [root@nfs-server ~]# curl 192.168.1.33 <h1>NFS server</h1> [root@nfs-client1 ~]# ll /opt/www/ #nfs客戶端1上查看 總用量 12 -rw-r--r-- 1 root root 25 8月 9 14:41 client1.txt -rw-r--r-- 1 root root 25 8月 9 15:37 client2.txt -rw-r--r-- 1 root root 20 8月 9 15:41 index.html [root@nfs-client2 ~]# ll /opt/www/ #nfs客戶端2上查看 總用量 12 -rw-r--r-- 1 root root 25 8月 9 14:41 client1.txt -rw-r--r-- 1 root root 25 8月 9 15:37 client2.txt -rw-r--r-- 1 root root 20 8月 9 15:41 index.html
通過測試可以看出,客戶端掛載后,就完全相當於自己的一個目錄或者文件,在負載均衡架構中一般通過這種方式做共享存儲。
NFS配置參數說明
nfs共享參數及作用
通過 man exports
可以查看幫助手冊
共享參數 | 作用 |
---|---|
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,必須存在系統 |
配置實例說明
[root@nfs-server ~]# cat /etc/exports #/web 192.168.1.0/24(rw,sync,no_root_squash) #不壓制root(當client端使用root掛載時,也有root權限) /web 192.168.1.32(rw,sync,no_root_squash) 192.168.1.33(rw,sync,all_squash,anonuid=2000,anongid=2000)
#[共享目錄] [客戶端地址1(權限)] [客戶端地址2(權限)] 1、共享目錄:每一行最前面是共享出來的目錄,比如上面我要共享/web目錄,那么此選項就可以直接寫/web目錄,這個目錄可以依照不同的權限共享給不同的目錄。 2、客戶端地址:客戶端地址能夠設置一個網絡,也可以是單個主機。參數:如上面的讀寫權限rw,同步更新sync等待。 1、客戶端地址可以使用完整的IP或者網絡號,例如192.168.1.33或192.168.1.0/24 2、同樣可以使用主機名,但是這個主機名必須要在/etc/hosts中存在,或者可以通過DNS找到才行。