1、NFS服務介紹

????????? 1.1 什么是NFS?

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

??????? NFS網絡文件系統很想windows系統的網絡共享、安全功能、網絡驅動器映射,這也和linux系統里的samba服務類似。只不過一般情況,windows網絡共享服務或者samaba服務于辦公局域網共享。互聯網中小網站架構后端常用NFS作為數據共享,如果是大型網站,那么可能還會用到更復雜的分布式文件系統,例如:Moosefs(mfs)、glusterfs,FastDFS。

1.2NFS應用場景

???????? 在企業集群架構的工作場景,NFS網絡文件系統一般用來存儲共享視頻、圖片、附件等靜態資源文件,一般是把網絡用戶上傳的文件都放在NFS共享里,例如:BBS產品的圖片、附件、頭像,注意網站BBS程序不要放在NFS共享里,然后前端所有的節點訪問這些靜態資源時都會讀取NFS存儲上的資源。NFS是當前互聯網架構中最常見的數據存儲服務之一,特別是中小網站公司應用頻率最高。大公司或者門戶除了使用NFS外,還可能會使用更復雜的分布文件系統Moosefs(mfs),glusterfs,FastDFS等。

1.3架構圖


????????????? clip_image002

1.4 企業生產集群為什么需要共享存儲角色

??????? 這里通過圖解給大家集群架構需要共享存儲服務的理由:例如:A用戶傳圖片到Web1服務器,然后讓B用戶訪問這張圖片,結果B用戶訪問的請求分發到了Web2,因為Web2上沒有這張圖片,結果無法看到A用戶上傳的圖片,如果此時有一個共享存儲,A用戶上傳圖片無論發到Web1還是Web2上,最終都存儲到共享存儲上,此時B用戶訪問圖片時,無論分發到Web1,還時Web2上,最終也都會去貢獻存儲上去訪問,這樣就可以訪問到資源了。這個共享存儲的位置可以通過開源軟件和商業硬件實現,互聯網中小型集群架構會用普通PC服務器和NFS文件系統實現。

當沒有NFS共享存儲,用戶訪問圖片的情況:

??????????? clip_image004

??????????? 有NFS共享存儲,用戶訪圖片的情況

?????????? clip_image006

2、 NFS系統原理介紹:

2.1 NFS原理圖

???????????? clip_image008

2.2 RPC服務

???????? NFS本身的服務沒有提供文件傳輸的協議,但是NFS卻能讓我們進行文件的共享,其中的原因是NFS使用RPC協議。所以用到NFS的地方都需要啟動RPC服務,不論是服務器端還是客戶端,NFS和RPC的關系我們可以用下邊這張圖來理解。

????????? clip_image010

3 、NFS部署環境準備

3.1 NFS服務部署服務器準備

??????????? clip_image012

3.2 檢查模擬環境

[root@nfs-server ~]# cat /etc/redhat-release

CentOS release 6.6 (Final)

[root@nfs-server nfs]# uname -r

2.6.32-504.el6.x86_64

[root@nfs-server nfs]# uname -i

x86_64

3.3 修改服務器端客戶端名字等信息

??? 3.3.1 nfs服務器端

?????????? [root@root ~]# hostname nfs-server

?????????? [root@root ~]# cat /etc/sysconfig/network

?????????? NETWORKING=yes????????????????????????????????????????

?????????? HOSTNAME=nfs-server????

?????????? [root@root ~]# cat /etc/hosts

?????????? 192.168.196.130 nfs-server

??? 3.3.2 nfs客戶端

????????? [root@lroot ~]# hostname lamp01

????????? [root@root ~]# cat /etc/sysconfig/network

????????? NETWORKING=yes

????????? HOSTNAME=lamp01

????????? [root@root ~]# cat /etc/hosts

???????? 192.168.196.131 lamp01

????????? [root@lroot ~]# hostname lamp02

????????? [root@root ~]# cat /etc/sysconfig/network

????????? NETWORKING=yes

????????? HOSTNAME=lamp02

????????? [root@root ~]# cat /etc/hosts

????????? 192.168.196.128 lamp02

4、 NFS SERVER端配置

4.1 NFS軟件列表

要部署NFS服務,需要安裝下面的軟件包:


    • nfs-utils:NFS服務的主程序

    • nfs-utils-lib :NFS以來的庫

    • rpcbind:Centos6.X下面RPC的主程序(CentOs5.X下面為portmap)

4.2 檢查軟件是否安裝

??????? [root@nfs-server ~]# rpm -qa nfs-utils rpcbind

4.3 安裝軟件:

?????? [root@nfs-server ~]# yum install nfs-utils rpcbind

4.4 配置rpcbind

????? 我們配置NFS服務器的時候需要先配置好rpcbind,并且啟動時候也要先啟動rpcbind

?????? 4.4.1 查看nfs-ser的運行狀態(rpcbind)

???????????? [root@nfs-server ~]# /etc/init.d/rpcbind status

?????? 4.4.2 啟動rpcbind程序

??????????? [root@nfs-server ~]# /etc/init.d/rpcbind restart

????? 4.4.3 將啟動命令放置到/etc/rc.local開機啟動腳本中

????? 4.4.4 檢查開機自啟動(rpcbind)

?????????? [root@nfs-server ~]# chkconfig --list rpcbind

?????????? rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off

clip_image014

????? 4.4.5 設置開機自啟動

????????? [root@nfs-server ~]# chkconfig rpcbind on

???? 4.4.6 檢查rpcbind是否運行

????????? [root@nfs-server ~]# /etc/init.d/rpcbind status

4.5 配置nfs主程序

????? 4.5.1 查看nfs運行狀態

?????????? [root@nfs-server ~]# /etc/init.d/nfs status

????? 4.5.2 啟動nfs主程序

????????? [root@nfs-server ~]# /etc/init.d/rpcbind restart

注意:要保證rpcbind比nfs先啟動,這里我們需要知道通過

[root@nfs-server ~]# less /etc/init.d/nfs和[root@nfs-server ~]# less /etc/init.d/rpcbind可以發現,就可以確定開機啟動過程中他們啟動的順序。

???? 4.5.3 將啟動命令放置到/etc/rc.local開機啟動腳本中

???? 4.5.4 檢查開機自啟動(nfs)

?????????? [root@nfs-server ~]# chkconfig --list nfs

?????????? nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:of

???? 4.5.5 設置開機自啟動

????????? [root@nfs-server ~]# chkconfig nfs on

???? 4.5.6 檢查nfs是否運行

????????? [root@nfs-server ~]# /etc/init.d/nfs status

4.6 檢查輸出rpc信息

????????? [root@nfs-server ~]# rpcinfo -p

4.7 配置NFS配置文件

????? 4.7.1 NFS服務配置文件

????????? NFS服務的默認配置文件路徑為:/etc/exports,并且默認是空的。

?????????? [root@nfs-server ~]# ll /etc/exports

?????????? -rw-r--r--. 1 root root 0 Jan 12 2010 /etc/exports

4.8 配置文件格式

???? 4.8.1 書寫格式有兩種


    • NFS共享的目錄 NFS客戶端地址1(參數1,參數2……) 客戶端地址2(參數1,參數2……)

    • NFS共享的目錄 ?NFS客戶端地址(參數1,參數2……)

??? 4.8.2 我們可以通過man exports查看幫助,man手冊中有舉例

???????????? [root@nfs-server ~]# man exports

????? clip_image016

???? 這里給出一種配置文件舉例

????? clip_image018

4.9 格式參數說明:

????? 4.9.1 NFS共享的目錄即就是NFS——SERVER端要共享的目錄,這里是用data舉例(首先準備共享的目錄必須存在),

????? 4.9.2 客戶端地址我們可以用指定Ip的主機,指定子網中的所有主機、指定域名的主機、指定域名的所有主機、所有主機。具體我們來看下邊表格? 。

?????????? ? ?? ? image

????? 4.9.3 參數用于指定訪問權限等主要有三類,參數是可選的,具體看下邊表格。

??????????? 指定用戶訪問權限:

????????????

?????? ? ? ? ? ?? image

補充:只有這兩種讀寫控制權限權限。

??????????? 用戶映射選項

????????????????? image



??????? 其他選項:


???????????????? image

補充:以上就是選項,其中標紅的是常用的。配置過程中可以組合使用,生產中常見使用如下配置:


clip_image018[1]

clip_image020?

4.10 檢查配置文件語法是否正確

??????? [root@nfs-server ~]# exportfs -rv

?????? exporting 192.168.196.0/24:/data

4.11 配置文件權限信息:

????? 配置完成后我們可以在下邊文件中查看共享目錄的信息

??????? [root@nfs-server ~]# cat /var/lib/nfs/etab

clip_image022

到這里NFS服務器端就配置成功了,我們這里就可以測試一下是否配置成功。

5 NFS CLIENT端配置

5.1 NFS軟件列表

????? 要部署NFS服務,客戶端也需要需要安裝下面的軟件包:

  • nfs-utils:NFS服務的主程序

  • nfs-utils-lib :NFS以來的庫

????? rpcbind:Centos6.X下面RPC的主程序(CentOs5.X下面為portmap)

5.2 NFS客戶端的nfs和rpcbind服務配置過程和SERVER端過程一樣。

???? 這里不做具體闡述,到這里我們的客戶端已經啟動了rpcbind服務(客戶端不需要啟動nfs服務,但是需要安裝)。

5.3 檢查rpcbind是否啟動

?????? [root@lamp01 ~]# /etc/init.d/rpcbind status

?????? rpcbind (pid 1204) is running...

5.4 顯示NFS服務器的安裝信息

?????? [root@lamp01 ~]# showmount -e 192.168.196.130

?????? Export list for 192.168.196.130:

????? /data 192.168.196.0/24

5.5 NFS客戶端掛載

????? 5.5.1 掛載的格式

????? clip_image024

???? 5.5.2 建立掛載目錄

????????????? [root@lamp01 ~]# mkdir -p /mnt/nfs

????? 5.5.3 掛載

???????????? [root@lamp01 ~]# mount -t nfs 192.168.196.130:/data /mnt/nfs/

???? 5.5.4 檢查是否掛載成功

??????????? [root@lamp01 ~]# df -h

?????? clip_image026

???????????? [root@lamp01 ~]# mount

??????? clip_image028

????? 5.5.5 將掛載信息寫入/etc/rc.local腳本

?????????????? [root@lamp01 ~]# cat /etc/rc.local

??????? clip_image030

到這里我們的NFS服務就配置完畢。

6 測試配置結果

6.1 檢查客戶端向nfs目錄下寫入文件是否可以。、

到這里我們的配置還沒有完成。我們在測試過程中會發現按照上邊的權限,客戶端不能向文件中寫入內容。這里我們還需要配置一些文件。

7 補充配置在NFS服務器SERVER端

7.1 配置說明

按照上邊寫的的NFS服務器端給的配置文件,我們只指定了讀寫權限、同步權限、和用戶匿名映射權限。我們來看配置文件:

clip_image032

? ????? 查看配置參數的用戶映射信息參數作用,我們就會知道,我們不管客戶端使用什么身份訪問就會將權限壓縮為匿名用戶勸降訪問,也就是配置文件uid為65534的用戶和gid為65534的用戶組權限訪問。所以就需要把該共享目錄的屬組改為65534的用戶,甚至屬組也改為65534。

7.2 配置

????? 7.2.1 查看data的信息

????????????? [root@nfs-server nfs]# ls -ld /data

??????? clip_image034

???? 7.2.2 查看這個用戶是誰?

???????????? [root@nfs-server nfs]# grep 65534 /etc/passwd

?????? clip_image036

????? 7.2.3 更改共享目錄的屬組

????????????? [root@nfs-server nfs]# chown -R nfsnobody /data

????? 7.2.4 檢查配置結果

????????????? [root@nfs-server nfs]# ls -ld /data

??????? clip_image038

到這里,就可以使用了。

8 常見配置錯誤

8.1 客戶端沒有裝nfs/rpcbind程序

8.2 服務器端沒有啟動服務

8.3 客戶端/服務器端防火墻沒有關閉。

???? NFS服務一般用于內網,所以關閉掉防火墻沒有多大影響,性能有很大提升。

8.4 服務器端啟動順序不正確(rpcbind必須比nfs啟動早)。

8.5 排錯思路:

???? 8.5.1 ping 服務器ip是否通,不通檢查是否與服務器在同一個局域網,自己網絡是否配置好。

???? 8.5.2 ping通的,telnet 服務器ip 端口號(111)檢查端口是否開。

?????? clip_image040

?????????????? ?? 出現上邊信息說明正確。否則檢查端口號。

????????????????? 如果信息正確,還是掛載失敗,檢查防火墻患有selinux是否關閉。

9 NFS優化

9.1 硬件優化

???? 配置NFS配置服務器時盡可能的選擇:

???? sas/ssd硬盤,買多塊,raid0/raid10。網絡吞吐量要大,至少千兆(多塊bond)

9.2 NFS服務器端配置

???? [root@nfs-server ~]# cat /etc/exports

???? /data 192.168.196.0/24(rw,sync,all_squash)

9.3 NFS客戶端掛載:risise、wsize、noatime、nodirtime、nosuid、noxexc、soft(hard,intr)

????? [root@lamp01~]#mount -t nfs -o nosuid,noexec,noatime,nodiratime,rsize=131072,wsize=131072 192.168.196.130:/data /mnt/nfs

????? [root@lamp01 ~]# mount -t nfs -o noatime,nodiratime,rsize=131072,wsize=131072 192.168.196.130:/data /mnt/nfs

????? [root@lamp01 ~]# mount -t nfs -o noatime,nodiratime 192.168.196.130:/data /mnt/nfs

9.4 有關NFS服務的所有服務器內核優化

????? clip_image042

10 補充

10.1 NFS客戶端可寫的服務端配置條件

?????? 當多個NFS客戶端以NFS方式寫入修改服務器端的文件系統時,需要具有以下個權限:

???????? ????? a) NFS服務器/etc/exports設置需要開放可寫入的權限,即服務端的共享權限

???????????? b)?? NFS服務器實際要共享的NFS目錄權限具有可寫入w的權限,即服務端本地目錄的安全權限,

???????????? c) 每臺機器都對應存在和nfs默認配置UID的相同UID 65534的nfsnobody用戶(確保所有客戶端的訪問權限統一,否則每個機器需要同時建立相同用UID的用戶,并覆蓋NFS的默認配置)。

????????? 當滿足上述三個條件,多個NFS客戶端才能具有互相寫入,互相修改其他主機寫入文件的權限,這在開篇講解過的大規模集群環境,作為集群共享存儲時尤為注意。

到這步為止,NFS服務端一個NFS共享目錄/data共享給10.0.0.0/24 內主機可讀寫就配置完了。下面還需要在客戶端主機掛載服務端共享的/data,才可以在客戶端真正讀寫到該共享目錄。

10.2 NFS與掛載優化

????? 10.2.1 掛載的格式

????? ? ? ? ? ?? clip_image043

???? 10.2.2 mount優化

?????????????????????下邊是mount -o參數對照表


????????????????? image

????? 10.2.3 NFS客戶端mount掛載優化

?????????? 某網友問:在企業生產環境中,NFS客戶端掛載有沒有必要加參數,比如加noexec、nosuid、nodev. bg、soft. rsize、 wsize 等參數, 我看書上說建議掛,rsize,wsize 這兩個是緩存參數,是否也建議加呢?老師你在生產環境中是怎么做的?
??????? 解答:這個問題屬于mount掛載優化內容(有些參數也適合其它文件系統),一般來.說要適當加掛載參效,但是,最好是做好測試,用數據來說話,到底是掛我還是不掛載。

????? 10.2.3.1 有關系統安全掛載參數選項

??????? 在企業工作場景,一般來說,NFS服務器共享的只是普通靜態數據(圖片、附件、視頻), 不需要執行suid、exec 等權限,掛載的這個文件系統只能作為數據存取之用,無法執行程序,對于客戶端來講增加了安全性,例如:很多×××篡改站點文件都是由上傳入口上傳的程序到存儲目錄,然后執行的。 因此在掛載的時候,用下面的命令很有必要:

安全掛載參數:

???????????????? [root@lamp01 ~]# mount -t nfs -o nosuid,noexec,noatime,rw 192.168.196.130:/data /mnt/nfs

???????? 通過mount -o指定掛載參數和在/etc/fstab里指定掛載參數效果時一樣的。網絡文件系統和本地文件系統效果是一樣的。

???? 10.2.3.2 mount 掛載性能優化參數選項

????????????????? 禁止更新目錄及文件時間挫掛載

??????????????????? [root@lamp01 ~]# mount -t nfs -o noatime,nodiratime 192.168.196.130:/data /mnt/nfs

???????????????? 安全加優化的掛載方式

?????????????????? [root@lamp01~]#mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 192.168.196.130:/data /mnt/nfs

???????????????? 默認掛載方式

????????????????? [root@lamp01~]#mount -t nfs 192.168.196.130:/data /mnt/nfs

注意:以具體業務需要實際測試選擇掛載參數

????? 10.2.4 NFS內核優化相關建議

???????????????? NFS內核優化相關建議

?????? 優化說明:

??????????? clip_image045

???????? 上述文件對應的具體的優化命令:

??????????? cat >>/etc/sysctl.conf<<EOF

??????????? net.core.wmem_default = 8388608

???????????? net.core.remem_default = 8388608

???????????? net.core.rmem_max = 16777216

???????????? net.core.wmem_max = 16777216

???????????? EOF

執行sysctl -p生效

???? 10.2.5 如果卸載的時候提示:umount:/mnt/nfs:device is busy

???????????????? 需要退出掛載目錄再進行卸載,或者是NFS Server宕機了,需要強行卸載,則是使用下邊命令解決:

???????????????? [root@lamp01~]#umount -lf /mnt/nfs

????? 10.2.6 大型網站NFS網絡文件系統替代軟件:

???????????? 分布式文件系統Moosefs(mfs)、glusterfs,FastDFS。