第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