NFS網路檔案系統詳解

張恩清發表於2018-09-07

第1章 NFS基本概述

1.1 什麼是nfs

NFS是Network File System的縮寫及網路檔案系統。

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

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

1.2 為什麼要使用NFS服務進行資料儲存

1.實現多臺伺服器之間資料共享

2.實現多臺伺服器之間資料的一致

1.3 本地檔案操作方式

當使用者執行mkdir命令, 該命令會通過shell直譯器翻譯給核心,由核心解析完成後驅動硬體,完成相應的操作。

1.4 NFS實現原理(需要先了解[程式|程式|執行緒])

1.使用者程式訪問NFS客戶端,使用不同的函式對資料進行處理

2.NFS客戶端通過TCP/IP的方式傳遞給NFS服務端。

3.NFS服務端接收到請求後,會先呼叫portmap程式進行埠對映。

4.nfsd程式用於判斷NFS客戶端是否擁有許可權連線NFS服務端。

5.Rpc.mount程式判斷客戶端是否有對應的許可權進行驗證。

6.idmap程式實現使用者對映和壓縮

7.最後NFS服務端會將對應請求的函式轉換為本地能識別的命令,傳遞至核心,由核心驅動硬體。

rpc是一個遠端過程呼叫,那麼使用nfs必須有rpc服務

1.5 NFS儲存優點

1.NFS檔案系統簡單易用、方便部署、資料可靠、服務穩定、滿足中小企業需求。

2.NFS檔案系統記憶體放的資料都在檔案系統之上,所有資料都是能看得見。

1.6 NFS儲存侷限

1.存在單點故障, 如果構建高可用維護麻煩。(web-》nfs()-》backup)

2.NFS資料明文, 並不對資料做任何校驗。

3.客戶端掛載無需賬戶密碼, 安全性一般(內網使用)

1.7 生產應用建議

1.生產場景應將靜態資料儘可能往前端推, 減少後端儲存壓力

2.必須將儲存裡的靜態資源通過CDN快取(jpgpngmp4avicssjs)

3.如果沒有快取或架構本身歷史遺留問題太大, 在多儲存也無用

第2章 NFS基本使用

2.1 環境準備

伺服器系統

角色

外網IP

內網IP

主機名

CentOS 7.5

NFS服務端

eth0:10.0.0.31

eth1:172.16.1.31

nfs

CentOS 7.5

NFS客戶端

eth0:10.0.0.7

eth1:172.16.1.7

web01

2.2 關閉防火牆及selinux(客戶端,服務端都要關閉)

2.2.1 關閉防火牆

systemctl disable firewalld
systemctl stop firewalld

2.2.2 關閉selinux

sed -ri `#^SELINUX=#cSELINUX=Disabled` /etc/selinux/config

setenforce 0

2.3 服務端安裝nfs

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

2.3.1 配置nfs

我們可以按照共享目錄的路徑 允許訪問的NFS客戶端(共享許可權引數)格式,定義要共享的目錄與相應的許可權。

[root@nfs ~]# echo `/data 172.16.1.0/24(rw,sync,all_squash)` > /etc/exports

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

/data 172.16.1.0/24(rw,sync,all_squash)

如果想要把/data目錄共享給172.16.1.0/24網段內的所有主機

1.主機都擁有讀寫許可權

2.在將資料寫入到NFS伺服器的硬碟中後才會結束操作,最大限度保證資料不丟失

3.將所有使用者對映為本地的匿名使用者(nfsnobody)

2.3.2 建立對應的目錄

[root@nfs ~]# mkdir /data

2.3.3 啟動服務,並將服務加入開機自啟動

[root@nfs ~]# systemctl enable rpcbind nfs-server

[root@nfs ~]# systemctl start rpcbind nfs-server

2.3.4 檢查埠

[root@nfs ~]# netstat -lntp

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address      Foreign Address    State       PID/Program name                  
tcp        0      0 0.0.0.0:2049            0.0.0.0:*     LISTEN      -                     
tcp        0      0 0.0.0.0:111             0.0.0.0:*     LISTEN      653/rpcbind

2.3.5 檢查共享的內容

[root@nfs ~]# cat /var/lib/nfs/etab

/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,secure,root_squash,all_squash)

2.3.6 檢查匿名使用者對應的真實賬戶,並授權共享目錄為nfsnobody

[root@nfs ~]# grep "65534" /etc/passwd

nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

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

2.4 客戶端安裝nfs

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

2.4.1 啟動rpcbind服務

[root@web01 ~]# systemctl enable rpcbind

[root@web01 ~]# systemctl start rpcbind

2.4.2 使用showmount -e檢視遠端伺服器rpc提供的可掛載nfs資訊

[root@web01 ~]# showmount -e 172.16.1.31

Export list for 172.16.1.31:

/data 172.16.1.0/24

2.4.3 建立掛載點目錄,執行掛載命令

mount命令並結合-t引數, 指定要掛載的檔案系統的型別, 並在命令後面寫上伺服器的IP地址, 以及伺服器上的共享目錄, 最後需要寫上要掛載到本地系統(客戶端)的目錄

[root@web01 ~]# mkdir /data

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

[root@web01 ~]# df -h

檔案系統                   容量  已用   可用    已用% 掛載
172.16.1.31:/data 50G 2.6G 48G 6% /data

2.4.4 掛載成功後可以進行增刪改操作,測試客戶端是否擁有寫的許可權

[root@web01 ~]# echo "123" > /data/test

[root@web01 ~]# ll /data/

總用量 4

-rw-r--r-- 1 nfsnobody nfsnobody 4 9月   6 03:41 test

2.4.5 檢查nfs服務端是否存在資料

[root@nfs ~]# ll /data/

總用量 4

-rw-r--r-- 1 nfsnobody nfsnobody 4 9月   6 03:41 test

2.4.6 如果希望NFS檔案共享服務能一直有效則永久掛載

(防止伺服器重啟掛載失效->伺服器不會重啟)

[root@web01 ~]# echo `172.16.1.31:/data       /data                   nfs     defaults        0 0` >> /etc/fstab

[root@web01 ~]# tail -1 /etc/fstab

172.16.1.31:/data       /data                   nfs     defaults        0 0

驗證fstab是否ok,前提要先解除安裝掛載

[root@web01 ~]# umount /data/

df -h 發現掛載沒有了

[root@web01 ~]# mount -a

fstab如果ok,df -h檢視會看到已經自動掛載了

2.4.7 如果不希望使用NFS共享, 可進行解除安裝

[root@web01 ~]# umount /data/

解除安裝的時候如果提示”umount.nfs: /data: device is busy” 

1.切換至其他目錄, 然後在進行解除安裝。

2.NFS當機, 強制解除安裝umount -lf /data

2.5 配置多臺客戶端伺服器的配置方法何上面客戶端方法一致

注意:客戶端的必須是服務端配置允許訪問的NFS客戶端網段內的所有主機

第3章 NFS配置引數及驗證

3.1 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的使用者UID,必須存在系統

3.2 驗證ro許可權

[root@nfs ~]# echo `/data 172.16.1.0/24(ro,sync,all_squash)` > /etc/export

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

/data 172.16.1.0/24(ro,sync,all_squash)

3.2.1 過載nfs(exportfs)

[root@nfs ~]# systemctl restart nfs-server

3.2.2 先解除安裝客戶端已掛載好的共享

[root@web01 ~]# umount /data/

3.2.3 重新進行掛載

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

3.2.4 測試是否能寫資料

[root@web01 ~]# cd /data/

[root@web01 data]# touch file-test        不允許寫入資料

touch: cannot touch `file-test`: Read-only file system

3.3 驗證all_squash,anonuid,anongid許可權

[root@nfs ~]# echo `/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)` > /etc/exports

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

/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

3.3.1 需要新增一個uid是666,gid是666的使用者

[root@nfs ~]# groupadd -g 666 www

[root@nfs ~]# useradd -u666 -g666 www

[root@nfs ~]# id www

uid=666(www) gid=666(www) 組=666(www)

3.3.2 必須重新授權為www使用者,否則無法寫入檔案

[root@nfs ~]# chown -R www.www /data/

3.3.3 重啟服務

[root@nfs ~]# systemctl restart nfs-server

3.3.4 客戶端重新掛載

[root@web01 /]# umount /data/

[root@web01 /]# mount -t nfs 172.16.1.31:/data /data/

[root@web01 data]# ll

total 4

-rw-r--r-- 1 666 666 4 Sep  6 03:41 test

3.3.5 測試是否能寫入資料

[root@web01 data]# touch tes1

[root@web01 data]# ll

total 4

-rw-r--r-- 1 666 666 0 Sep  7 10:38 tes1

-rw-r--r-- 1 666 666 4 Sep  6 03:41 test

3.3.6 為了防止許可權不一致導致許可權不足,建議在客戶端建立一模一樣的使用者

[root@web01 ~]# groupadd -g 666 www

[root@web01 ~]# useradd -u666 -g666 www

[root@web01 ~]# id www

uid=666(www) gid=666(www) groups=666(www)

3.3.7 在此檢查檔案身份

[root@web01 ~]# ll /data/

total 4

-rw-r--r-- 1 www www 0 Sep  7 10:38 tes1

-rw-r--r-- 1 www www 4 Sep  6 03:41 test

相關文章