15.NFS 服務器
NFS 服務介紹
NFS是Network File System的縮寫,即網絡文件系統,是一種基于TCP/IP協議的網絡文件共享協議,最早由Sun公司開發,它允許不同操作系統的計算機通過網絡共享文件和目錄,實現跨平臺的文件訪問和管理。
核心功能:
- 文件共享:將服務器上的目錄 “掛載” 到客戶端,客戶端可像訪問本地文件一樣讀寫共享目錄中的內容。
- 跨平臺兼容:支持 Unix、Linux、Windows、macOS 等多種操作系統,解決不同系統間的文件互通問題。
- 透明訪問:客戶端訪問共享文件時,無需了解文件實際存儲在遠程服務器,操作方式與本地文件一致。
- 權限控制:通過文件系統權限(如 Unix 的用戶 / 組權限)和 NFS 配置,限制客戶端對共享資源的訪問權限(讀、寫、執行等)。
NFS工作原理
NFS工作原理圖:
NFS工作流程:
- 用戶進程在客戶端房間提出要訪問遠程文件的請求。
- 本地文件訪問的小助手把請求轉給 NFS 客戶端。
- NFS 客戶端通過 TCP/IP 協議棧這個管道把請求發送到服務器端。
- 服務器端的 RPC 服務(portmap)這個導航員指引 NFS 客戶端找到 NFS 服務。
- NFS 服務處理請求,通過本地文件訪問小助手從本地磁盤獲取文件。
- 文件再通過 TCP/IP 協議棧管道返回給客戶端的 NFS 客戶端。
- 最后,客戶端的本地文件訪問小助手把文件交給用戶進程。
部署服務
NFS服務由nfs-utils軟件包提供
# 安裝軟件包
[root@server ~]# yum install -y nfs-utils# 準備用戶作為客戶端(client)
[root@server ~]# useradd -u 1000 bq
[root@server ~]# echo 123 | passwd --stdin bq# 準備共享目錄
[root@server ~]# mkdir -p /shares/nfs
[root@server ~]# chown bq /shares/nfs# 啟用并啟動服務
[root@server ~]# systemctl enable nfs-server --now # 配置防火墻,學習階段可直接把防火墻直接關閉
[root@server ~]# firewall-cmd --permanent --add-service=nfs --add-service=rpc-bind --add-service=mountd
[root@server ~]# firewall-cmd --reload
配置 NFS 導出
exportfs 命令:
exportfs
是 Linux 系統中用于管理 NFS 服務器共享目錄(導出目錄)的核心命令,主要用于查看、刷新、添加或刪除 NFS 共享配置,無需重啟 NFS 服務即可使修改生效。
命令基本格式:
exportfs [選項] [參數]
1. 查看當前導出的 NFS 共享
exportfs -v # 詳細顯示所有導出的共享目錄及配置選項
exportfs -r # 重新加載 /etc/exports 配置(常用)
-
-v
:顯示詳細信息,包括共享目錄、允許訪問的客戶端、權限選項等。 -
示例輸出:
/data 10.1.8.11/24(rw,sync,no_root_squash,wdelay)
2. 重新加載 NFS 共享配置
當修改 /etc/exports
文件后,無需重啟 NFS 服務,直接執行:
exportfs -ra
-r
:重新讀取/etc/exports
并同步共享配置(刷新現有共享)。-a
:應用所有共享配置(包含新增和刪除的共享)。- 這是修改 NFS 共享后最常用的命令,確保配置立即生效。
3. 臨時導出一個共享目錄
無需修改 /etc/exports
,可臨時導出一個目錄(重啟 NFS 服務后失效):
exportfs -o rw,sync 10.1.8.11:/tmp/share
-o
:指定共享選項(如rw
讀寫、sync
同步寫入)。- 格式:
客戶端IP:/要共享的本地目錄
。
4. 刪除已導出的共享目錄
exportfs -u 10.1.8.11/24:/data # 取消特定客戶端對 /data 的共享
exportfs -ua # 取消所有已導出的共享
-u
:取消導出(卸載共享)。- 常用于臨時移除某個共享,而不修改
/etc/exports
。
5. 其他實用選項
-i
:忽略/etc/exports
文件,僅通過命令行參數指定共享(需配合-o
使用)。-f
:在重新加載配置前,清除所有當前導出的共享(通常與-r
結合使用:exportfs -fr
)。
常見使用場景
-
修改
/etc/exports
后刷新配置:vim /etc/exports # 編輯共享配置 exportfs -ra # 使配置生效
-
查看當前所有 NFS 共享詳情:
exportfs -v
-
臨時取消某個共享(如緊急維護):
exportfs -u 10.1.8.11/24:/data
注意事項
exportfs
僅用于管理 NFS 服務器的共享配置,客戶端掛載不受直接影響。- 臨時導出的共享(未寫入
/etc/exports
)在 NFS 服務重啟后會失效,需持久化配置請編輯/etc/exports
。 - 執行命令需 root 權限(使用
sudo
)。
編輯/etc/exports
文件
- 共享目錄格式:
共享目錄 客戶端IP(訪問權限)
- 訪問權限選項
rw
:讀寫權限。ro
:只讀權限。sync
:同步寫入,確保數據在寫入內存的同時也寫入磁盤,保證數據安全但性能稍低。async
:異步寫入,數據先寫入內存,再異步寫入磁盤,性能較高但可能丟失數據。no_subtree_check
:不檢查子樹,提高性能。no_root_squash
,默認情況下,當客戶機上的root用戶訪問NFS導出時,服務器會將其視為nobody用戶(在服務器上定義)的訪問。
重新加載配置
- 使用
exportfs - ra
命令重新加載/etc/exports
文件中的配置,使新的共享設置生效。
==提示:==NFS服務器主要配置文件是**/etc/exports**,目錄**/etc/exports.d中任何以.exports**結尾且不以點(.)開頭的文件也會生效。 所有這些文件都使用相同的語法。
==提示:==與編輯文件/etc/exports本身相比,在/etc/exports.d中創建或刪除文件可能更容易,并且它可以減少一系列相關配置更改意外破壞現有導出的風險。
配置文件中,每一行都聲明一個導出點。 第一個字段是要導出到客戶端的目錄的名稱。 該行的其余部分列出了可以訪問共享目錄的客戶端系統以及授予它們的訪問權限。
==提示:==NFS不要使用SMB共享的目錄。 如果這樣做,則可能會導致文件損壞或其他文件完整性或一致性問題。
配置示例
- 可解析DNS的主機名,例如client.bq.cloud。 在以下示例中,client.bq.cloud系統可以掛載/shares/nfs目錄。
/shares/nfs client.bq.cloud
- DNS解析的主機名,帶*通配符。 以下示例允許bq.cloud域中的所有系統訪問NFS共享。
/shares/nfs *.bq.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.bq.cloud *.example.net
默認情況下,目錄以只讀模式與客戶端共享。 在每個客戶定義之后,您可以立即在括號中指定導出選項以覆蓋默認值。 客戶端定義的末尾和左括號之間必須沒有空格。
選項示例
-
rw,此選項允許對指定客戶端進行讀/寫訪問。 如果沒有該選項(或者如果您使用ro代替),則NFS僅授予讀取訪問權限。 在以下示例中,client.bq.cloud具有讀/寫訪問權限,而client2.bq.cloud具有只讀訪問權限。
/shares/nfs client.bq.cloud(rw) client2.bq.cloud
-
no_root_squash,默認情況下,當客戶機上的root用戶訪問NFS導出時,服務器會將其視為nobody用戶(在服務器上定義)的訪問。 這意味著,如果客戶端上的root用戶在導出文件上創建了文件,則該文件將歸用戶nobody所有。 這也意味著,如果客戶機上的root用戶嘗試讀取導出文件,而該文件是沒人能讀取的用戶,則訪問將失敗。 您可以通過添加no_root_squash選項來禁用該安全保護。 (nobody用戶對大多數系統資源只有讀或無權限操作)
以下示例允許client.bq.cloud系統具有對/shares/nfs導出目錄的讀/寫訪問權限和實際root用戶訪問權限。
/shares/nfs client.bq.cloud(rw,no_root_squash)
我們使用以下記錄:
[root@server ~]# 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 ~]# exportfs -r
# 或者
[root@server ~]# systemctl reload nfs-server
# 或者
[root@server ~]# exportfs -av
每當您在/etc/exports或/etc/exports.d/*.exports中更改導出點時,請對NFS服務運行exportfs -r命令確保更改生效,或者運行systemctl reload nfs-server
。
[root@server ~]# exportfs -r
# 或者
[root@server ~]# systemctl reload nfs-server
# 或者
[root@server ~]# exportfs -av
監視 NFS 導出
使用exportfs命令列出NFS服務器當前導出的目錄。
[root@server ~]# exportfs
/shares/nfs 10.1.8.0/24
默認情況下,該命令不顯示導出選項。 使用-v選項列出這些選項,包括缺省選項。
[root@server ~]# exportfs -v
/shares/nfs 10.1.8.0/24(sync,...,rw,secure,no_root_squash,...)
客戶端掛載
# 安裝軟件包
[root@client ~]# yum install -y nfs-utils
# 準備用戶
[root@client ~]# useradd -u 1000 bq
[root@client ~]# echo redhat | passwd --stdin bq# 查看服務端提供的共享
[root@client ~]# showmount -e server
Export list for server:
/shares/nfs 10.1.8.0/24# 掛載
[root@client ~]# mkdir /mnt/nfs
[root@client ~]# mount -t nfs server:/shares/nfs /mnt/nfs# root用戶不能創建
[root@client ~]# touch /mnt/nfs/root-f1
touch: cannot touch ‘/mnt/nfs/root-f1’: Permission denied# bq用戶能創建
[bq@client ~]$ touch /mnt/nfs/bq-f1
持久化掛載
修改 /etc/fstab,最后添加如下記錄:
server:/shares/nfs /mnt/nfs nfs defaults 0 0
如涉及版權問題,請聯系作者處理!!!!!!