第1章 NFS基本概述 1.1 什麼是nfs NFS是Network File System的縮寫及網路文件系統。 主要功能是通過區域網絡讓不同的主機系統之間可以共用文件或目錄。 NFS系統和Windows網路共用、網路驅動器類似, 只不過windows用於區域網, NFS用於企業集群架構中, 如果 ...
第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緩存(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