部署全程)
萬字吃透NFS服務原理詳解CentOS7實戰(zhàn)部署全程標簽#NFS #網(wǎng)絡文件系統(tǒng) #Linux運維 #集群存儲 #實戰(zhàn)教程簡介NFS是企業(yè)內網(wǎng)、服務器集群中最常用的輕量級共享存儲方案部署簡單、穩(wěn)定性高、跨平臺性強。本文從零梳理NFS核心原理、版本差異、優(yōu)缺點及應用場景搭配完整CentOS7環(huán)境實操部署、權限測試、持久化掛載實戰(zhàn)零基礎也能輕松落地。一、NFS服務核心概述1.1 什么是NFSNFSNetwork File System網(wǎng)絡文件系統(tǒng)是一款經(jīng)典的跨主機文件共享協(xié)議誕生于20世紀80年代由Sun Microsystems公司研發(fā)。其核心核心價值實現(xiàn)跨設備、跨系統(tǒng)的透明文件共享??蛻舳丝蓪⑦h程NFS服務器的共享目錄掛載到本地操作遠程文件的方式和讀寫本地磁盤完全一致極大簡化了集群、內網(wǎng)環(huán)境的數(shù)據(jù)共享與統(tǒng)一管理。目前NFS是Linux集群、Web集群、企業(yè)內網(wǎng)文件共享、嵌入式設備交互的主流輕量存儲方案。1.2 NFS起源與版本迭代對比NFS最初專為UNIX系統(tǒng)跨機文件共享設計憑借架構簡潔、部署便捷、跨平臺兼容的優(yōu)勢快速成為行業(yè)通用標準歷經(jīng)多次版本迭代目前主流使用NFSv3和NFSv4。NFSv3生產(chǎn)主流無狀態(tài)協(xié)議服務器不保存客戶端連接狀態(tài)容錯性強、故障恢復簡單同時支持UDP/TCP傳輸協(xié)議適配各類內網(wǎng)環(huán)境支持超大文件傳輸性能穩(wěn)定、兼容性極佳架構輕量化資源占用低運維成本極低NFSv4新一代版本摒棄傳統(tǒng)RPC多端口機制統(tǒng)一單端口通信防火墻配置更簡單升級為狀態(tài)化連接配套完善的文件鎖機制規(guī)避多客戶端數(shù)據(jù)沖突原生支持Kerberos安全認證解決舊版本安全性短板適配復雜網(wǎng)絡、云環(huán)境、公網(wǎng)場景安全性與穩(wěn)定性大幅提升1.3 NFS核心架構C/S架構NFS采用標準的客戶端-服務器架構結構簡單清晰分工明確服務端NFS-Server核心存儲節(jié)點負責本地目錄共享、權限管控、響應客戶端請求。通過專屬守護進程監(jiān)聽網(wǎng)絡請求處理客戶端的文件讀寫、創(chuàng)建、刪除等操作是共享資源的核心載體??蛻舳薔FS-Client無需復雜配置僅需安裝工具包通過掛載命令將服務端共享目錄關聯(lián)到本地。掛載后遠程目錄完全融入本地文件系統(tǒng)用戶無需感知文件真實存儲位置。1.4 NFS工作原理RPC機制核心NFS本身不具備獨立的端口通信能力所有通信均依賴RPC遠程過程調用機制實現(xiàn)完整工作流程分為5個核心步驟服務注冊NFS服務端啟動后主動向RPC服務注冊自身功能與通信端口等待客戶端調用。端口查詢客戶端啟動后先向RPC服務查詢NFS的工作端口獲取端口信息。連接掛載客戶端向NFS服務端發(fā)起掛載請求服務端校驗客戶端IP、權限合法性。數(shù)據(jù)交互掛載成功后客戶端所有文件操作都會轉化為RPC遠程調用服務端執(zhí)行操作并返回結果。權限控制服務端依托系統(tǒng)UID/GID用戶權限結合共享配置規(guī)則管控客戶端訪問權限。1.5 傳輸特性、優(yōu)勢與局限性核心傳輸特性無狀態(tài)性NFSv3及以下版本無狀態(tài)故障重啟后無需恢復會話直接重連即可使用容錯性優(yōu)秀。雙協(xié)議兼容UDP低延遲、低開銷適配實時性場景TCP可靠傳輸、支持大數(shù)據(jù)量為現(xiàn)代環(huán)境默認協(xié)議。NFS核心優(yōu)勢訪問透明遠程文件訪問體驗與本地完全一致零學習成本??缙脚_性強支持Linux、UNIX、macOS等主流系統(tǒng)適配多系統(tǒng)組網(wǎng)。高效輕量化傳輸效率高、資源占用少滿足絕大多數(shù)內網(wǎng)共享需求。運維簡單配置文件簡潔、命令易懂集中管理難度低。NFS局限性早期版本安全性弱NFSv3無原生加密與強認證機制易被監(jiān)聽、偽造需配合防火墻、VPN加固。網(wǎng)絡依賴度高網(wǎng)絡延遲、丟包會直接影響傳輸速度與服務穩(wěn)定性。多客戶端鎖機制復雜多節(jié)點同時讀寫同一文件時配置不當易出現(xiàn)數(shù)據(jù)不一致問題。1.6 典型應用場景企業(yè)內網(wǎng)文件共享共享辦公文檔、軟件安裝包、資源文件實現(xiàn)團隊協(xié)同訪問。服務器集群存儲為Web集群、數(shù)據(jù)庫集群提供統(tǒng)一共享存儲保證多節(jié)點數(shù)據(jù)一致性。嵌入式設備交互路由器、網(wǎng)絡存儲設備等嵌入式設備通過NFS實現(xiàn)與服務器的數(shù)據(jù)交互。二、實驗環(huán)境規(guī)劃基于CentOS7系統(tǒng)克隆3臺服務器搭建NFS集群實驗環(huán)境節(jié)點規(guī)劃如下節(jié)點名稱IP地址核心作用nfs-server10.1.8.20/24NFS服務端提供共享存儲目錄nfs-client110.1.8.21/24NFS客戶端掛載共享目錄測試nfs-client210.1.8.22/24NFS客戶端多節(jié)點同步測試三、全套實戰(zhàn)部署流程3.1 環(huán)境初始化所有節(jié)點執(zhí)行修改主機名、配置靜態(tài)IP保證節(jié)點網(wǎng)絡互通1nfs-server節(jié)點配置# 修改主機名執(zhí)行bash刷新當前終端讓主機名立刻顯示生效[rootserver ~18:24:46]# hostnamectl set-hostname nfs-server[rootserver ~18:25:06]# bash# 配置靜態(tài)IP[rootnfs-server ~18:25:09]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.20/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes# 重啟網(wǎng)卡生效[rootnfs-server ~18:27:35]# nmcli connection up ens33# 查詢修改后的ip[rootnfs-server ~18:27:45]# ip -br alo UNKNOWN127.0.0.1/8 ::1/128 ens33 UP10.1.8.20/24 fe80::76d6:7ba1:73c9:e084/64 virbr0 DOWN192.168.122.1/24 virbr0-nic DOWN2nfs-client1節(jié)點配置[rootserver ~18:29:00]# hostnamectl set-hostname nfs-client1[rootserver ~18:30:15]# bash[rootnfs-client1 ~18:30:17]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.21/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes[rootnfs-client1 ~18:31:18]# nmcli connection up ens33[rootnfs-client1 ~18:31:42]# ip -br alo UNKNOWN127.0.0.1/8 ::1/128 ens33 UP10.1.8.21/24 fe80::76d6:7ba1:73c9:e084/64 fe80::76f9:10cf:1511:e48a/64 virbr0 DOWN192.168.122.1/24 virbr0-nic DOWN3nfs-client2節(jié)點配置[rootserver ~18:34:13]# hostnamectl set-hostname nfs-client2[rootserver ~18:34:52]# bash[rootnfs-client2 ~18:34:54]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.22/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes[rootnfs-client2 ~18:36:00]# nmcli connection up ens33[rootnfs-client2 ~18:36:10]# ip -br alo UNKNOWN127.0.0.1/8 ::1/128 ens33 UP10.1.8.22/24 fe80::76f9:10cf:1511:e48a/64 fe80::76d6:7ba1:73c9:e084/64 fe80::4679:5086:6522:a6a8/64 virbr0 DOWN192.168.122.1/24 virbr0-nic DOWN[rootnfs-client2 ~18:36:13]#3.2 服務端部署配置nfs-server1安裝依賴包NFS服務依賴nfs-utils工具包同時安裝httpd用于后續(xù)網(wǎng)頁共享測試[rootnfs-server ~18:42:06]# yum -y install httpd nfs-utils2創(chuàng)建共享目錄并授權# 創(chuàng)建共享目錄[rootnfs-server ~18:42:17]# mkdir -p /shares/webapp# 授權apache用戶擁有目錄權限適配網(wǎng)頁服務[rootnfs-server ~18:46:42]# chown apache /shares/webapp# 查詢apache的uid和gid后續(xù)服務端也使用該# [rootnfs-server ~ 19:22:37]# id apacheuid48(apache)gid48(apache)組48(apache)注意NFS 默認依靠 UID、GID 數(shù)字值 校驗文件權限不識別用戶名 / 組名。服務端存儲文件時記錄的是創(chuàng)建者數(shù)字 UID/GID客戶端操作文件時傳遞本機當前用戶的數(shù)字 UID/GID服務端對比數(shù)字判斷讀寫權限和兩邊用戶名是否相同無關。3啟動并設置開機自啟[rootnfs-server ~18:47:09]# systemctl enable nfs-server.service --now# 查看nfs服務狀態(tài)[rootnfs-server ~18:48:42]# systemctl status nfs-server.service4配置防火墻放行規(guī)則放行NFS、RPC綁定、掛載服務端口保證客戶端正常連接# 臨時生效[rootnfs-server ~18:49:04]# firewall-cmd --add-servicenfs --add-servicemountd --add-servicerpc-bind# 永久生效[rootnfs-server ~18:51:11]# firewall-cmd --add-servicenfs --add-servicemountd --add-servicerpc-bind --permanent5NFS核心配置/etc/exportsNFS主配置文件/etc/exports同時支持/etc/exports.d/*.exports子配置文件推薦子文件配置避免誤修改主配置。配置語法共享目錄 客戶端地址(權限參數(shù))常用權限參數(shù)rw讀寫權限默認ro只讀no_root_squash不壓制客戶端root權限默認root_squash客戶端root會被壓制為nobody用戶配置示例配置寫法中文解析示例主機名DNS 可解析指定單個客戶端必須能通過 DNS 反向解析到/shares/webapp nfs-client1.laofang.cloud主機名 通配符\*匹配整個域下的所有主機*代表任意字符/shares/webapp *.laofang.cloud單個 IPv4 地址精確指定某一臺客戶端 IP/shares/webapp 10.1.8.21IPv4 網(wǎng)段CIDR允許整個子網(wǎng)訪問最常用寫法/shares/webapp 10.1.8.0/24IPv4 網(wǎng)段掩碼用子網(wǎng)掩碼表示網(wǎng)段效果同 CIDR/shares/webapp 10.1.8.0/255.255.255.0單個 IPv6 地址精確指定某臺 IPv6 客戶端/shares/webapp fde2:6494:1e09:2::20IPv6 網(wǎng)段允許整個 IPv6 子網(wǎng)訪問/shares/webapp fde2:6494:1e09:2::/64多客戶端空格分隔一行同時指定多個客戶端混合寫法都行/shares/webapp 10.1.8.0/24 client.laofang.cloud *.example.net編輯配置文件允許全網(wǎng)段客戶端讀寫訪問[rootnfs-server ~18:56:52]# vim /etc/exports# 寫入配置/shares/webapp10.1.8.0/24(rw)6重載配置并查看共享狀態(tài)# 修改文件后有3個命令可以執(zhí)行重新加載配置文件# 重載配置僅更新修改過的共享不打印詳情適合日常改配置后刷新[rootnfs-server ~18:58:16]# exportfs -r# -a:加載/etc/exports /etc/exports.d/*.exports 中所有共享配置生效全部共享;-v:打印完整執(zhí)行過程、每條共享目錄、配套權限參數(shù)[rootnfs-server ~18:59:52]# exportfs -avexporting10.1.8.0/24:/shares/webapp# 重新加載配置文件[rootnfs-server ~19:00:03]# systemctl reload nfs-server# 查看簡潔共享列表[rootnfs-server ~19:00:34]# exportfs/shares/webapp10.1.8.0/24# -v選項列出導出項包括缺省選項[rootnfs-server ~19:05:28]# exportfs -v/shares/webapp10.1.8.0/24(sync,wdelay,hide,no_subtree_check,secsys,rw,secure,root_squash,no_all_squash)NFS 默認導出參數(shù)完整釋義表參數(shù)詳細含義配套反向參數(shù)生產(chǎn)使用建議sync同步寫入模式客戶端下發(fā)寫請求后服務端必須將數(shù)據(jù)真正寫入物理磁盤才返回操作成功。斷電 / 宕機不會丟失文件數(shù)據(jù)。async異步寫入先寫緩存再落盤速度快但有丟數(shù)據(jù)風險生產(chǎn)環(huán)境強制保留數(shù)據(jù)優(yōu)先場景禁用 asyncwdelay寫延遲合并收集短時間內多個小型 IO 寫入請求批量一次性落盤減少磁盤尋道次數(shù)提升硬盤性能。no_wdelay不合并每次寫直接刷盤IO 開銷大內網(wǎng)文件共享默認開啟大量高并發(fā)小文件可關閉hide子掛載隱藏若共享目錄內部還有其他分區(qū) / 磁盤掛載點客戶端掛載后看不到內部掛載的內容。nohide客戶端可見共享目錄內所有子掛載磁盤Web 站點、普通文件共享推薦開啟多 LUN 嵌套共享用 nohideno_subtree_check關閉子樹校驗NFS 默認會校驗文件是否在共享目錄子樹內關閉后跳過校驗降低 CPU 開銷、提升訪問速度。subtree_check開啟子樹校驗嚴格限制文件路徑絕大多數(shù)業(yè)務保留 no_subtree_check嚴格權限隔離場景開啟 subtree_checksecsys認證方式使用系統(tǒng) UID/GID 身份認證依靠客戶端傳遞的用戶 ID 做權限判斷無需額外密碼 / 證書。seckrb5/krb5iKerberos 加密認證內網(wǎng)局域網(wǎng)默認公網(wǎng)、高安全環(huán)境改用 Kerberosrw讀寫權限允許客戶端對共享目錄讀、新建、修改、刪除文件。不寫 rw 則默認 ro 只讀ro僅只讀無法修改文件需要業(yè)務寫入添加靜態(tài)資源共享只用 rosecure端口限制僅允許客戶端使用1024 以上非特權端口發(fā)起掛載請求防止低端口偽造攻擊insecure允許 1024 以下特權端口連接內網(wǎng)默認開啟部分老舊嵌入式客戶端需加 insecureroot_squashroot 壓縮核心安全參數(shù)客戶端 root 用戶訪問共享時自動映射為服務端 nobody 匿名用戶禁止客戶端 root 篡改服務端文件。no_root_squash不映射客戶端 root 等同于服務端 root生產(chǎn)環(huán)境默認開啟嚴禁隨意刪除僅測試環(huán)境臨時關閉no_all_squash普通用戶不壓縮客戶端普通 UID/GID 用戶保持原有身份映射到服務端文件權限正常繼承。all_squash所有用戶含普通用戶全部壓縮為 nobody業(yè)務站點、多用戶共享保留公共匿名下載目錄使用 all_squash補充關鍵總結不帶任何自定義參數(shù)時NFS 會自動加載上面一整套默認配置root_squash是 NFS 最核心安全防護開啟后能避免客戶端 root 越權破壞存儲sync是數(shù)據(jù)安全保障追求速度使用async會存在宕機丟文件隱患若需要修改其中某一項規(guī)則直接在/etc/exports括號內覆蓋即可。3.3 客戶端掛載與權限測試1客戶端通用配置client1、client2均執(zhí)行# 安裝工具包[rootnfs-client1 ~18:41:20]# yum -y install httpd nfs-utils# 啟動網(wǎng)頁服務,同時查看狀態(tài)[rootnfs-client1 ~19:16:04]# systemctl enable httpd --now[rootnfs-client1 ~19:17:45]# systemctl status httpd# 防火墻放行[rootnfs-client1 ~19:23:15]# firewall-cmd --add-servicehttp --add-servicemountd --add-servicenfs --add-servicerpc-bind[rootnfs-client1 ~19:20:39]# firewall-cmd --add-servicehttp --add-servicemountd --add-servicenfs --add-servicerpc-bind --permanent# 臨時關閉 SELinux 安全強制模式切換為寬容模式Permissive[rootnfs-client1 ~19:24:44]# setenforce 0# 查看apache用戶UID/GID保證權限一致[rootnfs-client1 ~19:23:26]# id apacheuid48(apache)gid48(apache)組48(apache)2nfs-client1掛載測試# 查詢服務端共享資源[rootnfs-client1 ~19:49:53]# showmount -e 10.1.8.20Export listfor10.1.8.20: /shares/webapp10.1.8.0/24# 掛載遠程目錄到本地網(wǎng)頁根目錄[rootnfs-client1 ~19:51:26]# mount -t nfs 10.1.8.20:/shares/webapp /var/www/html[rootnfs-client1 ~19:53:02]# df -hT /var/www/html文件系統(tǒng) 類型 容量 已用 可用 已用% 掛載點10.1.8.20:/shares/webapp nfs4 50G9.0G 42G18% /var/www/html訪問測試權限測試默認root_squash# 客戶端root用戶無法創(chuàng)建文件權限壓制[rootnfs-client1 ~19:53:11]# touch /var/www/html/root-1touch: 無法創(chuàng)建/var/www/html/root-1:權限不夠# 切換apache用戶可正常創(chuàng)建文件[rootnfs-client1 ~19:54:30]# su -l -s /bin/bash apache-bash-4.2$echoapache webapp/var/www/html/web.html3服務端修改權限開啟no_root_squash取消客戶端root權限壓制允許root用戶直接操作共享文件[rootnfs-server ~22:27:27]# vim /etc/exports# 修改配置/shares/webapp10.1.8.0/24(rw,no_root_squash)# 重載配置[rootnfs-server ~22:30:33]# systemctl reload nfs-server.service# 驗證權限參數(shù)[rootnfs-server ~22:30:54]# exportfs -v/shares/webapp10.1.8.0/24(sync,wdelay,hide,no_subtree_check,secsys,rw,secure,no_root_squash,no_all_squash)權限復測# 客戶端root可正常創(chuàng)建文件[rootnfs-client1 ~22:29:55]# touch /var/www/html/root-f1[rootnfs-client1 ~22:32:20]# ls /var/www/htmlroot-f1 web.html4nfs-client2掛載同步測試# 查詢共享[rootnfs-client2 ~22:37:41]# showmount -e 10.1.8.20Export listfor10.1.8.20: /shares/webapp10.1.8.0/24# 掛載目錄[rootnfs-client2 ~22:38:35]# mount -t nfs 10.1.8.20:/shares/webapp /var/www/html/# 查看掛載[rootnfs-client2 ~22:38:42]# df -hT /var/www/html/文件系統(tǒng) 類型 容量 已用 可用 已用% 掛載點10.1.8.20:/shares/webapp nfs4 50G9.0G 42G18% /var/www/html多節(jié)點數(shù)據(jù)同步驗證在client1創(chuàng)建文件client2實時查看驗證共享存儲一致性# client1執(zhí)行[rootnfs-client1 ~22:40:23]# touch /var/www/html/xiyangyang[rootnfs-client1 ~22:41:49]# echo haha /var/www/html/index.html# client2查看可同步看到所有文件[rootnfs-client2 ~22:38:49]# ls -l /var/www/html總用量8-rw-r--r--.1root root58月622:42 index.html -rw-r--r--.1root root08月622:32 root-f1 -rw-r--r--.1apache apache148月619:55 web.html -rw-r--r--.1root root08月622:41 xiyangyang實驗結論多客戶端掛載同一NFS共享目錄數(shù)據(jù)實時同步可實現(xiàn)集群節(jié)點數(shù)據(jù)統(tǒng)一。3.4 永久掛載配置開機自動掛載臨時掛載重啟失效需寫入/etc/fstab實現(xiàn)持久化掛載兩個客戶端均配置[rootnfs-client2 ~22:43:12]# vim /etc/fstab# 末尾添加_netdev(正規(guī) NFS 常用_netdev重點標記該掛載依賴網(wǎng)絡系統(tǒng)等網(wǎng)卡就緒后再掛載 NFS)10.1.8.20:/shares/webapp /var/www/html nfs defaults,_netdev00重啟驗證# 兩臺客戶端重啟[rootnfs-client2 ~22:48:54]# reboot# 重啟后查看自動掛載狀態(tài)[rootnfs-client2 ~22:49:59]# df -hT /var/www/html文件系統(tǒng) 類型 容量 已用 可用 已用% 掛載點10.1.8.20:/shares/webapp nfs4 50G9.0G 42G18% /var/www/html掛載自動生效實驗全部完成。四、核心總結NFS依托RPC協(xié)議實現(xiàn)跨主機文件共享架構簡單、部署便捷是內網(wǎng)集群最優(yōu)輕量存儲方案NFSv3穩(wěn)定兼容、NFSv4安全高效生產(chǎn)環(huán)境可根據(jù)安全需求靈活選擇版本root_squash是NFS核心安全機制默認壓制客戶端root權限生產(chǎn)環(huán)境不建議隨意開啟no_root_squash集群場景下NFS可實現(xiàn)多節(jié)點數(shù)據(jù)統(tǒng)一同步廣泛用于Web集群、內網(wǎng)文件共享場景reboot重啟后查看自動掛載狀態(tài)[rootnfs-client2 ~ 22:49:59]# df -hT /var/www/html文件系統(tǒng) 類型 容量 已用 可用 已用% 掛載點10.1.8.20:/shares/webapp nfs4 50G 9.0G 42G 18% /var/www/html掛載自動生效實驗全部完成。 # 四、核心總結 1. NFS依托RPC協(xié)議實現(xiàn)跨主機文件共享架構簡單、部署便捷是內網(wǎng)集群最優(yōu)輕量存儲方案 2. NFSv3穩(wěn)定兼容、NFSv4安全高效生產(chǎn)環(huán)境可根據(jù)安全需求靈活選擇版本 3. root_squash 是NFS核心安全機制默認壓制客戶端root權限生產(chǎn)環(huán)境不建議隨意開啟 no_root_squash 4. 集群場景下NFS可實現(xiàn)多節(jié)點數(shù)據(jù)統(tǒng)一同步廣泛用于Web集群、內網(wǎng)文件共享場景 5. 生產(chǎn)環(huán)境需配合防火墻、權限管控、定期巡檢彌補NFS原生安全性短板。