第二十二節 企業級NFS網絡文件共享服務
標籤(空格分隔): Linux實戰教學筆記-陳思齊html
---本教學筆記是本人學習和工做生涯中的摘記整理而成,此爲初稿(尚有諸多不完善之處),爲原創做品,容許轉載,轉載時請務必以超連接形式標明文章原始出處,做者信息和本聲明。不然將追究法律責任。http://www.cnblogs.com/chensiqiqi/前端
第一章 NFS網絡文件共享服務
1.1 NFS介紹
1)什麼是NFS?node
NFS是Network File System的縮寫,中文意思是網絡文件系統。它的主要功能是經過網絡(通常是局域網)讓不一樣的主機系統之間能夠共享文件或目錄。NFS客戶端(通常爲應用服務器,例如web)能夠經過掛載(mount)的方式將NFS服務器端共享的數據目錄掛載到NFS客戶端本地系統中(就是某一個掛載點下)。從客戶端本地看,NFS服務器端共享的目錄就好像是客戶端本身的磁盤分區或者目錄同樣,而實際上倒是遠端的NFS服務器的目錄。linux
NFS網絡文件系統很像Windows系統的網絡共享,安全功能,網絡驅動器影射,這也和Linux系統裏的samba服務相似。只不過通常狀況下,Windows網絡共享服務或samba服務用於辦公局域網共享,而互聯網中小型網站集羣架構後端經常使用NFS進行數據共享。ios
2)NFS在企業中的應用場景nginx
- 在企業集羣架構的工做場景中,NFS網絡文件系統通常被用來存儲共享視頻,圖片,附件等靜態資源文件,一般網站用戶上傳的文件都會放到NFS共享裏,例如:BBS產品的圖片,附件,頭像(注意網站BBS程序不要放NFS共享裏),而後前端全部的節點訪問這些靜態資源時都會讀取NFS存儲上的資源。NFS是當前互聯網系統架構中最經常使用的數據存儲服務之一,前面說過,中小型網站公司應用頻率更高,大公司或門戶除了使用NFS外,還可能會使用更爲複雜的分佈式文件系統,好比Moosefs(mfs),GlusterFS,FastDFS等
- 在企業生產集羣架構中,NFS做爲全部前端Web服務的共享存儲,存儲的內容通常包括網站用戶上傳的圖片,附件,頭像等,注意,網站的程序代碼不要放NFS共享裏,由於網站程序是開發運維人員統一發布的,不存在發佈延遲問題,直接批量發佈到Web節點提供訪問比共享到NFS裏訪問效率更高。
3)企業生產集羣爲何須要共享存儲角色。web
- 這裏經過圖解給你們展現如下集羣架構須要共享存儲服務的理由。例如:A用戶上傳圖片到Web1服務器,而後讓B用戶訪問這張圖片,結果B用戶訪問的請求分發到了Web2,由於Web2上沒有這張圖片,這就致使它沒法看到A用戶上傳的圖片,若是此時有一個共享存儲,A用戶上傳圖片的請求不管是分發到Web1仍是Web2上,最終都會存儲到共享存儲上,而在B用戶訪問圖片時,不管請求分發到Web1仍是Web2上,最終也都會去共享存儲上找,這樣就能夠訪問到須要的資源了。這個共享存儲的位置能夠經過開源軟件和商業硬件實現,互聯網中小型集羣架構會用普通PC服務器配置NFS網絡文件系統實現。
- 當及集羣中沒有NFS共享存儲時,用戶訪問圖片的狀況以下圖所示。
上圖是企業生產集羣沒有NFS共享存儲訪問的示意圖。下圖是企業生產集羣有NFS共享存儲的狀況sql
- 中小型互聯網企業通常不會買硬件存儲,由於太貴,大公司若是業務發展很快的話,可能會臨時買硬件存儲頂一下網站壓力,當網站併發繼續加大時,硬件存儲的擴展相對就會很費勁,且價格成幾何級數增長。例如:淘寶網就曾替換掉了不少硬件設備,好比,用lvs+haproxy替換了netscaler負載均衡設備,用FastDFS,TFS配合PC服務器替換了netapp,emc等商業存儲設備,去IOE正在成爲互聯網公司的主流。
1.2 NFS系統原理介紹
1.2.1 NFS系統掛載結構圖解與介紹
下圖是企業工做中的NFS服務器與客戶端掛載狀況結構圖shell
- 能夠看到NFS服務器端/video共享目錄掛載到了兩臺NFS客戶端上。在客戶端查看時,NFS服務器端的/video目錄就至關於客戶端本地的磁盤分區或目錄,幾乎感受不到使用上的區別,根據NFS服務端授予的NFS共享權限以及共享目錄的本地系統權限,只要在指定的NFS客戶端操做掛載/v/video或者/video的目錄,就能夠將數據輕鬆地存取到NFS服務器端上的/video目錄中了。
客戶端掛載NFS後,本地掛載基本信息顯示以下:vim
[root@nfs01 ~]# df -h Filesystem Size Used Use% Mounted on /dev/sda1 1.1T 467G 544G 47% / tmpfs 7.9G 0 7.9G 0% /dev/shm 10.0.0.7:/video 1002G 59G 892G 7% /video #<==10.0.0.7爲nfsserver的ip地址 提示: mount 源 目標 mount 10.0.0.7:/video /video
-
從掛載信息來看,和本地磁盤分區幾乎沒什麼差異,只是文件系統對應列的開頭是以IP滴噢址開頭的形式了。
-
通過前面的介紹,咱們知道NFS系統是經過網絡來進行數據傳輸的(因此叫作網絡文件系統)所以,NFS會使用一些端口來傳輸數據,那麼,NFS到底使用哪些端口來進行數據傳輸呢?
- NFS在傳輸數據時使用的端口會隨機選擇。可能有同窗會納悶,既然這樣,NFS客戶端是怎麼知道NFS服務端使用的哪一個端口呢?
-
答案就是經過RPC(中文意思遠程過程調用,英文Remote Procedure Call簡稱RPC)協議/服務來實現,這個RPC服務的應用在門戶級的網站有不少,例如:百度等。
1.2.2 什麼是RPC(Remote Procedure Call)
- 由於NFS支持的功能至關多,而不一樣的功能都會使用不一樣的程序來啓動,每啓動一個功能就會啓用一些端口來傳輸數據,所以,NFS的功能所對應的端口沒法固定,它會隨機取用一些未被使用的端口來做爲傳輸之用,其中CentOS5.x的隨機端口都小於1024,而CentOS6.x的隨機端口都是較大的。
- 由於端口不固定,這樣一來就會形成NFS客戶端與NFS服務端的通訊障礙,由於NFS客戶端必需要知道NFS服務端的數據傳輸端口才能進行通訊,才能交互數據。
- 要解決上面的困擾,就須要經過遠程過程調用RPC服務來幫忙了,NFS的RPC服務最主要的功能就是記錄每一個NFS功能所對應的端口號,而且在NFS客戶端請求時將該端口和功能對應的信息傳遞給請求數據的NFS客戶端,從而確保客戶端能夠鏈接到正確的NFS端口上去,達到實現數據傳輸交互數據目的。這個RPC服務相似NFS服務端和NFS客戶端之間的一箇中介。
- 就拿房屋中介打個比喻吧:假設咱們要找房子,這裏的咱們就至關於NFS客戶端,中介介紹房子,中介就至關於RPC服務,房子全部者房東就至關於NFS服務,租房的人找房子,就要找中介,中介要預先存有房子主人房東的信息,才能將房源信息告訴租房的人。
- 那麼RPC服務又是如何知道每一個NFS的端口呢?
- 這是由於,當NFS服務端啓動服務時會隨機取用若干端口,並主動向RPC服務註冊取用的相關端口及功能信息,如此一來,RPC服務就知道NFS每一個端口對應的NFS功能了,而後RPC服務使用固定的111端口來監聽NFS客戶端提交的請求,並將正確的NFS端口信息回覆給請求的NFS客戶端,這樣一來,NFS客戶端就能夠與NFS服務端進行數據傳輸了。
- 在啓動NFS SERVER以前,首先要啓動RPC服務(CentOS5.x下爲portmap服務,CentOS6.x下爲rpcbind服務,下同),不然NFS SERVER就沒法向RPC服務註冊了。另外,若是RPC服務從新啓動,原來已經註冊好的NFS端口數據就會丟失,所以,此時RPC服務管理的NFS程序也須要從新啓動以從新向RPC註冊。要特別注意的是,通常修改NFS配置文件後,是不須要重啓NFS的,直接在命令行執行/etc/init.d/nfs reload或exportfs -rv便可使修改的/etc/exports生效。
1.2.3 NFS的工做流程原理
當訪問程序經過NFS客戶端向NFS服務端存取文件時,其請求數據流程大體以下:
1)首先用戶訪問網站程序,由程序在NFS客戶端上發出存取NFS文件的請求,這時NFS客戶端(即執行程序的服務器)的RPC服務(rpcbind服務)就會經過網絡向NFS服務器端的RPC服務(rpcbind服務)的111端口發出NFS文件存取功能的詢問請求。
2)NFS服務端的RPC服務(rpcbind服務)找到對應的已註冊的NFS端口後,通知NFS客戶端的RPC服務(rpcbind服務)
3)此時NFS客戶端獲取到正確的端口,並與NFS daemon聯機存取數據
4)NFS客戶端把數據存取成功後,返回給前端訪問程序,告知給用戶存取結果,做爲網站用戶,就完成了一次存取操做。
由於NFS的各項功能都須要向RPC服務(rpcbind服務)註冊,因此只有RPC服務(rpcbind服務)才能獲取到NFS服務的各項功能對應的端口號(port number),PID,NFS在主機所監聽的IP等信息,而NFS客戶端也只能經過向RPC服務(rpcbind服務)詢問才能找到正確的端口。也就是說,NFS須要有RPC服務(rpcbind服務)的協助才能成功對外提供服務。從上面的描述,咱們不難推斷,不管是NFS客戶端仍是NFS服務器端,當要使用NFS時,都須要首先啓動RPC服務(rpcbind服務),NFS服務必須在RPC服務啓動以後啓動,客戶端無需啓動NFS服務,但須要啓動RPC服務。
注意:
NFS的RPC服務,在CentOS5.X下名稱爲portmap,在CentOS6.x下名稱爲rpcbind
1.3 NFS服務端部署環境準備
1.3.1 NFS服務部署服務器準備
角色 | 主機名 | eth0(外網) | eth1(內網) |
---|---|---|---|
C1-NFS服務器端 | nfs01 | 10.0.0.31 | 172.16.1.31 |
C2-Rsync存儲服務器 | backup | 10.0.0.41 | 172.16.1.41 |
B2-nginx web服務器 | web01 | 10.0.0.8 | 172.16.1.8 |
1.3.2 修改主機名及標籤
hostname web01 sed -i 's#chensiqi#web01#g' /etc/sysconfig/network
1.3.3 必須的優化(統一使用模版機進行克隆)
從第二階段開始教學筆記中出現的服務器配置沒有意外的狀況下,它的IP等相關信息都是統一的,第二階段的教學當中一共大概會出現8-10臺必須的服務器(搭建不一樣的業務),最終這些服務器就組成了咱們第二階段最後的考試內容,10臺規模的基礎核心架構集羣。
所以,咱們在克隆虛擬機的時候,要統一克隆模版,所以建議你們,準備一個虛擬機的模版機,只作克隆用。模版機的相關優化及克隆準備工做,請參看http://www.cnblogs.com/chensiqiqi/p/6228006.html實戰教學筆記的第六節
1.4 NFS server端的設置
1.4.1 NFS軟件列表
要部署NFS服務,須要安裝下面的軟件包:
- [x] nfs-utils:
NFS服務的主程序,包括rpc.nfsd,rpc.mountd這兩個daemons和相關文檔說明,以及執行命令文件等。 - [x] rpcbind:
CentOS6.X下面RPC的主程序。NFS能夠視爲一個RPC程序,在啓動任何一個RPC程序以前,須要作好端口和功能的對應映射工做,這個映射工做就是由rpcbind服務來完成的。所以,在提供NFS服務以前必須先啓動rpcbind服務才行。
注意:
有關RPC協議知識這裏你們沒必要細究,詳細說明可見本章結尾命令部分。
1.4.2 查看NFS軟件包
可以使用以下命令查看默認狀況下CentOS6.x裏NFS軟件的安裝狀況。
rpm -qa nfs-utils rpcbind
當不知道軟件名字時候,能夠用rpm -qa | grep -E "nfs-|rpcbind"
來過濾包含在引號內的字符串。grep -E這裏至關於egrep。grep,egrep這兩個命令在運維工做中很是經常使用而且很好用。CentOS6.8默認沒有安裝NFS軟件包,可使用yum -y install nfs-utils rpcbind
命令來安裝NFS軟件。
root@nfs01 ~]# yum -y install nfs-utils rpcbind ...忽略軟件顯示信息... [root@nfs01 ~]# rpm -qa nfs-utils rpcbind nfs-utils-1.2.3-70.el6_8.2.x86_64 rpcbind-0.2.0-12.el6.x86_64
若是出現rpcbind和nfs-utils開頭的兩個軟件包,表示NFS服務端軟件安裝完畢
1.4.3 啓動NFS相關服務
查看某個命令屬於已經安裝的哪一個rpm包
[root@nfs01 backup]# which rpcinfo #查詢命令絕對路徑 /usr/sbin/rpcinfo [root@nfs01 backup]# rpm -qf /usr/sbin/rpcinfo #查詢某個命令屬於已經安裝的哪一個rpm包 rpcbind-0.2.0-12.el6.x86_64 [root@nfs01 backup]# rpm -qf `which showmount` nfs-utils-1.2.3-70.el6_8.2.x86_64
1.4.1.1 啓動rpcbind
由於NFS及其輔助程序都是基於RPC(remote Procedure Call)協議的(使用的端口爲111),因此首先要確保系統中運行了rpcbind服務。啓動的實際操做以下:
[root@nfs01 backup]# /etc/init.d/rpcbind status #檢查rpcbind服務狀態 rpcbind 已停 [root@nfs01 backup]# /etc/init.d/rpcbind start #啓動rpcbind服務 正在啓動 rpcbind: [肯定] [root@nfs01 backup]# rpcinfo -p localhost #查看NFS服務向rpc服務註冊的端口信息,由於NFS尚未啓動,所以,沒有太多註冊的端口影射信息。 program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper #提示:111端口爲rpcbind服務對外提供服務的主端口
1.4.3.2 啓動NFS服務
[root@nfs01 backup]# /etc/init.d/nfs start #啓動nfs服務 啓動 NFS 服務: [肯定] 關掉 NFS 配額: [肯定] 啓動 NFS mountd: [肯定] 啓動 NFS 守護進程: [肯定] Starting RPC idmapd: [ OK ]
特別提示:
若是不啓動rpcbind服務直接啓動nfs服務的會啓動時失敗。
1.4.3.3 NFS服務常見進程詳細說明
從上面NFS服務啓動過程能夠看出,運行NFS服務默認須要啓動的服務或進程至少有:NFS quotas(rpc.rquotad),NFS daemon(nfsd),NFS mountd(rpc.mountd)。能夠經過執行以下命令查看啓動NFS後,系統中運行的NFS相關進程:
[root@nfs01 ~]# ps -ef | egrep "rpc|nfs" root 2179 2 0 07:38 ? 00:00:00 [rpciod/0] rpc 2560 1 0 07:42 ? 00:00:00 rpcbind root 2605 1 0 07:42 ? 00:00:00 rpc.rquotad #磁盤配額進程(remote quota server) root 2610 1 0 07:42 ? 00:00:00 rpc.mountd #權限管理驗證等(NFS mount daemon) root 2617 2 0 07:42 ? 00:00:00 [nfsd4] root 2618 2 0 07:42 ? 00:00:00 [nfsd4_callbacks] root 2619 2 0 07:42 ? 00:00:00 [nfsd] #nfs主進程 root 2620 2 0 07:42 ? 00:00:00 [nfsd] #nfs主進程 root 2621 2 0 07:42 ? 00:00:00 [nfsd] #nfs主進程 root 2622 2 0 07:42 ? 00:00:00 [nfsd] #nfs主進程 root 2623 2 0 07:42 ? 00:00:00 [nfsd] #nfs主進程 root 2624 2 0 07:42 ? 00:00:00 [nfsd] #nfs主進程 root 2625 2 0 07:42 ? 00:00:00 [nfsd] #nfs主進程 root 2626 2 0 07:42 ? 00:00:00 [nfsd] #nfs主進程 root 2657 1 0 07:42 ? 00:00:00 rpc.idmapd #name mapping daemon root 2728 1525 0 08:06 pts/0 00:00:00 egrep rpc|nfs
NFS服務的主要任務是共享文件系統數據,而文件系統數據的共享離不開權限問題。因此NFS服務器啓動時最少須要兩個不一樣的進程,一個是管理NFS客戶端是否可以登入的rpc.nfsd主進程,另外一個用於管理NFS客戶端是否可以取得對應權限的rpc.mountd進程。若是還須要管理磁盤配額,則NFS還要再加載rpc.rquotad進程。
服務或進程名 | 用途說明 |
---|---|
nfsd(rpc.nfsd) | rpc.nfsd主要功能是管理NFS客戶端是否可以登入NFS服務端主機,其中還包含登入者的ID判別等 |
mountd(rpc.mountd) | rpc.mountd的主要功能則是管理NFS文件系統。當NFS客戶端順利經過rpc.nfsd登入NFS服務端主機時,在使用NFS服務器提供數據以前,它會去讀NFS的配置文件/etc/exports來比對NFS客戶端的權限,經過這一關以後,還會通過NFS服務端本地文件系統使用權限(就是owner,group,other權限)的認證程序。若是都經過了,NFS客戶端就能夠取得使用NFS服務器端文件的權限。注意,這個/etc/exports文件也是咱們用來管理NFS共享目錄的使用權限與安全設置的地方,特別強調,NFS自己設置的是網絡共享權限,整個共享目錄的權限還和目錄自身系統權限有關 |
rpc.lockd(非必需) | 可用來鎖定文件,用於多客戶端同時寫入 |
1.4.3.4 配置NFS服務端服務開機自啓動
[root@nfs01 ~]# chkconfig rpcbind on [root@nfs01 ~]# chkconfig nfs on [root@nfs01 ~]# chkconfig --list rpcbind rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@nfs01 ~]# chkconfig --list nfs nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
特別說明:
在不少大企業裏,大都是統一按照運維規範將服務的啓動命令放到/etc/rc.local文件裏的,而不是用chkconfig管理的。把/etc/rc.local文件做爲本機的重要服務檔案文件,全部服務的開機自啓動都必須放入/etc/rc.local。這樣規範的好處是,一旦管理此服務器的人員離職,或者業務遷移均可以經過/etc/rc.local很容易的查看到服務器對應的相關服務,能夠方便的運維管理。下面是把啓動命令放入到/etc/rc.local文件中的配置信息,注意別忘了加上啓動服務的註釋。
[root@nfs01 ~]# tail -3 /etc/rc.local #start up nfs service by chensiqi at 20170309 /etc/init.d/rpcbind start /etc/init.d/nfs start
1.5 實戰配置NFS服務端
1.5.1 NFS服務端配置文件路徑
NFS服務的默認配置文件路徑爲:/etc/exports,而且默認是空的。
[root@nfs01 ~]# ls -l /etc/exports -rw-r--r--. 1 root root 0 1月 12 2010 /etc/exports [root@nfs01 ~]# cat /etc/exports
提示:
NFS默認配置文件/etc/exports實際上是存在的,可是沒有內容,須要用戶自行配置。
1.5.2 exports配置文件格式
/etc/exports文件位置格式爲:
NFS共享的目錄 NFS客戶端地址1(參1,參2...)客戶端地址2(參1,參2...)
NFS共享的目錄 NFS客戶端地址(參1,參2...)
查看exports語法文件格式幫助的方法爲:
執行man exports命令,而後切換到文件結尾,能夠快速看以下樣例格式:
[root@nfs01 ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync) 命令說明: /data :nfs的共享目錄路徑 172.16.1.0/24:容許掛載個人共享目錄的IP地址段 (rw):可讀可寫 (sync):實時同步
修改配置文件之後,必須重啓nfs服務
[root@nfs01 ~]# /etc/init.d/nfs reload [root@nfs01 ~]# showmount -e #查看生效的nfs配置文件規則 Export list for nfs01: /data 172.16.1.0/24
1.5.3 給共享目錄更改屬主屬組爲nfsnobady
[root@nfs01 ~]# grep nfs /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin [root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data [root@nfs01 ~]# ll -d /data drwxr-xr-x. 2 nfsnobody nfsnobody 4096 3月 9 09:43 /data
特別提示:
若是不受權屬主屬組,那麼共享目錄掛載之後將不遵循配置文件exports的設定好的讀寫規則。雖然也能正常掛載,可是會致使寫入文件時提示沒有權限。
[root@nfs01 ~]# touch /mnt/a touch: 沒法建立"/data/a": 權限不夠
1.5.4 進行本地掛載測試
[root@nfs01 ~]# mount 172.16.1.31:/data /mnt
提示:
沒有報錯就說明掛載成功了。
1.5.5 進行文件寫入測試
[root@nfs01 ~]# ls /data #查看目錄 [root@nfs01 ~]# ls /mnt #查看目錄 [root@nfs01 ~]# touch /data/a #在data目錄建立文件a [root@nfs01 ~]# ls /data #data共享目錄有a a [root@nfs01 ~]# ls /mnt #mnt掛載目錄也有a a [root@nfs01 ~]# touch /mnt/b #在mnt目錄建立文件b [root@nfs01 ~]# ls /data #data共享目錄有b a b [root@nfs01 ~]# ls /mnt #mnt掛載目錄也有b a b
提示:
當配置文件exports裏設定了(rw,rsync)後,表示目錄可讀寫,而且是實時同步的。也就是說,在其中任意一個掛載目錄裏改變了裏面的內容信息,那麼全部掛載目錄包含源共享目錄的內容信息同步改變。
至此NFS服務器端配置完畢
1.6 實戰配置NFS客戶端配置過程-web01
1.6.1 回顧總體流程
1.6.2 客戶端必須安裝nfs-utils軟件
[root@web01 ~]# yum -y install nfs-utils
提示:不安裝則不能掛載nfs共享目錄
1.6.3 檢查遠端showmount
[root@web01 ~]# showmount -e 172.16.1.31 Export list for 172.16.1.31: /data 172.16.1.0/24
1.6.4 客戶端掛載
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt
提示:-t nfs 能夠省略
1.6.5 進行文件讀寫及同步測試
[root@web01 ~]# ls /mnt a b [root@web01 ~]# touch /mnt/chensiqi #建立文件 [root@web01 ~]# ls /mnt a b chensiqi [root@web01 ~]# ssh root@172.16.1.31 "ls /data" #遠程看一下nfs服務器端共享目錄 root@172.16.1.31's password: a b chensiqi
1.6.6 配置開機自動掛載nfs共享目錄(/etc/fstab)
配置客戶端mount掛載命令使掛載開機自動執行,這裏有兩種方法,以下:
第一種方法:將掛載命令放在/etc/rc.local裏
缺點:偶爾開機掛載不上,工做中除了開機自啓動配置,還要對是否掛載作監控
echo "mount -t nfs 172.16.1.31:/data /mnt"
第二種方法,將掛載命令放在/etc/fstab裏
[root@web01 ~]# tail -1 /etc/fstab 172.16.1.31:/data /mnt nfs defaults 0 0
其實所謂配置方法,這裏有一個誤區,以下:
- fstab會優先於網絡被Linux系統加載。網絡沒啓動時執行fstab會致使連不上NFS服務器端,沒法實現開機掛載。並且,即便是本地的文件系統,也要注意,fstab最後兩列要設置0 0.不然有可能致使沒法啓動服務器的問題。
- 所以,nfs網絡文件系統最好不要放到fstab裏實現開機掛載。
- 可是,若是是在開機自啓動服務裏設置並啓動了netfs服務,放入fstab裏也是能夠開機掛載的。
例如:
[root@web01 ~]# chkconfig --list netfs netfs 0:關閉 1:關閉 2:關閉 3:關閉 4:關閉 5:關閉 6:關閉 [root@web01 ~]# chkconfig netfs on [root@web01 ~]# chkconfig --list netfs netfs 0:關閉 1:關閉 2:啓用 3:啓用 4:啓用 5:啓用 6:關閉
如此一來,咱們也能夠經過fstab進行開機掛載了nfs網絡文件系統了。同窗們能夠自行仿照測試。
至此NFS客戶端配置完畢
1.7 NFS配置權限設置經常使用參數說明
rw | Read-write,表示可讀寫權限 |
---|---|
ro | Read-only,表示只讀權限 |
sync | (同步,實時)請求或吸入數據時,數據同步寫入到NFS Server的硬盤後才返回 |
async | (異步)寫入時數據會先寫到內存緩衝區,只到硬盤有空檔纔會寫入磁盤,這樣能夠提高寫入速率!風險爲若服務器掛掉或不正常關機,會損失緩衝區中未寫入磁盤的數據 |
no_root_squash | 訪問NFS Server共享目錄的用戶若是是root,它對該共享目錄具備root權限。 |
root_squash | 若是訪問目錄的是root,則它的權限將被壓縮成匿名用戶。 |
all_squash | 無論訪問共享目錄的用戶身份如何,它的權限都被壓縮成匿名用戶。 |
anonuid | 指定共享文件夾裏文件全部者的uid號:例如:(rw,squash,anonuid=12306,anongid=12306) |
anongid | 指定共享文件夾裏文件全部者的gid號:例如:(rw,squash,anonuid=12306,anongid=12306) |
1.8 NFS服務企業案例配置實踐
實例一:
共享/data 目錄給10.0.0.0/24整個網段可讀可寫。
實例二:
nfs服務器:172.16.1.31
共享下面兩個目錄:
/app/w :要求可讀可寫,同步數據,全部用戶壓縮爲匿名用戶
/app/r:要求只讀,同步數據,全部用戶都壓縮爲匿名用戶
客戶端上面的要求:
backup服務器,把nfs服務器的/app/r掛載到/data/r
web01服務器,把nfs服務器的/app/w掛載到/data/w
1.9 exports配置文件相關參數的說明
exports配置文件的相關參數,摘自man exports:
EXAMPLE # sample /etc/exports file / master(rw) trusty(rw,no_root_squash) /projects proj*.local.domain(rw) /usr *.local.domain(ro) @trusted(rw) /home/joe pc001(rw,all_squash,anonuid=150,anongid=100) /pub *(ro,insecure,all_squash)
上述各個列的參數含義以下:
- [x] :NFS共享的目錄:爲NFS服務端要共享的實際目錄,要用絕對路徑,如(/data)。注意共享目錄的本地權限,若是須要讀寫共享,必定要讓本地目錄能夠被NFS客戶端的用戶(nfsnobody)讀寫。
- [x] :NFS客戶端地址:爲NFS服務端受權的可訪問共享目錄的NFS客戶端地址,能夠爲單獨的IP地址或主機名,域名等,也能夠爲整個網段地址,還能夠用「*」來匹配全部客戶端服務器,這裏所謂的客戶端通常來講是前端的業務服務器,例如:Web服務。
- [x] :權限參數集:對受權的NFS客戶端的訪問權限設置。參數具體說明見後文。
- nfs權限(共享權限)
- 本地文件系統權限,掛載目錄的權限
客戶端地址 | 具體地址 | 說明 |
---|---|---|
受權單一客戶端訪問NFS | 10.0.0.30 | 通常狀況,生產環境中此配置很少 |
受權整個網段可訪問NFS | 10.0.0.0/24 | 其中的24等同於255.255.255.0,指定網段生產環境中常見的配置。配置簡單,維護方便 |
受權整個網段可訪問NFS | 10.0.0.* | 指定網段的另外寫法(不推薦使用) |
受權某個域名客戶端訪問 | nfs.chensiqiedu.com | 此方法生產環境中通常不經常使用 |
受權整個餘名客戶端訪問 | *.chensiqiedu.com | 此方法生產環境中通常不經常使用 |
1.10 exports配置文件相關參數應用領域的詳細解釋 (NFS精華重點)
1)(rw,sync) :可讀可寫,同步傳輸
2)(ro,async):只讀,異步傳輸。
詳細說明:
rw或者ro,主要控制的是全部客戶端用戶(包含root)的讀寫權限。若是設置成ro,就算root也只有讀權限。它是NFS權限設置的第一道總閘閥門。
sync:同步傳輸,實時進行。
async:異步傳輸:攢一會在傳輸。
3)root_squash:將root帳戶在共享目錄裏的身份下降爲匿名者(默認nfsnobody)身份
4)no_root_squash:不下降root帳戶在共享目錄的身份,身份仍是root
5)all_squash:將全部訪問用戶在共享目錄裏的身份都下降爲匿名者(默認nfsnobody)身份
詳細說明:
- 匿名者身份默認狀況下就是NFS服務器端的虛擬帳戶角色,也就是nfsnobody。這是最低的身份,全部NFS客戶端共享目錄的訪問者都被附加了這個身份,這也就意味者,若是文件的屬主屬組是nfsnobody的話,全部訪問者對該文件都擁有所有全部權。
- 所謂身份並非訪問權限,而是用戶在共享目錄裏建立的文件的屬主和屬組。
- 一旦身份被下降那麼在共享目錄裏建立的文件的屬主和屬組就是變成了默認狀況下的nfsnobody。這也就意味着,權限系統對你所建立的文件不作任何保護(任何訪問者均可以查看,修改,刪除)
- [x] 所謂root_squash:
- 使用這個參數意味着root在共享目錄裏建立的任何文件都不受保護,任何人(全部用戶)均可以讀取,修改,刪除)。
- 而非root用戶則不下降權限,在共享目錄裏建立的文件的屬主和屬組統一爲nobody(身份隱藏了),這種狀況下,全部普通用戶之間只能互相查看文件,並不能任意修改和刪除而且你還沒法知道是誰建立的文件,每一個普通用戶只能修改或刪除本身建立的文件。
- root用戶雖然被下降了身份,可是並無下降他的管理者權限,也就是說它仍舊能對全部共享目錄裏的全部文件進行查看,修改,刪除操做。
- 若是這類參數默認爲空的話,那麼NFS將默認使用這個參數。
- [x] 所謂no_root_squash:
- 使用這個參數意味着不對root進行下降身份的操做,也就是說root在共享目錄裏建立的文件的屬主屬組仍舊爲root(不能被普通用戶修改和刪除)。
- 非root用戶同root_squash同樣,並不下降權限。
- [x] 所謂all_squash:
- 使用這個參數意味着對全部訪問NFS共享目錄的用戶進行下降身份的操做。也就是說,全部用戶只要在共享目錄裏建立文件,那麼文件的屬主屬組就是默認狀況下的nfsnobody。
- 在這個模式下,任何nfs客戶端的任何訪問用戶均可以對共享目錄裏的任何文件進行查看,修改,刪除操做
6)anonuid和anongid:指定NFS虛擬帳戶的uid或gid
- 這兩個參數主要用來修改NFS默認的虛擬帳戶nfsnobody。能夠經過指定虛擬帳戶的uid和gid的方式修改默認的虛擬帳戶的帳戶名稱和所屬組。
第二章 NFS企業級優化
2.1 NFS配置文件優化
1)NFS客戶端掛載後,往共享目錄寫入數據時卡住了
2)NFS服務端,重啓restart服務,客戶端若是寫入數據卡住了。
解答:
1,nfs服務端重啓以後,共享文件夾進入grace time(無敵時間)
2,客戶端在服務端重啓後寫入數據大概要等90秒
3,nfs配置文件:/etc/sysconfig/nfs
[root@backup ~]# sed -n '45,55p' /etc/sysconfig/nfs
# When there are no active clients, changing these values # can be done in a single server restart. # #NFSD_V4_GRACE=90 # 無敵時間 #NFSD_V4_LEASE=90 # 無敵時間 #NLM_GRACE_PERIOD=90 # 無敵時間 # # # # Optional arguments passed to rpc.mountd. See rpc.mountd(8) #RPCMOUNTDOPTS="" #說明: NFSD_V4_GRACE=90 <===>/proc/fs/nfsd/nfsv4gracetime NFSD_V4_LEASE=90 <===>/proc/fs/nfsd/nfsv4leasetime NLM_GRACE_PERIOD=90 <===>/proc/fs/nfsd/nfsv4recoverydir 這三條是控制無敵時間的,去掉#直接修改時間便可,改後別忘了重啓服務。一旦啓用了這三條,/proc臨時目錄下便會生成對應的臨時文件
2.2 NFS客戶端mount掛載深刻
在NFS服務端能夠經過cat /var/lib/nfs/etab 查看服務端配置參數的細節。在NFS客戶端能夠經過cat /proc/mounts查看mount的掛載參數細節。
2.2.1 mount掛載說明
經過以下命令在NFS客戶端測試掛載獲取的默認掛載參數:
[root@backup ~]# grep mnt /proc/mounts nfs01:/data/ /mnt nfs4 rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.41,minorversion=0,local_lock=none,addr=172.16.1.31 0 0
NFS Client mount 掛載參數列表
mount參數 | 參數功能 | 默認參數 |
---|---|---|
fg;bg | 當客戶端掛載時,能夠選擇前臺fg掛載或者後臺bg掛載,後臺掛載不影響前臺其餘操做,若是網絡不穩建議bg比較穩當 | fg |
soft;hard | soft短掛載,當timeout出現時可能會形成資料丟失,不建議使用 | hard |
intr | 當使用hard掛載的資源timeout後,如有指定intr參數,能夠在timeout後把它中斷掉,這避免出問題時系統整個被NFS鎖死,建議使用intr | 無 |
proto=udp | 使用UDP協議來傳輸資料,在LAN中會有比較好的性能。若要跨越Internet的話,使用pro=tcp多傳輸的數據會有比較好的糾錯能力 | proto=tcp |
mount -o參數對應的選項:
|參數|參數意義|系統默認值|
|suid;nosuid|當掛載的文件系統上有任何SUID的程序時,只要使用nosuid就可以取消設置SUID的功能。|suid|
|--|--|--|
|rw;ro|能夠指定文件系統是隻讀(ro)或可寫(rw)|rw|
|dev;nodev|是否能夠保留裝置文件的特殊功能?通常來講只有/dev纔會有特殊的裝置,所以能夠選擇nodev|dev|
|exec;noexec|是否具備執行文件的權限?若是想要掛載的僅是普通資源數據區(例如:圖片,附件),那麼能夠選擇noexec|exec|
|user;nouser|是否容許用戶進行文件的掛載與卸載功能?若是要保護文件系統,最好不要提供用戶進行掛載與卸載|nouser|
|auto;noauto|這個auto指的是「mount -a」時會不會被卸載的項目,若是不須要這個分區隨時被掛載,能夠設置爲noauto|auto|
2.3 NFS 客戶端mount掛載優化
某網友問:在企業生產環境中,NFS客戶端掛載有沒有必需要加的參數,好比,加noexec,nosuid,nodev,bg,soft,rsize,wsize等參數。
解答:
這個問題屬於mount掛載優化內容(有些參數也適合其餘文件系統),通常來講要適當加掛載參數,可是,最好是先作好測試,用數據來講話,才能更好的肯定究竟是掛載仍是不掛載。
2.3.1 有關係統安全掛載參數選項
在企業工做場景,通常來講,NFS服務器共享的只是普通靜態數據(圖片,附件,視頻),不須要執行suid,exec等權限,掛載的這個文件系統只能做爲數據存取之用,沒法執行程序,對於客戶端來說增長了安全性,例如:不少木馬篡改站點文件都是由上傳入口上傳的程序到存儲目錄,而後執行的。
所以在掛載的時候,用下面的命令頗有必要:
mount -t nfs -o nosuid,noexec,nodev,rw 172.16.1.31:/data /mnt
2.3.2 mount掛載性能優化參數選項
下面介紹幾個在企業生產環境下,NFS性能優化掛載的例子。
1)禁止更新目錄及文件時間戳掛載,命令以下:
mount -t nfs -o noatime,nodiratime 172.16.1.31:/data /mnt
2)安全加優化的掛載方式以下:
mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 172.16.1.31:/data /mnt
3)默認的掛載方式以下:
mount -t nfs 172.16.1.31:/data /mnt
若是是本地文件系統,使用以下命令:
mount /dev/sdb1 /mnt -o defaults,async,noatime,data=writeback,barrier=0
注意:
若是本地文件系統掛載時,若是加入nodiratime會報錯
2.3.3 NFS網絡文件系統優化掛載的參數建議
在CentOS6.5 6.6 6.8等服務器端和客戶端環境下,可以使用以下命令參數:
mount -t nfs -o noatime,nodiratime,nosuid,noexec,nodev,rsize=131072 172.16.1.31:/data /mnt
通過實際測試,CentOS6.6 6.8默認的掛載參數性能仍是不錯的。
mount -t nfs 172.16.1.31:/data /mnt
注意:非性能的參數越多,速度可能會變慢
2.3.4 NFS內核優化建議
下面是優化選項說明:
- [x] /proc/sys/net/core/rmem_default:該文件指定了接收套接字緩衝區大小的默認值(以字節爲單位),默認設置:124928 建議:8388608
- [x] /proc/sys/net/core/rmem_max:該文件指定了接收套接字緩衝區大小的最大值(以字節爲單位) 建議:16777216
- [x] /proc/sys/net/core/wmem_default:該文件指定了發送套接字緩衝區大小的默認值(以字節爲單位),默認設置:124928 建議:8388608
- [x] /proc/sys/net/core/wmem_max:該文件指定了發送套接字緩衝區大小的最大值(以字節爲單位)。默認設置:124928. 建議:16777216
2.4 NFS系統應用的優缺點說明
NFS服務可讓不一樣的客戶端掛載使用同一個共享目錄,也就是將其做爲共享存儲使用,這樣能夠保證不一樣節點客戶端數據的一致性,在集羣架構環境中常常會用到。若是是windows和Linux混合環境的集羣系統,能夠用samba來實現。
優勢:
- [x] 簡單,容易上手,容易掌握
- [x] NFS 文件系統內數據是在文件系統之上的,即數據是能看得見的。
- [x] 部署快速,維護簡單方便,且可控,知足需求的就是最好的。
- [x] 可靠,從軟件層面上看,數據可靠性高,經久耐用。數據是在文件系統之上的。
- [x] 服務很是穩定
侷限:
- [ ] 存在單點故障,若是NFS Server宕機了,全部客戶端都不能訪問共享目錄。這個須要負載均衡及高可用來彌補
- [ ] 在大數據高併發的場合,NFS效率,性能有限(2千萬/日如下PV(page view)的網站不是瓶頸,除非網站架構設計太差。)
- [ ] 客戶端認證是基於IP和主機名的,權限要根據ID識別,安全性通常(用於內網則問題不大)。
- [ ] NFS數據是明文的,NFS自己不對數據完整性作驗證。
- [ ] 多臺客戶機器掛載一個NFS服務器時,鏈接管理維護麻煩(耦合度高)。尤爲NFS服務端出問題後,全部NFS客戶端都處於掛掉狀態(測試環境可以使用autofs自動掛載解決,正式環境可修復NFS服務或強制卸載)
- [ ] 涉及了同步(實時等待)和異步(解耦)的概念,NFS服務端和客戶端相對來講就是耦合度有些高。網站程序也是同樣,儘可能不要耦合度過高,系統及程序架構師的重要職責就是爲程序及架構解耦,讓網站的擴展性變得更好。
應用建議:
大中小型網站(參考點2000萬/日PV如下)線上應用,都有用武之地。門戶站也會有應用,生產場景應該多把數據的訪問往前推,即儘可能把靜態存儲裏的資源經過CDN或緩存服務器提供服務,若是沒有緩存服務或架構很差,存儲服務器數量再多也是扛不住壓力的,並且用戶體驗會不好。
附錄1 【nfs掛載加入fstab案例】
NFS客戶端實現fstab開機自啓動掛載
現象:nfs開機掛載卸載了/etc/fstab中,結果沒法開機自動掛載nfs
解答:
1,nfs客戶對岸掛載命令放在/etc/rc.local實現自動掛載
2,開機自啓動netfs服務,而後才能實現fstab的開機自動掛載nfs文件系統(linux開機時在加載網絡以前就會加載/etc/fstab)
附錄2 fstab誤操做致使沒法開機
1,fstab文件被錯誤修改,致使在開機啓動linux時候出現錯誤,提示讓你恢復系統設置。
1)開機時出現錯誤提示
2)輸入root用戶密碼後,進入到用戶操做界面
3)打開vim /etc/fstab 文件,咱們發現fstab文件是隻讀的。也就是說目前只能看不能改。
4)退出/etc/fstab。在命令行輸入命令
mount -o remount,rw /
的意思是將整個根目錄已可讀可寫rw的方式從新掛載一邊remount
5)咱們再打開/etc/fstab 就會發現只讀模式沒了
6)趕忙修改fstab而後重啓服務器。
2,光盤救援模式恢復(用linux光盤修復系統)
1)調整開機bios設置光盤啓動,而後掛載光盤
2)重啓系統,進入光盤救援模式
3)一路回車,不加在網絡模式
4)一路回車,選擇第一個
進入這個頁面
5)輸入命令