NFS是Network File System的縮寫及網絡文件系統。css
主要功能是經過局域網絡讓不一樣的主機系統之間能夠共享文件或目錄。前端
NFS系統和Windows網絡共享、網絡驅動器相似, 只不過windows用於局域網, NFS用於企業集羣架構中, 若是是大型網站, 會用到更復雜的分佈式文件系統FastDFS,glusterfs,HDFSlinux
1.實現多臺服務器之間數據共享web
2.實現多臺服務器之間數據的一致shell
當用戶執行mkdir命令, 該命令會經過shell解釋器翻譯給內核,由內核解析完成後驅動硬件,完成相應的操做。windows
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.NFS文件系統簡單易用、方便部署、數據可靠、服務穩定、知足中小企業需求。
2.NFS文件系統內存放的數據都在文件系統之上,全部數據都是能看得見。
1.存在單點故障, 若是構建高可用維護麻煩。(web-》nfs()-》backup)
2.NFS數據明文, 並不對數據作任何校驗。
3.客戶端掛載無需帳戶密碼, 安全性通常(內網使用)
1.生產場景應將靜態數據儘量往前端推, 減小後端存儲壓力
2.必須將存儲裏的靜態資源經過CDN緩存(jpg\png\mp4\avi\css\js)
3.若是沒有緩存或架構自己歷史遺留問題太大, 在多存儲也無用
服務器系統 |
角色 |
外網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 |
systemctl disable firewalld
systemctl stop firewalld
sed -ri '#^SELINUX=#cSELINUX=Disabled' /etc/selinux/config setenforce 0
[root@nfs ~]# yum -y install nfs-utils
咱們能夠按照共享目錄的路徑 容許訪問的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)
[root@nfs ~]# mkdir /data
[root@nfs ~]# systemctl enable rpcbind nfs-server [root@nfs ~]# systemctl start rpcbind nfs-server
[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
[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)
[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
[root@web01 ~]# yum install nfs-utils -y
rpcbind
服務[root@web01 ~]# systemctl enable rpcbind [root@web01 ~]# systemctl start rpcbind
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
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
[root@web01 ~]# echo "123" > /data/test [root@web01 ~]# ll /data/ 總用量 4 -rw-r--r-- 1 nfsnobody nfsnobody 4 9月 6 03:41 test
[root@nfs ~]# ll /data/ 總用量 4 -rw-r--r-- 1 nfsnobody nfsnobody 4 9月 6 03:41 test
(防止服務器重啓掛載失效->服務器不會重啓)
[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查看會看到已經自動掛載了
NFS
共享, 可進行卸載[root@web01 ~]# umount /data/
卸載的時候若是提示」umount.nfs: /data: device is busy」
1.切換至其餘目錄, 而後在進行卸載。
2.NFS宕機, 強制卸載umount -lf /data
注意:客戶端的必須是服務端配置容許訪問的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,必須存在系統 |
[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)
[root@nfs ~]# systemctl restart nfs-server
[root@web01 ~]# umount /data/
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /data/
[root@web01 ~]# cd /data/ [root@web01 data]# touch file-test 不容許寫入數據 touch: cannot touch 'file-test': Read-only file system
[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)
[root@nfs ~]# groupadd -g 666 www [root@nfs ~]# useradd -u666 -g666 www [root@nfs ~]# id www uid=666(www) gid=666(www) 組=666(www)
[root@nfs ~]# chown -R www.www /data/
[root@nfs ~]# systemctl restart nfs-server
[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
[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
[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)
[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