NFS網絡文件系統詳解

第1章 NFS基本概述

1.1 什麼是nfs

NFS是Network File System的縮寫及網絡文件系統。css

主要功能是經過局域網絡讓不一樣的主機系統之間能夠共享文件或目錄。前端

NFS系統和Windows網絡共享、網絡驅動器相似, 只不過windows用於局域網, NFS用於企業集羣架構中, 若是是大型網站, 會用到更復雜的分佈式文件系統FastDFS,glusterfs,HDFSlinux

1.2 爲何要使用NFS服務進行數據存儲

1.實現多臺服務器之間數據共享web

2.實現多臺服務器之間數據的一致shell

1.3 本地文件操做方式

當用戶執行mkdir命令, 該命令會經過shell解釋器翻譯給內核,由內核解析完成後驅動硬件,完成相應的操做。windows

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緩存(jpg\png\mp4\avi\css\js)

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
相關文章
相關標籤/搜索