用于Linux之間進行文件共享則是用NFS服務(Network FileSystem)
目的在于讓不同的機器,不同的操作系統可以彼此分享各自的文件數據。
NFS服務可以將遠程Linux系統上的文件共享資源掛載到本地機器的目錄上。
企業生產集群為什么需要共享存儲
這個共享存儲對于中小企業,也就是使用服務器配置NFS網絡文件共享系統實現。
什么是共享存儲
簡單說就是將很多臺服務器的數據,都可以保存在同一個存儲服務器上。這樣可以在服務器集群內,數據統一存儲到一臺機器上,以實現共享存儲。 這樣在基于負載均衡的web集群下,用戶無論請求哪一臺機器都可以獲取到同樣的數據。
什么是NFS
network file system 網絡文件系統 NFS主要使用在局域網下,讓不同的主機之間可以共享文件、或者目錄數據 主要用于linux系統上實現文件共享的一種協議,其客戶端主要是Linux 沒有用戶認證機制,且數據在網絡上傳送的時候是明文傳送,一般只能在局域網中使用 支持多節點同時掛載及并發寫入
NFS架構圖
NFS程序運行后,產生如下組件
RPC(Remote Procedure Call Protocol):遠程過程調用協議,它是一種通過網絡從遠程計算機程序上請求服務,不需要了解底層網絡技術的協議。-
rpcbind //負責NFS的數據傳輸,遠程過程調用 tcp/udp協議 端口111
nfs-utils //控制共享哪些文件,權限管理
什么是RPC
RPC(Remote Procedure Call)遠程過程調用,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。
遠程過程調用,相對應的就是,本地過程調用。 rpc一般是開發中的網絡編程知識 1.于超老師本地寫好了一個代碼文件,如hello-world.py ,本地運行該程序,這就是本地過程調用(執行程序,拿到結果) 2.遠程過程調用 于超老師在將代碼文件放在遠程服務器上,在自己筆記本上,遠程調用、執行該代碼文件,執行結果會通過網絡把數據發回來,這就是遠程過程調用
簡單理解RPC與洗衣服
同樣是洗衣服,一個本地洗,一個遠程洗。
打個比方,你在家里,要洗衣服,你直接把衣服放到洗衣機,開啟洗衣機開關,這就是本地過程調用。(本地過程調用)
遠程調用就是,你不在家里,你打個電話回家里,跟媽說幫忙洗個衣服,這就是遠程過程調用。
也就是你的一個計算任務,是遠程的服務器在執行,執行完畢,告訴你結果而已。
NFS和RPC的關系
我們已知NFS是通過網絡來進行數據傳輸(網絡文件系統),因此NFS會使用一些port來傳輸數據。
關鍵點:
但是NFS在傳輸數據的時,使用的端口是隨機選擇(可以重啟NFS服務查看端口)。
既然NFS是隨機端口選擇(好比銀行的取錢窗口總發生變化,你知道幾號窗口是取錢業務嗎?)
那么NFS在傳輸數據的時候,怎么知道NFS服務器使用的端口是哪個呢?
答案就是NFS使用的RPC(Remote Procedure Call,就是遠程過程調用)協議來實現的。
NFS工作原理(重要)
1.NFS服務端啟動后、將自己的端口信息,注冊到rpcbind服務中 2.NFS客戶端通過TCP/IP的方式,連接到NFS服務端提供的rpcbind服務,并且從該服務中獲取具體的端口信息 3.NFS客戶端拿到具體端口信息后,將自己需要執行的函數,通過網絡發給NFS服務端對應的端口 4.NFS服務端接收到請求后,通過rpc.nfsd進程判斷該客戶端是否有權限連接 5.NFS服務端的rpc.mount進程判斷客戶端是否有對應的操作權限 6.最終NFS服務端會將客戶端請求的函數,識別為本地可以執行的命令,傳遞給內核、最終內核驅動硬件 結論、nfs的客戶端、服務端之間的通信基于rpc協議,且必須運行rpcbind服務
rpcbind服務的作用
該服務是用于,nfs啟動后,將端口號,注冊到這個rpcbind服務中
圖解NFS工作原理
NFS工作流程(原理)
在啟動NFS服務端之前,必須先啟動RPC服務,在centos7服務器下為rpcbind服務,否則NFSserver無法向RPC注冊信息了。 另外如果RPC服務重啟,原來注冊的NFS服務端信息也就失效了,也必須重啟服務,再次注冊信息給RPC服務。 特別要注意的是,修改NFS配置文件后不需要重啟NFS,只需要執行exportfs -rv 命令即可或是systemctl reload nfs
nfs工作流程圖原理
當訪問程序通過NFS客戶端向NFS服務器端存儲文件時,其數據請求流程如下: 1.用戶訪問網站程序,由程序在NFS客戶端上發出存取文件的請求,此時NFS客戶端(執行程序的機器)的RPC服務(rpcbind)就會通過網絡向NFS服務器的RPC服務的111端口發出NFS文件存取功能的請求。 2.NFS服務器RPC找到對應注冊的NFS端口,通知NFS客戶端RPC服務 3.此時NFS客戶端獲取到正確的端口,并與NFS daemon聯機存取數據 4.NFS客戶端把數據存取成功后返回給前端程序,告知用戶存取結果,完成一次存取請求。 這也就證明,必須先啟動RPC服務,再啟動NFS服務的步驟。
機器準備
nfs服務端 nfs-31
多個nfs客戶端 web-7
最終完成效果
讓web-7 可以讀寫 nfs共享的靜態文件數據
NFS服務端部署
配置文件語法介紹
默認配置文件路徑是/etc/exports exports配置文件語法 NFS共享目錄 NFS客戶端地址(參數1、參數2...) 客戶點地址2(參數1、參數2...) 例如 / hostname1(rw) hostname2(rw,no_root_squash) /pub *(rw) /home/chao 123.206.16.61(ro) 參數解釋 1.NFS共享目錄:為NFS服務器要共享的實際目錄,必須絕對路徑,注意目錄的本地權限,如果要讀寫共享,要讓本地目錄可以被NFS客戶端的(nfsnobody)讀寫 2.NFS客戶端地址,也就是NFS服務器端授權可以訪問共享目錄的客戶端地址,詳見下表 3.權限參數,對授權的NFS客戶端訪問權限設置,見下表
nfs客戶端地址說明
NFS配置文件參數解釋
ro 只讀 rw 讀寫 root_squash 當nfs客戶端以root訪問時,它的權限映射為NFS服務端的匿名用戶,它的用戶ID/GID會變成nfsnobody no_root_squash 同上,但映射客戶端的root為服務器的root,不安全,避免使用 all_squash 所有nfs客戶端用戶映射為匿名用戶,生產常用參數,降低用戶權限,增大安全性。 sync 數據同步寫入到內存與硬盤,優點數據安全,缺點性能較差 async 數據寫入到內存,再寫入硬盤,效率高,但可能內存數據會丟 /etc/exports man 5 exports 共享目錄 共享選項 /nfs/share *(ro,sync) 共享主機: * :代表所有主機 192.168.0.0/24:代表共享給某個網段 192.168.0.0/24(rw) 192.168.1.0/24(ro) :代表共享給不同網段 192.168.0.254:共享給某個IP *.yuchaoit.cn:代表共享給某個域下的所有主機 共享選項: ro:只讀,不常用 rw:讀寫 sync:實時同步,直接寫入磁盤 async:異步,先緩存在內存再同步磁盤 anonuid:設置訪問nfs服務的用戶的uid,uid需要在/etc/passwd中存在 anongid:設置訪問nfs服務的用戶的gid root_squash :默認選項 root用戶創建的文件的屬主和屬組都變成nfsnobody,其他人nfs-server端是它自己,client端是nobody。 no_root_squash:root用戶創建的文件屬主和屬組還是root,其他人server端是它自己uid,client端是nobody。 all_squash:不管是root還是其他普通用戶創建的文件的屬主和屬組都是nfsnobody 說明: anonuid和anongid參數和all_squash一起使用。 all_squash表示不管是root還是其他普通用戶從客戶端所創建的文件在服務器端的擁有者和所屬組都是nfsnobody;服務端為了對文件做相應管理,可以設置anonuid和anongid進而指定文件的擁有者和所屬組
rpcbind服務管理
NFS服務都是基于RPC協議通信的默認端口是111,要確保系統運行了rpcbind服務
要注意的是rpcbind服務即使停止,111端口也不會掛掉,因為還有rpcbind.socket服務
意思是,啟動rpc服務由2個結合運行
rpcbind.service
rpcbind.socket
[root@chaogelinux ~]# systemctl status rpcbind ● rpcbind.socket - RPCbind Server Activation Socket Loaded: loaded (/usr/lib/systemd/system/rpcbind.socket; enabled; vendor preset: enabled) Active: active (running) since 二 2020-03-10 1012 CST; 4h 35min ago Listen: /var/run/rpcbind.sock (Stream) 0.0.0.0:111 (Stream) 0.0.0.0:111 (Datagram) 3月 10 1012 chaogelinux systemd[1]: Listening on RPCbind Server Activation Socket. # 啟動rpcbind服務 systemctl restart rpcbind #啟動 systemctl restart nfs-server
NFS服務端部署實踐(重要)
1.準備好nfs服務端機器 2.安裝nfs工具包 yum install nfs-utils rpcbind -y 3.修改配置文件,填寫為你需要的共享參數即可 先學學該軟件的配置文件語法,每一個軟件的配置文件語法,可能都不相同 [root@nfs-31 ~]#cat /etc/exports 需要你填入如下配置,定義共享文件,以及限定訪問的ip主機,以及共享的參數,權限設置 4. 設置一個共享 /nfs-data文件夾,運行172.16.1.0局域網內的用戶可以訪問,權限是只讀 mkdir /nfs-data vim /etc/exports 這里需要添加參數,讓掛載后的客戶端,身份改為匿名用戶,降低權限,以及設置對應的讀寫權限 /nfs-data 172.16.1.0/24(rw,sync,) 5.注意要先啟動rpcbind服務 確保如下2個進程都運行,rpc服務才正常,如果想停止rpc服務,也是關閉這倆進程 rpcbind.service rpcbind.socket systemctl start rpcbind.service systemctl start rpcbind.socket [root@nfs-31 ~]#netstat -tunlp |grep rpc [root@nfs-31 ~]#systemctl status rpcbind [root@nfs-31 ~]#systemctl start rpcbind.service [root@nfs-31 ~]#systemctl start rpcbind.socket 6.運行nfs服務 ,每次重啟nfs,nfs端口號,不斷變化中 systemctl start nfs 7.檢查nfs共享的情況 [root@nfs-31 ~]#showmount -e 172.16.1.31 Export list for 172.16.1.31: /nfs-data 172.16.1.0/24 8.修改服務端的nfs配置文件,允許讀寫操作 root_squash 這個參數,就是將客戶端機器在nfs中創建的數據,用于改為nfsnobody [root@nfs-31 ~]#cat /etc/exports /nfs-data 172.16.1.0/24(rw,root_squash) 還需要修改該共享文件夾的權限 chown -R nfsnobody:nfsnobody /nfs-data 9.設置nfs服務端開機自啟、包括rpncbind服務 [root@nfs-31 ~]#systemctl is-enabled nfs 檢查是否開機自啟 disabled [root@nfs-31 ~]#systemctl enable rpcbind nfs Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service. 10.nfs配置文件修改或,無需重啟,使用重新加載,方式NFS端口號再次變化 方法1 systemctl reload nfs 方法2,更新nfs的配置文件設置 [root@nfs-31 ~]#exportfs -r
NFS客戶端部署實踐(重要)
1.安裝nfs工具包 [root@web-7 ~]#yum install nfs-utils -y 2.運行客戶端的rpcbind程序 [root@web-7 ~]#systemctl start rpcbind [root@web-7 ~]#netstat -tnlp|grep rpc tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 4412/rpcbind tcp6 0 0 :::111 :::* LISTEN 4412/rpcbind 3.遠程查看nfs服務器信息 [root@web-7 ~]#showmount -e 172.16.1.31 Export list for 172.16.1.31: /nfs-data 172.16.1.0/24 4.創建文件夾 [root@web-7 ~]#mkdir -p /test-nfs 5..掛載nfs,查看nfs [root@web-7 ~]#mount -t nfs 172.16.1.31:/nfs-data /test-nfs [root@web-7 ~]# [root@web-7 ~]#df -h 6.嘗試讀寫數據 ls /test-nfs touch /test-nfs/hello.log
NFS結合nginx實現共享存儲
- 安裝部署nfs服務端 - 生產環境下的參數rw,sync,all_squash,anonuid,anongid
rw,sync, all_squash ,將web-7的任意用戶root,bob01,,在該共享目錄下的操作,全部改為nfsnobody以實現權限控制 web-7 /test-nfs 172.16.1.31:/nfs-data 無論是root去讀寫 、/test-nfs 還是bob01讀寫 /test-nfs 創建的數據,都會被改為user,group都是 默認的nfsnobody anonuid=id號 anongid= 集合這倆參數,就可以限制在 該nfs共享目錄下的所有用戶操作,統一被限制為了某個指定的用戶
圖解這個需求
任務需求 1.nginx的啟動用戶必須是www,uid是 1500,不允許登錄 useradd www -u 1500 -M -s /sbin/nologin 1.0 安裝nginx yum install nginx -y 1.1 修改nginx配置文件,指定是www用戶運行 vim /etc/nginx/nginx.conf 修改如下 user www; 1.2 啟動nginx systemctl start nginx 1.3 檢查nginx進程 [root@web-7 ~]#ps -ef|grep nginx root 5038 1 0 12:07 ? 00:00:00 nginx: master process /usr/sbin/nginx www 5040 5038 0 12:07 ? 00:00:00 nginx: worker process 2.nfs共享存儲用戶也是www,uid是 1500,不允許登錄,允許讀寫 修改nfs配置文件如下,限定客戶端在該目錄中的操作,權限都被轉化為www用戶 限制nginx機器才能訪問 [root@nfs-31 ~]#mkdir /nfs-nginx [root@nfs-31 ~]#useradd www -u 1500 -M -s /sbin/nologin 修改配置文件 [root@nfs-31 ~]#cat /etc/exports /nfs-data *(rw,all_squash) /nfs-nginx 172.16.1.7(rw,sync,all_squash,anonuid=1500,anongid=1500) 3.重新加載nfs(reload是針對已經有進程在運行了,重新讀取配置文件) 你是新安裝的機器nfs,還能reload嗎? systemctl reload nfs 4.修改共享目錄的屬主、屬組為www [root@nfs-31 /nfs-nginx]#chown -R www.www /nfs-nginx/ [root@nfs-31 /nfs-nginx]#ll -d /nfs-nginx/ drwxr-xr-x 2 www www 6 Apr 22 12:09 /nfs-nginx/ 3.nginx網站可以正常讀寫共享存儲資料 先掛載nfs mount -t nfs 172.16.1.31:/nfs-nginx /usr/share/nginx/html/ [root@web-7 ~]#df -h |grep nginx 172.16.1.31:/nfs-nginx 17G 1.6G 16G 10% /usr/share/nginx/html 客戶端生成網頁,和圖片等靜態資源,查看是否寫入到NFS服務端 [root@web-7 ~]#vim /usr/share/nginx/html/index.html 模擬用普通用戶,到該nginx目錄下,生成一個數據圖片 [client01@web-7 /usr/share/nginx/html]$wget -O /usr/share/nginx/html/liyunlong.jpg https://inews.gtimg.com/newsapp_bt/0/8823765779/1000 4.修改nginx網頁,加載該用戶自己創建的圖片信息嗎 [client01@web-7 /usr/share/nginx/html]$cat index.html 把我李云龍的意大利炮拿來5.模擬用戶訪問該nginx網站 http://10.0.0.7/
NFS故障案例
1.nfs服務端崩潰
服務端關閉nfs
當nfs服務端崩潰后,客戶端nfs會卡死 [root@nfs-31 /data3]#systemctl stop nfs
nfs客戶端查看掛載情況
對該掛載目錄的操作全部卡死 [root@web-7 /t3]#ls ^C [root@web-7 /t3]#df -h ^C 也無法取消掛載 [root@web-7 ~]#umount /t3 ^C
解決辦法
1.修復nfs服務端
服務端 [root@nfs-31 /data3]#systemctl start nfs 客戶端 [root@web-7 ~]#ls /t3 hehe 師傅你是干什么的.log 我的老天鵝啊.log 測試anonuid.log
2.強制卸載客戶端的nfs掛載
[root@web-7 ~]#umount --help -f, --force force unmount (in case of an unreachable NFS system) -l, --lazy detach the filesystem now, and cleanup all later 取消客戶端所有對該nfs服務端的掛載即可 [root@web-7 ~]#umount -lf /t3 [root@web-7 ~]#umount -lf /data df命令恢復了 [root@web-7 ~]#df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 17G 1.6G 16G 10% / devtmpfs 980M 0 980M 0% /dev tmpfs 992M 0 992M 0% /dev/shm tmpfs 992M 9.6M 982M 1% /run tmpfs 992M 0 992M 0% /sys/fs/cgroup /dev/sda1 1014M 130M 885M 13% /boot tmpfs 199M 0 199M 0% /run/user/0
2.nfs服務端崩潰導致重啟服務器卡死
1.如果nfs客戶端設置了/etc/fstab開機自啟,重啟服務器后會導致無法正確掛載nfs服務端,卡死無法啟動,解決辦法就是等待1分鐘30秒左右會自動正確自動 2.進入單用戶模式,緊急模式,修復/etc/fstab文件,重啟即可
-
Linux
+關注
關注
87文章
11456瀏覽量
212750 -
服務器
+關注
關注
12文章
9681瀏覽量
87260 -
NFS
+關注
關注
1文章
56瀏覽量
26427
原文標題:打造高效共享存儲:一步步實現 NFS 服務搭建
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
Linux開發_CentOS7.4服務器搭建NFS、NGINX服務器,安裝ffmpeg、Qt環境

飛凌嵌入式ElfBoard ELF 1板卡-常見網絡服務搭建之NFS服務搭建
【AWorks試用體驗】+NFS服務器搭建
4412開發板學習筆記-NFS服務器的搭建
【orangepi zero試用體驗】在windows下搭建NFS環境
ubuntu下搭建NFS服務器
在windows下也可以搭建nfs和tftp服務器為開發板提供服務嗎
linux搭建NFS服務的方法
[RK3399] [Firefly-Ubuntu] 搭建NFS服務實現共享目錄
嵌入式linux實現mount掛載nfs服務器拷貝文件

基于RK3576開發板的NFS服務搭建與掛載

評論