NFS服務器工作原理


一、NFS簡介

NFS是Network File System的縮寫,中文稱為網絡文件系統,它的主要功能是通過網絡(一個局域網)讓不同的主機系統之間可以共享文件或目錄,NFS的客戶端(一般為應用服務器,例如web)可以通過掛載(mount)的方式將NFS服務器共享的數據目錄掛載到NFS客戶端本地系統中(就是某一個關在點下),從客戶端本地看,NFS服務器端共享目錄就好像是客戶端自己的磁盤分區或者目錄一樣,而實際上卻是遠端的NFS服務器的目錄。

NFS企業在企業中的應用場景,在企業集群架構的工作場景中,NFS網絡文件系統一般被用來存儲共享視頻、圖片、附件等靜態資源文件,通常網站用戶上傳的文件都會放到NFS共享中,例如BBS產品的圖片、附件、頭像(網站BBS的程序不要放在NFS共享中),然后前端所有節點在訪問這些靜態資源時都會讀取NFS存儲上的資源。

NFS是當前互聯網系統架構中最常用的數據存儲服務之一,特別是中小型網站應用頻率更高。

二、NFS服務器工作原理

因為NFS支持的功能相當多,而不同的功能都會使用不同的程序來啟動,每啟動一個功能就會啟用一些端口來傳輸數據,因此NFS的功能對應的端口並不固定,客戶端要知道NFS服務器端的相關端口才能建立連接進行數據傳輸,而RPC就是用來統一管理NFS端口的服務,並且統一對外的端口是111,RPC會記錄NFS端口的信息,如此我們就能夠通過RPC實現服務端和客戶端溝通端口信息。PRC最主要的功能就是指定每個NFS功能所對應的port number,並且通知客戶端,記客戶端可以連接到正常端口上去。

在啟動NFS SERVER之前,首先要啟動RPC服務(即portmap或rpcbind服務,下同)否則NFS SERVER就無法向RPC服務區注冊,另外,如果RPC服務重新啟動,原來已經注冊好的NFS端口數據就會全部丟失。因此此時RPC服務管理的NFS程序也要重新啟動以重新向RPC注冊。一般修改NFS配置文檔后,是不需要重啟NFS的,直接在命令執行/etc/init.d/nfs  reload或exportfs –rv即可使修改的/etc/exports生效。

三、實操部分
1.檢查操作系統的環境

[linguang@backup ~]$ cat /etc/redhat-release

CentOS release 6.10 (Final)

[linguang@backup ~]$ uname -r

2.6.32-754.el6.x86_64      顯示操作系統發行版本

[linguang@backup ~]$ uname -m

x86_64                 顯示機器(硬件)類型

2、NFS服務端需要安裝的軟件包

nfs-utils:nfs服務的主程序,包括rpc.nfsd、rpc.mountd兩個daemons和相關的文檔說明及執行命令文件等

rpcbind:centos6下面的rpc主程序(centos5下的是portmap)

安裝相應的軟件包及檢查

安裝:

[root@nfs01 ~]# yum install nfs-utils rpcbind -y

檢查:

[root@nfs01 ~]# rpm -qa nfs-utils rpcbind

rpcbind-0.2.0-13.el6_9.1.x86_64

nfs-utils-1.2.3-75.el6_9.x86_64

注意:在安裝完該軟件包后會自動創建nfsnobody用戶

[root@nfs01 ~]# id nfsnobody

uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)

3、 啟動NFS相關的服務

啟動rpcbind服務並進行檢查

啟動rpcbind:

[root@nfs01 ~]# /etc/init.d/rpcbind start

Starting rpcbind: [ OK ]

檢查:

[root@nfs01 ~]# /etc/init.d/rpcbind status

rpcbind (pid 2309) is running...

查看rpc的端口:

[root@nfs01 ~]# netstat -lntup |grep rpc

tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      2193/rpcbind       

tcp        0      0 :::111                      :::*                        LISTEN      2193/rpcbind       

udp        0      0 0.0.0.0:111                 0.0.0.0:*                               2193/rpcbind       

udp        0      0 0.0.0.0:672                 0.0.0.0:*                               2193/rpcbind       

udp        0      0 :::111                      :::*                                    2193/rpcbind       

udp        0      0 :::672                      :::*                                    2193/rpcbind       

查看端口映射情況:

[root@nfs01 ~]# 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服務時,不能看到nfs端口的映射情況

啟動nfs服務並進行檢查

啟動nfs:

[root@nfs01 ~]# /etc/init.d/nfs start

Starting NFS services: [ OK ]

Starting NFS quotas: [ OK ]

Starting NFS mountd: [ OK ]

Starting NFS daemon: [ OK ]

Starting RPC idmapd: [ OK ]

檢查:

[root@nfs01 ~]# /etc/init.d/nfs status

rpc.svcgssd 已停

rpc.mountd (pid 2329) is running...

nfsd (pid 2345 2344 2343 2342 2341 2340 2339 2338) is running...

rpc.rquotad (pid 2324) is running...

查看端口映射情況:

[root@nfs01 ~]# rpcinfo -p localhost

注意:此時有了端口映射

【特別注意】必須先啟動rpcbind服務之后,才能啟動nfs服務

原因:nfs可以視為一個rpc程序,在啟動任何一個rpc程序之前,需要做好端口和功能的映射工作,這個映射工作就是由rpcbind服務來完成的,因此在提供nfs服務之前,必須要先啟動rpcbind服務

檢查nfs和rpc進程

[root@nfs01 ~]# ps -ef |egrep "rpc|nfs"

rpc        2193      1  0 22:52 ?        00:00:00 rpcbind

root       2315      2  0 23:04 ?        00:00:00 [rpciod/0]

root       2324      1  0 23:04 ?        00:00:00 rpc.rquotad

root       2329      1  0 23:04 ?        00:00:00 rpc.mountd

root       2336      2  0 23:04 ?        00:00:00 [nfsd4]

root       2337      2  0 23:04 ?        00:00:00 [nfsd4_callbacks]

root       2338      2  0 23:04 ?        00:00:00 [nfsd]

root       2339      2  0 23:04 ?        00:00:00 [nfsd]

root       2340      2  0 23:04 ?        00:00:00 [nfsd]

root       2341      2  0 23:04 ?        00:00:00 [nfsd]

root       2342      2  0 23:04 ?        00:00:00 [nfsd]

root       2343      2  0 23:04 ?        00:00:00 [nfsd]

root       2344      2  0 23:04 ?        00:00:00 [nfsd]

root       2345      2  0 23:04 ?        00:00:00 [nfsd]

root       2376      1  0 23:04 ?        00:00:00 rpc.idmapd

root       2459   2197  0 23:08 pts/0    00:00:00 egrep rpc|nfs

4、將相關的服務添加到開機自啟動中

【方法1】

將nfs服務加入並檢查:

[root@nfs01 ~]# chkconfig nfs on

[root@nfs01 ~]# chkconfig --list nfs

nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off

將rpcbind服務加入並檢查:

[root@nfs01 ~]# chkconfig rpcbind on

[root@nfs01 ~]# chkconfig --list rpcbind

rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off

【方法2】推薦

加入:

[root@nfs01 ~]# echo "/etc/init.d/rpcbind start" >>/etc/rc.local

[root@nfs01 ~]# echo "/etc/init.d/nfs start" >>/etc/rc.local

查看:

[root@nfs01 ~]# tail -2 /etc/rc.local

/etc/init.d/rpcbind start

/etc/init.d/nfs start

【注意】

在實際的生產環境中用方法2而不用方法1,因為可以方便運維人員的管理

5、配置nfs服務的配置文件/etc/exports

默認情況下該配置文件是空的:

[root@nfs01 ~]# ll -h /etc/exports

-rw-r--r--. 1 root root 0 Jan 12 2010 /etc/exports

編輯該配置文件:

[root@nfs01 ~]# vim /etc/exports

查看:

[root@nfs01 ~]# cat /etc/exports

#share /data by oldboy for bingbing at 2018-3-12

/data 172.16.1.0/24(rw,sync)

【注意】

該配置文件默認是存在,只不過是空文件而已,在172.16.1.0/24(rw,sync)中24和(之間不能有空格

查看NFS服務器配置的參數(包含默認的參數)的文件/var/lib/nfs/etab

nfs配置文件的格式

NFS共享的目錄 NFS客戶端地址(參1,參2,……) NFS客戶端地址2(參1,參2,……)或者

NFS共享的目錄 NFS客戶端地址(參1,參2,……)

上述各列參數的含義:

 NFS共享的目錄:為NFS服務端要共享的實際目錄,要用絕對路徑如(/data)。注意共享目錄的本地權限,如果需要讀寫共享,一定要讓本地目錄可以被NFS客戶端的用戶(nfsnobody)讀寫。/etc/exports配置文件格式書寫詳細如下表

常用格式說明 實例

配置案例1 /data 172.16.1.0/24(rw,sync) 允許客戶端讀寫,並且數據同步寫到服務器的磁盤里

配置案例2 /data 172.16.1.0/24(rw,sync,all_squash,anonuid=888,anongid=888) 允許客戶端讀寫,並且數據同步寫到服務器的磁盤里,並且指定客戶端的uid和gid,早期生產環境中的一種配置,適合多客戶端共享一個NFS單目錄,如果所有服務器的nfsnodoby賬戶的UID相同,則本案例就沒什么意義了

配置案例3 /data 172.16.1.0/24(ro) 只讀共享,用途:例如在生產環境中開發人員有查看服務器日志的需求,但是又不希望給開發服務器的權限,那么就可以給開發提供從某個測試服務器NFS客戶端上查看某個生產服務器日志目錄(NFS共享目錄)的權限,但是,這不是唯一的方法喲

 

 NFS 客戶端地址:為NFS服務端授權的可訪問共享目錄的NFS客戶端地址,可以為單獨的IP地址或主機名、域名等,也可以為整個網段的地址,還可以用”*”來匹配所有的客戶端服務器,這里所謂的客戶端一般為前端的業務服務器,例如web服務。詳細說明如下表

客戶端地址 具體地址 說明

授權單一客戶端訪問NFS 172.16.1.41 一般情況下,生產環境中此配置不多

授權整個網段訪問NFS 172.16.1.0/24 指定網段為生產環境中最常見的配置,配置簡單、維護方便

授權整個網段可訪問NFS 172.0.0.* 指定網段的另外寫法(不推薦使用)

授權某個域名客戶端訪問 nfs.lzhnb.com 生產環境中一般不使用

授權整個域名客戶端訪問 *.lzhnb.com 生產環境中一般不使用

 

NFS配置參數權限,具體如下表

參數名稱 參數用途

rw(熟記) 表示可讀寫權限

sync(熟記) 請求或寫入數據時,數據同步寫入到NFS Server的硬盤后才返回,優點:數據安全不會丟,缺點:性能比不啟用該參數要差

async(熟記) 寫入數據時會先寫到內存緩沖區,直到硬盤有空檔才會在寫入磁盤,這樣可以提升寫入效率。風險是若服務器宕機或不正常關機,會損失緩沖區中未寫入硬盤的數據(解決辦法:服務器主板電池或UPS不間斷電源)

all_squash(熟記) 不管訪問NFS Server共享目錄的用戶身份如何,它的權限都將被壓縮為匿名用戶,同時它的UID和GID都會變成nfsnobody賬號身份,在早期多個NFS客戶端同時讀寫NFS Server數據時,這個參數很有用,在生產環境中配置NFS的重要技巧:1)確保所有客戶端服務器對NFS共享目錄具備相同的用戶訪問權限,all_squash把所有客戶端都壓縮成匿名用戶(UID相同),就是anonuid,anongid指定的UID和GID相同,2)所有的客戶端和服務器端都需要有一個相同的UID和GID的用戶,nfsnodoby(UID必須相同)

anonuid(熟記) 參數以anon*開頭即值anonymous匿名用戶,這個用戶的UID設置值通常為nfsnobody的UID值,當然我們也可以自行設置這個UID值。但是,UID必須存在於/etc/passwd中。在多個NFS Clients時,如多台web server共享一個NFS目錄時,通過這個參數可以使得不同的NFS Clients寫入的數據對所有NFS Clients保持同樣的用戶權限,即為配置的匿名UID對應用戶權限,這個參數很有用。一般默認就好

anongid(熟記) 同anonuid,區別是把uid(用戶id)換成gid(組id)

ro 表示只讀權限

 

6、創建共享目錄

[root@nfs01 ~]# mkdir /data -p

[root@nfs01 ~]# ll -d /data/

drwxr-xr-x. 2 root root 4096 Nov 19 10:45 /data/

7、更改共享目錄的權限

[root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data

[root@nfs01 ~]# ll -d /data

drwxr-xr-x 2 nfsnobody nfsnobody 4096 Mar 12 19:27 /data

8、重新加載NFS服務

[root@nfs01 ~]# /etc/init.d/nfs reload

【注意】

 /etc/init.d/nfs reload<==>fexportfs -rv

 修改完/etc/exports配置后,需要重新加載NFS服務

 用yum/rpm包安裝的軟件,用service和/etc/init.d/服務名啟動是一樣的

9、 檢查有權限掛載的服務器是否能夠掛載

【方法1】利用showmount來進行檢查

[root@nfs01 ~]# showmount -e 172.16.1.31

Export list for 172.16.1.31:

/data 172.16.1.0/24

或者

[root@nfs01 ~]# showmount -e localhost

Export list for localhost:

/data 172.16.1.0/24

【注意】

 出現上面信息是,說明服務器可以掛載

 測試的IP地址為NFS服務器的IP地址

【方法2】可以在把NFS服務器當做客戶端來進行掛載測試

[root@nfs01 ~]# mount -t nfs 172.16.1.31:/data /mnt 掛載

[root@nfs01 ~]# df -h 查看

Filesystem Size Used Avail Use% Mounted on

/dev/sda3 8.8G 1.5G 6.9G 18% /

tmpfs 491M 0 491M 0% /dev/shm

/dev/sda1 190M 35M 146M 19% /boot

172.16.1.31:/data 8.8G 1.5G 6.9G 18% /mnt

[root@nfs01 ~]# umount /mnt 測試完后取消掛載

[root@nfs01 ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda3 8.8G 1.5G 6.9G 18% /

tmpfs 491M 0 491M 0% /dev/shm

/dev/sda1 190M 35M 146M 19% /boot

10、NFS客戶端的配置

 檢查操作系統的環境

[root@ client1 ~]# cat /etc/redhat-release

CentOS release 6.9 (Final)

[root@ client1 ~]# uname -r

2.6.32-696.el6.x86_64

[root@ client1 ~]# uname -m

x86_64

11、安裝客戶端軟件rpcbind和nfs-utils

安裝:

[root@client1 ~]# yum install nfs-utils rpcbind -y

檢查:

[root@ client1 ~]# rpm -qa nfs-utils rpcbind

rpcbind-0.2.0-13.el6_9.1.x86_64

nfs-utils-1.2.3-75.el6_9.x86_64

【注意】

 安裝nfs-utils軟件的目的是為了使用showmount等功能,所以客戶端最好也裝上,但是不啟動NFS服務

12、 啟動RPC服務並進行查看

啟動:

[root@client1 ~]# /etc/init.d/rpcbind start

Starting rpcbind: [ OK ]

檢查:

[root@ client1 ~]# /etc/init.d/rpcbind status

rpcbind (pid 2370) is running...

13、檢查能否訪問服務端

【方法1】

[root@ client1 ~]# showmount -e 172.16.1.31 此ip地址為服務器端的ip地址

Export list for 172.16.1.31:

/data 172.16.1.0/24

出現上面的情況說明可以訪問服務端

【方法2】

[root@ client1 ~]# telnet 172.16.1.31 111                       #111為rpc服務的端口

Trying 172.16.1.31...

Connected to 172.16.1.31.

Escape character is '^]'.

出現上面的情況說明可以訪問服務端

14、 掛載NFS共享目錄

掛載:

[root@ client1 ~]# mount -t nfs 172.16.1.31:/data /mnt

查看:

[root@ client1 ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda3 8.8G 1.5G 6.9G 18% /

tmpfs 491M 0 491M 0% /dev/shm

/dev/sda1 190M 35M 146M 19% /boot

172.16.1.31:/data 8.8G 1.5G 6.9G 18% /mnt

查看:

[root@ client1 ~]# mount

/dev/sda3 on / type ext4 (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

tmpfs on /dev/shm type tmpfs (rw)

/dev/sda1 on /boot type ext4 (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

172.16.1.31:/data on /mnt type nfs (rw,vers=4,addr=172.16.1.31,clientaddr=172.16.1.8)

15、測試讀寫數據

在/mnt目錄下創建測試文件

[root@ client1 ~]# cd /mnt/

[root@ client1 mnt]# touch test.txt

[root@ client1 mnt]# ls

test.txt

16、在NFS服務端/data目錄下進行查看

[root@nfs01 ~]# cd /data

[root@nfs01 data]# ls

test.txt

至此NFS客戶端掛載成功

17、將掛載命令加入開機自啟動

[root@client1 ~]# echo "mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local

[root@client1 ~]# tail -1 /etc/rc.local

mount -t nfs 172.16.1.31:/data /mnt

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM