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架構圖
?????????????
1.4 企業生產集群為什麽需要共享存儲角色
???????? 這裏通過圖解給大家集群架構需要共享存儲服務的理由:例如:A用戶傳圖片到Web1服務器,然後讓B用戶訪問這張圖片,結果B用戶訪問的請求分發到了Web2,因為Web2上沒有這張圖片,結果無法看到A用戶上傳的圖片,如果此時有一個共享存儲,A用戶上傳圖片無論發到Web1還是Web2上,最終都存儲到共享存儲上,此時B用戶訪問圖片時,無論分發到Web1,還時Web2上,最終也都會去貢獻存儲上去訪問,這樣就可以訪問到資源了。這個共享存儲的位置可以通過開源軟件和商業硬件實現,互聯網中小型集群架構會用普通PC服務器和NFS文件系統實現。
當沒有NFS共享存儲,用戶訪問圖片的情況:
???????????
??????????? 有NFS共享存儲,用戶訪圖片的情況
??????????
2 NFS系統原理介紹:
2.1 NFS原理圖
????????????
2.2 RPC服務
???????? NFS本身的服務沒有提供文件傳輸的協議,但是NFS卻能讓我們進行文件的共享,其中的原因是NFS使用RPC協議。所以用到NFS的地方都需要啟動RPC服務,不論是服務器端還是客戶端,NFS和RPC的關系我們可以用下邊這張圖來理解。
?????????
3 NFS部署環境準備
3.1 NFS服務部署服務器準備
???????????
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
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
這裏給出一種配置文件舉例
4.9 格式參數說明:
4.9.1 NFS共享的目錄即就是NFS——SERVER端要共享的目錄,這裏是用data舉例(首先準備共享的目錄必須存在),
4.9.2 客戶端地址我們可以用指定Ip的主機,指定子網中的所有主機、指定域名的主機、指定域名的所有主機、所有主機。具體我們來看下邊表格。
方式 | 舉例 |
指定Ip的主機 | 192.168.196.131 |
指定子網中的所有主機 | 192.168.196.0/24 192.168.196.* 192.168.196.0/192.168.196.0/24 (以上三種任意一個即可) |
指定域名的主機 | 01.xiao_k.com |
指定域名的所有主機 | *.xiao_k.com |
所有主機 | * |
4.9.3 參數用於指定訪問權限等主要有三類,參數是可選的,具體看下邊表格。
? 指定用戶訪問權限:
參數 | 作用 |
rw | 設置共享目錄讀寫權限 |
ro | 設置共享目錄只讀權限 |
補充:只有這兩種讀寫控制權限權限。
? 用戶映射選項
參數 | 作用 |
root_squash | 對於訪問NFS Server共享目錄的用戶如果是root的話,則它的權限將被壓縮成匿名用戶,同時它的UID和GID通常會變成nfsnobody帳號身份。Map requests from uid gid 0 to the anonymous uidgid. |
no_root_squash | 訪問NFS Server共享目錄的用戶如果是root的話,它對該共享目錄具有root權限。這個配置原本為無盤客戶端準備的。用戶應避免使用!Turn off root squashing. This option is mainly useful for diskless clients |
all_squash | 不管訪問NFSServer共享目錄的用戶身份如何,它的權限都將被壓縮成匿名用戶,同時它的UID和GID都會變成nfsnobody帳號身份。在早期多個NFS客戶端同時讀寫NFS Server數據時,這個參數很有用 |
no_all_squash | 與all_squash取反(默認設置) |
anonuid=xxx | 將遠程訪問的所有用戶都映射為匿名用戶,並指定該用戶為本地用戶(UID=xxx) |
anongid=xxx | 將遠程訪問的所有用戶組都映射為匿名用戶組賬戶,並指定該匿名用戶組賬戶為本地用戶組賬戶(GID=xxx) |
? 其他選項
選項 | 作用 |
secure | 限制客戶端只能從小於1024的tcp/ip端口連接nfs服務器(默認設置) |
insecure | 允許客戶端從大於1024的tcp/ip端口連接服務器 |
sync | 將數據同步寫入內存緩沖區與磁盤中,效率低,但可以保證數據的一致性。請求或寫入數據時,數據同步寫入到NFS Server的硬盤後才返回。數據安全不會丟,缺點,性能比不啟用該參數要差。 |
async | 將數據先保存在內存緩沖區中,必要時才寫入磁盤。請求或寫入數據時,先返回請求,再將數據寫入到內存緩存和硬盤中,即異步寫入數據。此參數可以提升NFS性能,但是會降低數據的安全。因此,一般情況下建議不用,如果NFS處於瓶頸狀態,並且允許數據丟失的話可以打開此參數提升NFS性能。 |
wdelay | 檢查是否有相關的寫操作,如果有則將這些寫操作一起執行,這樣可以提高效率(默認設置) |
no_wdelay | 若有寫操作則立即執行,應與sync配合使用 |
subtree | 若輸出目錄是一個子目錄,則nfs服務器將檢查其父目錄的權限(默認設置) |
no_subtree | 即使輸出目錄是一個子目錄,nfs服務器也不檢查其父目錄的權限,這樣可以提高效率 |
補充:以上就是選項,其中標紅的是常用的。配置過程中可以組合使用,生產中常見使用如下配置:
4.10 檢查配置文件語法是否正確
[root@nfs-server ~]# exportfs -rv
exporting 192.168.196.0/24:/data
4.11 配置文件權限信息:
配置完成後我們可以在下邊文件中查看共享目錄的信息
[root@nfs-server ~]# cat /var/lib/nfs/etab
到這裏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 掛載的格式
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
[root@lamp01 ~]# mount
5.5.5 將掛載信息寫入/etc/rc.local腳本
[root@lamp01 ~]# cat /etc/rc.local
到這裏我們的NFS服務就配置完畢。
6 測試配置結果
6.1 檢查客戶端向nfs目錄下寫入文件是否可以。
到這裏我們的配置還沒有完成。我們在測試過程中會發現按照上邊的權限,客戶端不能向文件中寫入內容。這裏我們還需要配置一些文件。
7 補充配置(在NFS服務器SERVER端)
7.1 配置說明
按照上邊寫的的NFS服務器端給的配置文件,我們只指定了讀寫權限、同步權限、和用戶匿名映射權限。我們來看配置文件:
查看配置參數的用戶映射信息參數作用,我們就會知道,我們不管客戶端使用什麽身份訪問就會將權限壓縮為匿名用戶勸降訪問,也就是配置文件uid為65534的用戶和gid為65534的用戶組權限訪問。所以就需要把該共享目錄的屬組改為65534的用戶,甚至屬組也改為65534。
7.2 配置
7.2.1 查看data的信息
[root@nfs-server nfs]# ls -ld /data
7.2.2 查看這個用戶是誰?
[root@nfs-server nfs]# grep 65534 /etc/passwd
7.2.3 更改共享目錄的屬組
[root@nfs-server nfs]# chown -R nfsnobody /data
7.2.4 檢查配置結果
[root@nfs-server nfs]# ls -ld /data
到這裏,就可以使用了。
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)檢查端口是否開。
出現上邊信息說明正確。否則檢查端口號。
如果信息正確,還是掛載失敗,檢查防火墻患有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服務的所有服務器內核優化
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 掛載的格式
10.2.2 mount優化
下邊是mount -o參數對照表
參數 | 參數意義 | 系統默認值 |
suid nsuid | 當掛載的文件系統上有任何suid的程序時,只要使用nosuid就能夠取消設置suid的功能。 | suid |
rw ro | 可以指定文件系統時只讀(ro)或者讀寫(rw) | rw |
dev nodev | 是否可以保留裝置文件的特殊功能?一般來說只有dev才具有特殊裝置,因此可以選擇nodev | dev |
exec nexec | 是否具有執行文件的權限?如果想要掛載的僅是普通資源數據區(例如:圖片、附件),那麽可以選擇nexec | exec |
user nouser | 是否允許用戶進行文件的掛載與卸載功能?如果要保護文件系統,最好不要提供用戶進行掛載與卸載。 | nouser |
auto noauto | 這個auto指的是‘‘’mount -a時會不會被掛載的項目,如果不需要這個分區隨時被掛載,可以設置為noauto | auto |
rsize wsize | 讀出(rsize)與寫入(wsize)的區塊大小(block size),這個設置值可以影響客戶端與服務器端傳輸數據的緩沖存儲量,一般來說,如果局域網內(LAN),並且客戶端與服務器端都具有足夠的內存,這個值可以設置大一點,比如說65535byte,提升緩沖區塊將提升NFS文件系統的傳輸能力。但是設置的值也不要太大,最好時實現網絡能傳輸的最大值為限。 | CentOs5.x默認:rsize-1024 wsize:1024 CentOs6.x:默認rszie:131072 wsize:131072 |
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內核優化相關建議
優化說明:
上述文件對應的具體的優化命令:
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。
11 NFS系統應用的優缺點說明
11.1 作用
NFS服務可以讓不同的客戶端掛載使用同一個目錄,作為共享存儲使用,這樣可以保證不同節點客戶端數據的一致性,在集群架構環境中經常會用到。如果windows +Linux可以用samba。
11.2 優點
? 簡單->容易上手,容易掌握。
? NFS文件系統內數據是在文件內數據是在文件系統之上的,即就是數據看的見。
? 方便->部署快捷,維護簡單,可控且滿足需求就是最好的。
? 可靠->從軟件層面上看,數據可靠性高,經久耐用。數據是在文件系統之上的。
? 穩定->非常穩定
11.3 局限
? 局限性是存在單點故障,如果nfs server宕機了所有客戶端都不能訪問共享目錄。通過負載均衡彌補解決。
? 在大數據並發的場合,NFS效率、性能有限(一般幾千萬一下PV的網站不是瓶頸,除非網站架構太差,2千萬PV/日)。
? 客戶端認證時基於ip和主機名的,權限是根據id識別,安全性一般(用於內網則問題不大)。
? NFS數據是明文的,NFS本身對數據完整性不做驗證。
? 多臺客戶機掛載一個NFS服務器時,連接管理維護麻煩(耦合度高)。尤其NFS服務端出問題以後,所有的NFS客戶端都掛掉狀態(測試環境可以使用autofs自動掛載解決)。
這裏涉及到同步(實時等待)和異步(解耦)概念知識,NFS服務系端和客戶端來說就是耦合度有些高。系統及程序員架構師的重要職責就是為程序及架構解耦,讓網站的擴展性變更好。大中小型網站(2000萬PV以下)線上應用,都有用武之地。門戶網站也有應用。
NFS配置詳解