1. 程式人生 > >Linux實戰教學筆記22:企業級NFS網路檔案共享服務

Linux實戰教學筆記22:企業級NFS網路檔案共享服務

目錄

第二十二節 企業級NFS網路檔案共享服務

標籤(空格分隔): Linux實戰教學筆記-陳思齊

---本教學筆記是本人學習和工作生涯中的摘記整理而成,此為初稿(尚有諸多不完善之處),為原創作品,允許轉載,轉載時請務必以超連結形式標明文章原始出處,作者資訊和本宣告。否則將追究法律責任。http://www.cnblogs.com/chensiqiqi/



第一章 NFS網路檔案共享服務

1.1 NFS介紹

1)什麼是NFS?

  • NFS是Network File System的縮寫,中文意思是網路檔案系統。它的主要功能是通過網路(一般是區域網)讓不同的主機系統之間可以共享檔案或目錄。NFS客戶端(一般為應用伺服器,例如web)可以通過掛載(mount)的方式將NFS伺服器端共享的資料目錄掛載到NFS客戶端本地系統中(就是某一個掛載點下)。從客戶端本地看,NFS伺服器端共享的目錄就好像是客戶端自己的磁碟分割槽或者目錄一樣,而實際上卻是遠端的NFS伺服器的目錄。

  • NFS網路檔案系統很像Windows系統的網路共享,安全功能,網路驅動器影射,這也和Linux系統裡的samba服務類似。只不過一般情況下,Windows網路共享服務或samba服務用於辦公區域網共享,而網際網路中小型網站叢集架構後端常用NFS進行資料共享。

2)NFS在企業中的應用場景

  • 在企業叢集架構的工作場景中,NFS網路檔案系統一般被用來儲存共享視訊,圖片,附件等靜態資原始檔,通常網站使用者上傳的檔案都會放到NFS共享裡,例如:BBS產品的圖片,附件,頭像(注意網站BBS程式不要放NFS共享裡),然後前端所有的節點訪問這些靜態資源時都會讀取NFS儲存上的資源。NFS是當前網際網路系統架構中最常用的資料儲存服務之一,前面說過,中小型網站公司應用頻率更高,大公司或門戶除了使用NFS外,還可能會使用更為複雜的分散式檔案系統,比如Moosefs(mfs),GlusterFS,FastDFS等

螢幕快照 2017-03-10 下午3.19.53.png-1755.8kB

  • 在企業生產叢集架構中,NFS作為所有前端Web服務的共享儲存,儲存的內容一般包括網站使用者上傳的圖片,附件,頭像等,注意,網站的程式程式碼不要放NFS共享裡,因為網站程式是開發運維人員統一發布的,不存在釋出延遲問題,直接批量釋出到Web節點提供訪問比共享到NFS裡訪問效率更高。

3)企業生產叢集為什麼需要共享儲存角色。

  • 這裡通過圖解給大家展示以下叢集架構需要共享儲存服務的理由。例如:A使用者上傳圖片到Web1伺服器,然後讓B使用者訪問這張圖片,結果B使用者訪問的請求分發到了Web2,因為Web2上沒有這張圖片,這就導致它無法看到A使用者上傳的圖片,如果此時有一個共享儲存,A使用者上傳圖片的請求無論是分發到Web1還是Web2上,最終都會儲存到共享儲存上,而在B使用者訪問圖片時,無論請求分發到Web1還是Web2上,最終也都會去共享儲存上找,這樣就可以訪問到需要的資源了。這個共享儲存的位置可以通過開源軟體和商業硬體實現,網際網路中小型叢集架構會用普通PC伺服器配置NFS網路檔案系統實現。
  • 當及叢集中沒有NFS共享儲存時,使用者訪問圖片的情況如下圖所示。

螢幕快照 2017-03-08 下午4.34.13.png-458.4kB

上圖是企業生產叢集沒有NFS共享儲存訪問的示意圖。下圖是企業生產叢集有NFS共享儲存的情況

螢幕快照 2017-03-08 下午4.44.29.png-566.8kB

  • 中小型網際網路企業一般不會買硬體儲存,因為太貴,大公司如果業務發展很快的話,可能會臨時買硬體儲存頂一下網站壓力,當網站併發繼續加大時,硬體儲存的擴充套件相對就會很費勁,且價格成幾何級數增加。例如:淘寶網就曾替換掉了很多硬體裝置,比如,用lvs+haproxy替換了netscaler負載均衡裝置,用FastDFS,TFS配合PC伺服器替換了netapp,emc等商業儲存裝置,去IOE正在成為網際網路公司的主流。

1.2 NFS系統原理介紹

1.2.1 NFS系統掛載結構圖解與介紹

下圖是企業工作中的NFS伺服器與客戶端掛載情況結構圖

螢幕快照 2017-03-08 下午4.54.39.png-543kB

  • 可以看到NFS伺服器端/video共享目錄掛載到了兩臺NFS客戶端上。在客戶端檢視時,NFS伺服器端的/video目錄就相當於客戶端本地的磁碟分割槽或目錄,幾乎感覺不到使用上的區別,根據NFS服務端授予的NFS共享許可權以及共享目錄的本地系統許可權,只要在指定的NFS客戶端操作掛載/v/video或者/video的目錄,就可以將資料輕鬆地存取到NFS伺服器端上的/video目錄中了。

客戶端掛載NFS後,本地掛載基本資訊顯示如下:

[[email protected] ~]# 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客戶端之間的一箇中介。

螢幕快照 2017-03-08 下午5.44.53.png-681.7kB

  • 就拿房屋中介打個比喻吧:假設我們要找房子,這裡的我們就相當於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的工作流程原理

螢幕快照 2017-03-08 下午5.57.43.png-448.3kB

螢幕快照 2017-03-08 下午6.00.27.png-807.6kB

當訪問程式通過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軟體。

[email protected] ~]# yum -y install nfs-utils rpcbind
...忽略軟體顯示資訊...
[[email protected] ~]# 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包

[[email protected] backup]# which rpcinfo #查詢命令絕對路徑
/usr/sbin/rpcinfo
[[email protected] backup]# rpm -qf /usr/sbin/rpcinfo #查詢某個命令屬於已經安裝的哪個rpm包
rpcbind-0.2.0-12.el6.x86_64
[[email protected] 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服務。啟動的實際操作如下:

[[email protected] backup]# /etc/init.d/rpcbind status #檢查rpcbind服務狀態
rpcbind 已停
[[email protected] backup]# /etc/init.d/rpcbind start #啟動rpcbind服務
正在啟動 rpcbind:                                         [確定]
[[email protected] 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服務

[[email protected] 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相關程序:

[[email protected] ~]# 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服務端服務開機自啟動

[[email protected] ~]# chkconfig rpcbind on
[[email protected] ~]# chkconfig nfs on
[[email protected] ~]# chkconfig --list rpcbind 
rpcbind         0:off   1:off   2:on    3:on    4:on    5:on    6:off
[[email protected] ~]# 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檔案中的配置資訊,注意別忘了加上啟動服務的註釋。

[[email protected] ~]# 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,並且預設是空的。

[[email protected] ~]# ls -l /etc/exports
-rw-r--r--. 1 root root 0 112 2010 /etc/exports
[[email protected] ~]# 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命令,然後切換到檔案結尾,可以快速看如下樣例格式:

[[email protected] ~]# cat /etc/exports 
/data   172.16.1.0/24(rw,sync)

命令說明:
/data :nfs的共享目錄路徑
172.16.1.024:允許掛載我的共享目錄的IP地址段
(rw):可讀可寫
(sync):實時同步

修改配置檔案以後,必須重啟nfs服務

[[email protected] ~]# /etc/init.d/nfs reload
[[email protected] ~]# showmount -e  #檢視生效的nfs配置檔案規則
Export list for nfs01:
/data 172.16.1.0/24

1.5.3 給共享目錄更改屬主屬組為nfsnobady

[[email protected] ~]# grep nfs /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[[email protected] ~]# chown -R nfsnobody.nfsnobody /data
[[email protected] ~]# ll -d /data
drwxr-xr-x. 2 nfsnobody nfsnobody 4096 39 09:43 /data

特別提示:
如果不授權屬主屬組,那麼共享目錄掛載以後將不遵循配置檔案exports的設定好的讀寫規則。雖然也能正常掛載,但是會導致寫入檔案時提示沒有許可權。

[[email protected] ~]# touch /mnt/a
touch: 無法建立"/data/a": 許可權不夠

1.5.4 進行本地掛載測試

[[email protected] ~]# mount 172.16.1.31:/data /mnt

提示:
沒有報錯就說明掛載成功了。

1.5.5 進行檔案寫入測試

[[email protected] ~]# ls /data    #檢視目錄
[[email protected] ~]# ls /mnt     #檢視目錄
[[email protected] ~]# touch /data/a   #在data目錄建立檔案a
[[email protected] ~]# ls /data        #data共享目錄有a
a
[[email protected] ~]# ls /mnt         #mnt掛載目錄也有a
a
[[email protected] ~]# touch /mnt/b    #在mnt目錄建立檔案b
[[email protected] ~]# ls /data        #data共享目錄有b
a  b
[[email protected] ~]# ls /mnt         #mnt掛載目錄也有b
a  b

提示:
當配置檔案exports裡設定了(rw,rsync)後,表示目錄可讀寫,並且是實時同步的。也就是說,在其中任意一個掛載目錄裡改變了裡面的內容資訊,那麼所有掛載目錄包含源共享目錄的內容資訊同步改變。

至此NFS伺服器端配置完畢

1.6 實戰配置NFS客戶端配置過程-web01

1.6.1 回顧整體流程

螢幕快照 2017-03-09 上午11.23.52.png-640.6kB

1.6.2 客戶端必須安裝nfs-utils軟體

[[email protected] ~]# yum -y install nfs-utils

提示:不安裝則不能掛載nfs共享目錄

1.6.3 檢查遠端showmount

[[email protected] ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24

1.6.4 客戶端掛載

[[email protected] ~]# mount -t nfs 172.16.1.31:/data /mnt 

提示:-t nfs 可以省略

1.6.5 進行檔案讀寫及同步測試

[[email protected]1 ~]# ls /mnt
a  b
[[email protected] ~]# touch /mnt/chensiqi  #建立檔案
[[email protected] ~]# ls /mnt
a  b  chensiqi
[[email protected] ~]# ssh [email protected] "ls /data" #遠端看一下nfs伺服器端共享目錄
[email protected]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裡

[[email protected] ~]# 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裡也是可以開機掛載的。

例如:

[[email protected] ~]# chkconfig --list netfs
netfs           0:關閉    1:關閉    2:關閉    3:關閉    4:關閉    5:關閉    6:關閉
[[email protected] ~]# chkconfig netfs on
[[email protected] ~]# 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

[[email protected] ~]# 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客戶端測試掛載獲取的預設掛載引數:

[[email protected]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