NFS 服務器
NFS 服務介紹
NFS 是Network File System的縮寫,即網絡文件系統,最早由Sun公司開發,**用來在UNIX&Linux系統間實現磁盤文件共享的一種方法。**它的主要功能是通過網絡讓不同的主機系統之間可以共享文件或目錄。NFS客戶端(一般為應用服務器,例如web)可以通過掛載(mount)的方式將NFS服務端共享的數據目錄掛載到NFS客戶端本地系統中(就是某一個掛載點下)。從NFS客戶端的機器本地看,NFS服務端共享的目錄就好像是客戶自己的磁盤分區或者目錄一樣,而實際上確是遠端的NFS服務端的目錄。
在企業集群架構的工作場景中,NFS網絡文件系統一般被用來存儲共享視頻、圖片、附件等靜態資源文件。一般是把網站用戶上傳的文件都放在NFS共享里,例如,BBS產品的圖片、附件、頭像,特別是中小網站公司應用頻率更高。
NFS 支持的功能相當的多,而不同的功能都會使用不同的程序來啟動,每啟動一個功能就會啟用一些端口來傳輸數據,因此,NFS的功能所對應的端口沒有固定住,而是隨機取用一些未被使用的小于1024的端口提供服務。但如此一來客戶端如何獲得服務器端的相關端口呢?
此時我們就得需要遠程過程調用(RPC)的服務!RPC最主要的功能是注冊每個NFS功能所對應的端口,并且匯報給客戶端,讓客戶端可以連結到正確的端口。RPC定義了一種進程間通過網絡進行交互通信的機制,它允許客戶端進程通過網絡向遠程服務進程請求服務,而不需要了解服務器底層的通信協議詳細信息。
- NFS 服務器:導出文件系統目錄及其內容。
- NFS 客戶端:掛載服務器導出的文件系統到本地。
部署服務
NFS服務由nfs-utils軟件包提供,RHEL8默認安裝了該軟件包。
# 安裝軟件包
[whisky@server-gx ~ 10:10:08]$ yum install -y nfs-utils.x86_64 # 準備用戶
[root@server-gx whisky 10:16:05]# id whisky# 準備共享目錄
[root@server-gx whisky 10:22:25]# mkdir -p /shares/webapp
[root@server-gx whisky 10:22:59]# chown whisky /shares/webapp
[root@server-gx whisky 10:23:23]# chown 48:48 /shares/webapp# 啟用并啟動服務
[root@server-gx whisky 10:26:12]# systemctl enable nfs-server.service --now
配置 NFS 導出
NFS服務器主要配置文件是**/etc/exports**,目錄**/etc/exports.d中任何以.exports**結尾且不以點(.)開頭的文件也會生效。 所有這些文件都使用相同的語法。
==提示:==與編輯文件/etc/exports本身相比,在/etc/exports.d中創建或刪除文件可能更容易,并且它可以減少一系列相關配置更改意外破壞現有導出的風險。
配置文件中,每一行都聲明一個導出點。 第一個字段是要導出到客戶端的目錄的名稱。 該行的其余部分列出了可以訪問共享目錄的客戶端系統以及授予它們的訪問權限。
==提示:==NFS不要使用SMB共享的目錄。 如果這樣做,則可能會導致文件損壞或其他文件完整性或一致性問題。
配置示例:
- 可解析DNS的主機名,例如client.laoma.cloud。 在以下示例中,client.laoma.cloud系統可以掛載/shares/nfs目錄。
/shares/nfs client.laoma.cloud
- DNS解析的主機名,帶*通配符。 以下示例允許laoma.cloud域中的所有系統訪問NFS共享。
/shares/nfs *.laoma.cloud
- IPv4地址。 以下示例允許從10.1.8.12 IP地址訪問NFS共享。
/shares/nfs 10.1.8.11
- IPv4網絡。 以下示例允許從10.1.8.0/24網絡訪問NFS共享。 您也可以使用10.1.8.0/255.255.255.0 表示法。
/shares/nfs 10.1.8.0/24
/shares/nfs 10.1.8.0/255.255.255.0
- IPv6地址。 以下示例允許具有fde2:6494:1e09:2::20 IPv6地址的客戶端系統訪問NFS共享。
/shares/nfs fde2:6494:1e09:2::20
- IPv6網絡。 以下示例允許fde2:6494:1e09:2::/64 IPv6網絡訪問NFS共享。
/shares/nfs fde2:6494:1e09:2::/64
- 要與多個客戶機系統共享目錄,請在目錄名稱后使用以空格分隔的列表:
/shares/nfs 10.1.8.0/24 client.laoma.cloud *.example.net
默認情況下,目錄以只讀模式與客戶端共享。 在每個客戶定義之后,您可以立即在括號中指定導出選項以覆蓋默認值。 客戶端定義的末尾和左括號之間必須沒有空格。
常用的選項:
-
rw,此選項允許對指定客戶端進行讀/寫訪問。 如果沒有該選項(或者如果您使用ro代替),則NFS僅授予讀取訪問權限。 在以下示例中,client.laoma.cloud具有讀/寫訪問權限,而client2.laoma.cloud具有只讀訪問權限。
/shares/nfs client.laoma.cloud(rw) client2.laoma.cloud
-
no_root_squash,默認情況下,當客戶機上的root用戶訪問NFS導出時,服務器會將其視為nobody用戶(在服務器上定義)的訪問。 這意味著,如果客戶端上的root用戶在導出文件上創建了文件,則該文件將歸用戶nobody所有。 這也意味著,如果客戶機上的root用戶嘗試讀取導出文件,而該文件是沒人能讀取的用戶,則訪問將失敗。 您可以通過添加no_root_squash選項來禁用該安全保護。
以下示例允許client.laoma.cloud系統具有對/shares/nfs導出目錄的讀/寫訪問權限和實際root用戶訪問權限。
/shares/nfs client.laoma.cloud(rw,no_root_squash)
==提示:==rhel7中使用nfsnobody用戶,rhel8中使用nobody用戶。
我們使用以下記錄:
#創建/shares/nfs,后續可以通過此目錄為客戶端共享文件
[root@server-gx ~ 17:25:00]# mkdir /shares/nfs#在執行如下代碼前請確保已創建目錄“/shares/nfs”,否則無法在后續執行exportfs -r 命令
[root@server-gx ~ 17:12:12]# vim /etc/exports
/shares/nfs 10.1.8.0/24(rw)
每當您在/etc/exports或/etc/exports.d/*.exports中更改導出點時,請對NFS服務運行exportfs -r命令確保更改生效,或者運行systemctl reload nfs-server
。
[root@server-gx ~ 17:28:33]# exportfs -r
# 或者
[root@server ~]# systemctl reload nfs-server
# 或者
[root@server ~]# exportfs -av
監視 NFS 導出
使用exportfs命令列出NFS服務器當前導出的目錄。
[root@server-gx ~ 17:28:42]# exportfs
/shares/nfs 10.1.8.0/24
默認情況下,該命令不顯示導出選項。 使用-v選項列出這些選項,包括缺省選項。
[root@server-gx ~ 19:12:30]# exportfs -v
/shares/nfs 10.1.8.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
客戶端掛載
# 安裝軟件包
[root@client-gx ~ 19:14:35]# yum install -y nfs-utils
# 準備用戶
[root@client-gx ~ 19:16:12]# id whisky
uid=1000(whisky) gid=1000(whisky) 組=1000(whisky),10(wheel)
[root@client-gx ~ 19:18:45]# id apache
uid=48(apache) gid=48(apache) 組=48(apache)# 查看服務端提供的共享
[root@client-gx ~ 19:18:56]# showmount -e server
Export list for server:
/shares/nfs 10.1.8.0/24# 掛載
[root@client-gx ~ 19:30:24]# mkdir /mnt/nfs
[root@client-gx ~ 19:31:02]# mount -t nfs server:/shares/nfs /mnt/nfs # root用戶不能創建
[root@client-gx ~ 19:31:56]# touch /mnt/nfs/root-test1
touch: 無法創建"/mnt/nfs/root-test1": 權限不夠# apache用戶能創建(注:之前創建apache用戶時uid為48,無法使用交互式界面登錄,此處使用臨時切換用戶的方式執行)
[root@client-gx ~ 21:20:57]# su - apache -s /bin/bash
上一次登錄:四 8月 7 21:19:15 CST 2025pts/0 上
-bash-4.2$ echo apache website > /mnt/nfs/test.html
#此時server端也可以查看
[root@server-gx ~ 20:01:15]# cat /shares/nfs/test.html
apache website
持久化掛載
修改 /etc/fstab,最后添加如下記錄:
server:/shares/nfs /mnt/nfs nfs defaults 0 0