NFS介紹
NFS基本概述
NFS(Network File System)網路檔案系統
主要功能是通過局域網路讓不同的主機系統之間可以共享檔案或目錄,
NFS系統和Windows網路共享、網路驅動器類似, 只不過windows用于局域網, NFS用于企業集群架構中, 如果是大型網站, 會用到更復雜的分布式檔案系統FastDFS,glusterfs,HDFS
為什么要使用NFS服務
實作多臺服務器之間資料共享
實作多臺服務器之間資料的一致
NFS服務內容概述
NFS優缺點以及生產建議
RPC服務知識概念介紹說明
NFS服務作業原理
NFS共享檔案系統使用原理
NFS服務配罝檔案exports撰寫格式及測驗
NFS存盤小結
nfs屬于本地檔案存盤服務
NFS存盤優點
NFS檔案系統簡單易用、方便部署、資料可靠、服務穩定、滿足中小企業需求,
NFS檔案系統記憶體放的資料都在檔案系統之上,所有資料都是能看得見,
NFS存盤局限
存在單點故障, 如果構建高可用維護麻煩,
NFS資料明文, 并不對資料做任何校驗,
客戶端掛載無需賬戶密碼, 安全性一般(內網使用)
生產應用建議
生產場景應將靜態資料盡可能往前端推, 減少后端存盤壓力
必須將存盤里的靜態資源通過CDN快取(jpg\png\mp4\avi\css\js)
如果沒有快取或架構本身歷史遺留問題太大, 在多存盤也無用
NFS應用場景
跨系統檔案資料共享
實作Windows與linux系統檔案資料共享方法
a.ftp(ftp服務部署) b.samba服務
共享存盤的價值
圖解集群需要共享存盤服務原因
沒有共享存盤
- A用戶傳圖片到WEB1服務器
- B用戶訪問這張圖片,結果B用戶訪問的請求分發到了WEB2,因為WEB2上沒有這張圖片,結果B用戶無法看到A用戶傳的圖片,
有共享存盤
1.如果有共享存盤的情況, A用戶上傳圖片無論分發到WEB1還是WEB2, 最終都存盤至共享存盤
2.在當B用戶訪問圖片時,無論分發到WEB1還是WEB2上,最終也都會去共享存盤上訪問,這樣就可以訪問到資源了
NFS實作原理

本地檔案操作方式
當用戶執行mkdir命令, 該命令會通過shell解釋器翻譯給內核,由內核決議完成后驅動硬體,完成相應的操作,
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服務
NFS服務安裝
| 服務器系統 | 角色 | 外網IP | 內網IP |
|---|---|---|---|
| CentOS 7.5 | NFS服務端 | eth0:10.0.0.31 | eth1:172.16.1.31 |
| CentOS 7.5 | NFS客戶端 | eth0:10.0.0.41 | eth1:172.16.1.41 |
注意: 檢查關閉防火墻, 以免默認的防火墻策略禁止正常的NFS共享服務
關閉Firewalld防火墻
[root@nfsnobody ~]# systemctl disable firewalld
[root@nfsnobody ~]# systemctl stop firewalld
關閉selinux防火墻
[root@nfsnobody ~]# sed -ri '#^SELINUX=#cSELINUX=Disabled' /etc/selinux/config
[root@nfsnobody ~]# setenforce 0
安裝NFS
[root@nfs ~]# yum -y install nfs-utils
配置NFS
配置內容
NFS服務程式的組態檔為/etc/exports默認該檔案里沒有任何內容,
按照共享目錄的路徑 允許訪問的NFS客戶端(共享權限引數)格式,定義要共享的目錄與相應的權限,
exports組態檔格式
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
注意: NFS客戶端地址與權限之間沒有空格
[root@nfs ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
在NFS服務器上建立用于NFS檔案共享的目錄,并設定對應權限
[root@nfs ~]# mkdir /data
[root@nfs ~]# chown -R nfsnobody.nfsnobody /data
NFS共享目錄會記錄至/var/lib/nfs/etab,如果該目錄不存在共享資訊,請檢查/etc/exports是否配置錯誤
如果想要把/data目錄共享給172.16.1.0/24網段內的所有主機
1.主機都擁有讀寫權限
2.在將資料寫入到NFS服務器的硬碟中后才會結束操作,最大限度保證資料不丟失
3.將所有用戶映射為本地的匿名用戶(nfsnobody)
exports配置內容說明
/data 172.16.1.0/24(rw,sync,all_squash)
第一部分:/data --指定共享目錄資訊
第二部分:172.16.1.0/24 --指定了一個網段資訊,表示允許指定的網段主機掛載到我本地的共享目錄上
第三部分:(rw,sync) --表示定義共享引數資訊,
rw 表示讀寫 對共享目錄設定的權限
syn 同步, 資料會先寫入到NFS服務器記憶體中,會立刻同步到磁盤里面==直接存盤硬碟中
創建對應的目錄
創建/data目錄
并將所屬用戶和組修改成nfsnobody
[root@nfs ~]# mkdir /data
[root@nfs ~]# chown -R nfsnobody.nfsnobody /data
NFS共享目錄管理用戶為nfsnobody,此用戶不用創建,安裝nfs軟體時會自動創建
啟動服務
在使用NFS服務進行檔案共享之前,需要使用RPC(Remote Procedure Call遠程程序呼叫, 服務將NFS服務器的IP地址和埠號資訊發送給客戶端,
因此,在啟動NFS服務之前,需要先重啟并啟用rpcbind服務程式,同時都加入開機自啟動
先啟動rpcbind 再啟動nfs-server 順序不能顛倒
[root@nfs-server ~]# systemctl restart rpcbind
[root@nfs-server ~]# systemctl restart nfs-server
[root@nfs-server ~]# systemctl enable rpcbind
[root@nfs-server ~]# systemctl enable 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
檢查共享的內容
NFS服務開啟后,默認的引數檔案位置,注意:修改此檔案,對nfs服務沒有任何影響
[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)
檢查匿名用戶對應的真實賬戶,并授權共享目錄為nfsnobody
[root@nfs ~]# grep "65534" /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
配置客戶端
客戶端只啟動rpcbind服務
showmount -e查看遠程服務器rpc提供的可掛載nfs資訊
客戶端創建一個掛載目錄, 使用mount命令并結合-t引數, 指定要掛載的檔案系統的型別
說明: 如果nfs軟體不安裝
無法使用showmount 命令
客戶端無法識別nfs 檔案系統型別
NFS客戶端的配置步驟 先使用showmount命令,查詢NFS服務器的遠程共享資訊
其輸出格式為“共享的目錄名稱 允許使用客戶端地址”,
配置客戶端
安裝客戶端工具,僅啟動rpcbind服務
[root@web01 ~]# yum install nfs-utils -y
[root@web01 ~]# systemctl enable rpcbind
[root@web01 ~]# systemctl start rpcbind
使用showmount -e查看遠程服務器rpc提供的可掛載nfs資訊 showmount使用,需要安裝nfs-utils軟體
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
配置客戶端-創建掛載點目錄,執行掛載命令
在NFS客戶端創建一個掛載目錄, 使用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
掛載成功后可以進行增刪改操作
使用客戶端往nfs存盤寫入
[root@web01 ~]# echo "nfs-client" >> /mnt/test.txt
檢查nfs服務端是否存在客戶端創建的新檔案
[root@nfs ~]# cat /data/test.txt
nfs-client
如果希望NFS檔案共享服務能一直有效,則需要將其寫入到fstab檔案中
[root@web01 ~]# vim /etc/fstab
172.16.1.31:/data /nfsdir nfs defaults 0 0
如果不希望使用NFS共享, 可進行卸載 umount
[root@web01 ~]# umount /nfsdir
注意:卸載的時候如果提示”umount.nfs: /nfsdir: device is busy”
切換至其他目錄, 然后在進行卸載,
NFS Server宕機, 強制卸載umount -lf /nfsdir
nfs引數詳解
NFS組態檔
執行man exports命令,然后切換到檔案結尾,可以快速查看如下樣例格式:
| nfs共享引數 | 引數作用 |
|---|---|
| rw* | 讀寫權限 |
| ro | 只讀權限 |
| root_squash | 當NFS客戶端以root管理員訪問時,映射為NFS服務器的匿名用戶(不常用) |
| no_root_squash | 當NFS客戶端以root管理員訪問時,映射為NFS服務器的root管理員(不常用) |
| all_squash | 無論NFS客戶端使用什么賬戶訪問,均映射為NFS服務器的匿名用戶(常用) |
| no_all_squash | 無論NFS客戶端使用什么賬戶訪問,均映射為NFS服務器的匿名用戶(常用) |
| sync* | 同時將資料寫入到記憶體與硬碟中,保證不丟失資料 |
| async | 優先將資料保存到記憶體,然后再寫入硬碟;這樣效率更高,但可能會丟失資料 |
| anonuid* | 配置all_squash使用,指定NFS的用戶UID,必須存在系統 |
| anongid* | 配置all_squash使用,指定NFS的用戶UID,必須存在系統 |
驗證權限作用
驗證ro權限
1.服務端修改rw為ro引數
[root@nfs01 ~]# cat /etc/exports
/data 172.16.1.0/24(ro,sync,all_squash)
[root@nfs01 ~]# systemctl restart nfs-server
2.客戶端驗證
[root@backup ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@backup ~]# df -h
Filesystem Size Used Avail Use% Mounted on
172.16.1.31:/data 98G 1.7G 97G 2% /mnt
# 無法寫入檔案
[root@backup mnt]# touch file
touch: cannot touch ‘file’: Read-only file system
2.驗證all_squash、anonuid、anongid權限
//1.服務端配置
[root@nfs01 ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
//2.服務端需要創建對應的用戶
[root@nfs01 ~]# groupadd -g 666 www
[root@nfs01 ~]# useradd -u 666 -g 666 www
[root@nfs01 ~]# id www
uid=666(www) gid=666(www) groups=666(www)
//3.多載nfs-server
[root@nfs01 ~]# systemctl restart nfs-server
[root@nfs01 ~]# 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=666,anongid=666,sec=sys,secure,root_squash,all_squash)
//4.授權共享目錄為www
[root@nfs01 ~]# chown -R www.www /data/
[root@nfs01 ~]# ll -d /data/
drwxr-xr-x 3 www www 53 Sep 3 02:08 /data/
//5.客戶端驗證
[root@backup ~]# umount /mnt/
[root@backup ~]# mount -t nfs 172.16.1.31:/data /mnt
//6.客戶端查看到的檔案,身份是666
[root@backup ~]# ll /mnt/
drwxr-xr-x 2 666 666 6 Sep 3 02:08 rsync_dir
-rw-r--r-- 1 666 666 0 Sep 3 02:08 rsync_file
//7.客戶端依舊能往/mnt目錄下寫檔案
[root@backup mnt]# touch fff
[root@backup mnt]# mkdir 111
[root@backup mnt]# ll
drwxr-xr-x 2 666 666 6 Sep 3 03:05 111
-rw-r--r-- 1 666 666 0 Sep 3 03:05 fff
//8.建議:將客戶端也創建一個uid為666,gid為666,統一身份,避免后續出現權限不足的情況
[root@backup mnt]# groupadd -g 666 www
[root@backup mnt]# useradd -g 666 -u 666 www
[root@backup mnt]# id www
uid=666(www) gid=666(www) groups=666(www)
//9.最后檢查檔案的身份
[root@backup mnt]# ll /mnt/
total 4
drwxr-xr-x 2 www www 6 Sep 3 03:05 111
-rw-r--r-- 1 www www 0 Sep 3 03:05 fff
NFS擴展項
//1.擴展:無需重啟NFS服務平滑加載組態檔
[root@nfs01 r]# cat /etc/exports
/data/r 172.16.1.0/24(ro)
/data/p 172.16.1.0/24(ro)
/data/w 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
[root@nfs01 r]# exportfs -rv
exporting 172.16.1.0/24:/data/w
exporting 172.16.1.0/24:/data/p
exporting 172.16.1.0/24:/data/r
//2.擴展:nfs客戶端掛載引數
[root@backup-41 ~]# mount.nfs4 -o noatime,nodiratime,noexec,nodev,nosuid 172.16.1.31:/data/r /data/r/
//3.擴展:nfs客戶端永久掛載引數
[root@backup-41 ~]# tail -2 /etc/fstab
172.16.1.31:/data/r /data/r nfs defaults,noatime,nodiratime,noexec,nodev,nosuid 0 0
172.16.1.31:/data/w /data/w nfs defaults,noatime,nodiratime,noexec,nodev,nosuid 0 0
//4.擴展:客戶端檢查掛載引數是否生效
[root@backup ~]# mount
等于
[root@backup ~]# cat /proc/mounts
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/148726.html
標籤:Linux
下一篇:Linux重要的服務講述(1)
