NFS是Network File System的縮寫,即網絡文件系統。它的主要功能是通過網絡(一般是局域網)讓不同的主機系統之間可以共享文件或目錄。NFS客戶端(一般為應用服務器,例如web)可以通過掛載(mount)的方式將NFS服務端共享的數據目錄掛載到NFS客戶端本地系統中(就是某一個掛載點下)。從NFS客戶端的機器本地看,NFS服務端共享的目錄就好像是客戶自己的磁盤分區或者目錄一樣,而實際上確是遠端的NFS服務端的目錄。
NFS網絡文件系統類似windows系統的網絡共享、安全功能、網絡驅動器映射,這也和linux系統裡的samba服務類似。應用於互聯網中小型集群架構後端作為數據共享,如果是大型網站,那麼有可能還會用到更復雜的分布式文件系統,例如Moosefs(mfs)、glusterfs、FastDFS。
在企業集群架構的工作場景中,NFS網絡文件系統一般被用來存儲共享視頻、圖片、附件等靜態資源文件。一般是把網站用戶上傳的文件都放在NFS共享裡,例如,BBS產品的圖片、附件、頭像,注意網站BBS程序不要放在NFS共享裡,然後前端所有的節點訪問存儲服務之一,特別是中小網站公司應用頻率更高。
NFS流程圖
NFS原理圖
NFS的RPC服務,在CentOS5.x下名稱為portmap,在CentOS6.x下名稱為rpcbind。
服務器系統
角色
ip
CentOS 6.6 x86_64
NFS服務端(nfs-server)
自定義
CentOS 6.6 x86_64
NFS客戶端(nfs-client1)
自定義
CentOS 6.6 x86_64
NFS客戶端(nfs-client2)
自定義
部署NFS服務,需要安裝下面的軟件包:
nfs-utils:這個NFS服務主程序包括rpc.nfsd、rpc.mountd兩個daemons和相關文檔說明及執行命令文件等。
rpcbind:CentOS 6.x下面RPC的主程序(CentOS 5.x下面的portmap)
NFS可以被視為一個RPC程序,在啟動任何一個RPC程序之前,需要做好端口映射工作,這個映射工作就是由rpcbind服務來完成的。因此,必須先啟動rpcbind服務。
CentOS 6.6默認沒有安裝NFS軟件包(CentOS 5默認已經安裝)。
出現兩個軟件包,表示NFS服務端軟件安裝完畢。
工作中推薦使用/etc/rc.local進行服務的啟動,不推薦使用chkconfig,目的是為了方便管理。
NFS服務的默認配置文件路徑為:/etc/exports,並且默認是空的。
/etc/exports文件配置格式
NFS 共享目錄 NFS客戶端地址1(參數1,參數2,參數3…) 客戶端地址1(參數1,參數2,參數3…)
NFS 共享目錄 NFS客戶端地址(參數1,參數2…)
啟動rpcbind
在服務端刪除/data中的文件/oldboy.txt,然後在客戶端進行查看,文件已經不存在。
無法寫入是因為權限的問題,解決辦法如下。
客戶端設置開機自動掛載
同樣配置另外一台客戶端。
1、首先確認NFS服務端配置和服務是否正常。
最好服務端自己掛載自己看看是否成功。
這一步主要是檢查服務端的NFS服務是不是正常的。
2、確認NFS客戶端showmount是否正常。
如果有問題進行下面排查。
1)ping NFS服務端IP檢查
2)telnet NFS服務端IP端口檢查
如果出現No route to host很有可能是服務端防火牆引起。
此外,還需要注意服務端RPC服務啟動順序問題。
/etc/init.d/rpcbind start
rpcinfo -p localhost
/etc/init.d/nfs start
rpcinfo -p localhost
NFS服務器端的權限設置,即/etc/exports文件配置格式中小括號的參數。
參數名稱
參數用途
rw
read-write,表示可讀寫權限*
ro
read-only,表示只讀權限
sync
請求或寫入數據時,數據同步寫入到NFS Server的硬盤後才返回。數據安全不會丟,缺點,性能下降。
async
請求或寫入數據是,先返回請求,再將數據寫入到內存緩存和硬盤中,即異步寫入數據。此參數可以提升NFS性能,但是會降低數據的安全。因此,一般情況下建議不用,如果NFS處於瓶頸狀態,並且運行數據丟失的話可以打開此參數提升NFS性能。寫入時數據會先寫到內存緩沖區,等硬盤有空檔再寫入磁盤,這樣可以提升寫入效率,風險若服務器宕機或不正常關機,會損失緩沖區中未寫入磁盤的數據(解決辦法:服務器主板電池或加UPS不間斷電源)。(電商秒殺是異步)
no_root_squash
訪問NFS Server共享目錄的用戶如果是root的話,它對該共享目錄具有root權限。這個配置原本為無盤客戶端准備的。用戶應避免使用。
root_squash
對於訪問NFS Server共享目錄的用戶如果是root的話,則它的權限將被壓縮成匿名用戶,同時它的UID和GID通常會變成nfsnobody賬號身份
all_squash
不管訪問NFS Server共享目錄的用戶身份如何,它的權限都被壓縮成匿名用戶,同時它的UID和GID都會變成nfsnobody賬號身份。在早期多個NFS客戶端同時讀寫NFS Server數據時,這個參數很有用。*
anonuid
參數以anon*開頭即值anonymous匿名用戶,這個用戶的UID設置值通常為nfsnobody的UID值,當然我們也可以自行設置這個UID值。但是,UID必須存在於/etc/passwd中。在多個NFS Clients時,如多台web server共享一個NFS目錄時,通過這個參數可以使得不同的NFS Clients寫入的數據對所有NFS Clients保持同樣的用戶權限,即為配置的匿名UID對應用戶權限,這個參數很有用。*
anongid
同anonuid,區別是把uid(用戶id)換成gid(組id)。
推薦使用配置。
當多個NFS客戶端以NFS方式寫入修改服務器端的文件系統時,需要具有以下權限:
1、NFS服務器/etc/exports設置需要開放可寫入的權限,即服務端的共享權限。
2、NFS服務器實際要共享的NFS目錄權限具有可寫入w的權限,即服務端本地目錄的安全權限。
3、每台機器都對應存在和nfs默認配置UID的相同UID65534的nfsnobody用戶(確保所有客戶端的訪問權限統一,否則每個機器需要同時建立相同UID的用戶,並覆蓋NFS的默認配置)。
當滿足三個條件,多個NFS客戶端才能具有互相寫入,互相修改其他主機寫入文件的權限。
/etc/exports
NFS服務主配置文件,配置NFS具體共享服務的地點,默認內容為空,以行為單位。
/usr/sbin/exportfs
NFS服務的管理命令。例如,可以加載NFS配置生效,還可以直接配置NFS共享目錄,即無需配置/etc/exports實現共享。
exportfs不但可以加載配置生效,也可以通過命令直接共享目錄。越過/etc/exports,但重啟失效。
/usr/sbin/showmount
常用在客戶端,查看NFS配置及掛載結果的命令。配置nfsserver,分別在服務端以及客戶端查看掛載情況。
/var/lib/nfs/etab
NFS配置文件的完整參數設定的文件(有很多沒有配置但是默認就有的NFS參數)。
/proc/mounts
客戶端掛載參數
NFS客戶端掛載的命令
掛載命令
掛載的格式類型
NFS服務器提供的共享目錄
NFS客戶端要掛載的目錄
mount
-t nfs
192.168.31.129:/data
/mnt(必須存在)
完整掛載命令為:mount -t nfs 192.168.31.129:/data /mnt
執行掛載的過程
在NFS服務端可以通過cat /var/lib/nfs/etab查看NFS服務端配置的參數細節。
在NFS客戶端可以通過cat /proc/mounts查看mount的掛載參數細節。
NFS Client mount掛載參數列表
參數
參數功能
默認參數
fg
bg
當在客戶端執行掛載時,可選擇是前台fg還是在後台bg執行。若在前台執行,則mount會持續嘗試掛載,直到成功或掛載時間超時為止,若在後台執行,則mount會在後台持續多次進行mount,而不會影響到前台的其它程序操作。如果網絡聯機不穩定,或是服務器常常需要開關機,建議使用bg比較好。
fg
soft
hard
當NFS Client以soft掛載Server後,若網絡或Server出現問題,造成Client和Server無法傳輸資料時,Client會一直嘗試到timeout後顯示錯誤並且停止嘗試。若使用soft mount的話,可能會在timeout出現時造成資料丟失,一般不建議使用。
若用hard模式掛載硬盤時,剛好和soft相反,此時Client會一直嘗試連線到Server,若Server有回應就繼續剛才的操作,若沒有回應NFS Client會一直嘗試,此時無法umount或kill,所以常常會配合intr使用。
hard
intr
當使用hard掛載的資源timeout後,若有指定intr參數,可以在timeout後把它中斷掉,這避免出問題時系統整個被NFS鎖死。
無
rsize
wsize
讀出(rsize)與寫入(wrize)的區塊大小(block size),這個設置值可以影響客戶端與服務端傳輸數據的緩沖存儲量,一般來說,如果在局域網內(LAN),並且客戶端與服務端都具有足夠的內存,這個值可以設置大一點(65535bytes),提升緩沖區塊將可提升NFS文件系統的傳輸能力。但設置的值也不能太大,最好是實現網絡能夠傳輸的最大值為限。
CentOS 5:默認1024
CentOS 6:默認131072
proto=udp
使用UDP協議來傳輸資料,在LAN中會有比較好的性能。若要跨越Internet的話,使用proto=tcp多傳輸的數據會有比較好的糾錯能力
proto=tcp
man nfs查看上述信息。
優化:
下面是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
在企業工作場景,一般來說,NFS服務器共享的只是普通靜態數據(圖片、附件、視頻),不需要執行suid、exec等權限,掛載的這類文件系統只能作為數據存取之用,無法執行程序,對於客戶端來講增加了安全性。例如,很多木馬篡改站點文件都是由上傳入口上傳的程序到存儲目錄,然後執行的。
因此在掛載的時候用下面的命令很有必要。
mount安全掛載參數
mount -t nfs -o nosuid,noexec,nodev,rw 192.168.31.129:/data /mnt
通過mount -o指定掛載參數和在/etc/fstab裡指定掛載參數效果是一樣的。
mount掛載性能優化參數選項
1、禁止更新目錄及文件時間戳掛載
mount -t nfs -o noatime,nodiratime 192.168.31.129:/data /mnt
2、安全加優化的掛載方式
mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 192.168.31.129:/data /mnt
3、默認的掛載方式(推薦)
mount -t nfs 192.168.31.129:/data /mnt
如果是本地文件系統
mount /dev/sdb1 /mnt -o defaults,async,noatime,data=writeback,barrier=0
NFS服務內核優化
優化選項說明:
1、/proc/sys/net/core/rmem_default
該文件指定了接收套接字緩沖區大小的缺失值(以字節為單位),缺省設置:124928。
2、/proc/sys/net/core/rmem_max
該文件指定了接收套接字緩沖區大小的最大值(以字節為單位),缺省設置:124928。
3、/proc/sys/net/core/wmem_default
該文件指定了發送套接字緩沖區大小的缺失值(以字節為單位),缺省設置:124928。
4、/proc/sys/net/core/wmem_max
該文件指定了發送套接字緩沖區大小的最大值(以字節為單位),缺省設置:124928。
上述文件對應的具體內核優化命令:
企業場景NFS共享存儲優化小結
1、硬件:sas、ssd硬盤,買多塊,raid0、raid10。網卡吞吐量要大,至少千兆
2、NFS服務器端配置:/data
192.168.31.0/24(rw,sync,all_squash,anonuid=65534,anongid=65534)
3、NFS客戶端掛載:rsize、wsize、noatime、nodirtime、nosuid、noexec、soft(hard、intr)
mount -t nfs -o nosuid,noexec,nodev,noatime,rsize=131072,wsize=131072 192.168.31.129:/data /mnt
mount -t nfs -o noatime,nodiratime,rsize=131072,wsize=131072 192.168.31.129:/data /mnt
mount -t nfs -o noatime,nodiratime 192.168.31.129:/data /mnt
4、有關NFS服務的所有服務器內核優化
5、如果卸載的時候提示:umount:/mnt:device is busy,需要退出掛載目錄後進行卸載,或是NFS Server宕機了,需要強制卸載mount -lf /mnt。
6、大型網站NFS網絡文件系統替代軟件,分布式文件系統Moosefs(mfs)、glusterfs、FastDFS。
作用:
NFS服務可以讓不同的客戶端掛載使用同一目錄,作為共享存儲使用,這樣可以保證不同節點客戶端數據的一致性,在集群架構環境中經常會用到。如果windows+linux可以用samba。
優點:
1、簡單,容易上手,容易掌握。
2、NFS文件系統內數據是在文件系統之上的,即數據能看見。
3、方便,部署快速,維護簡單,可控且滿足需求。
4、可靠,從軟件層面上看,數據可靠性高,經久耐用。數據是在文件系統之上的
5、穩定。
局限:
1、局限性是存在單點故障,如果nfs server宕機了所有客戶端都不能訪問共享目錄
可以通過負載均衡及高可用方案彌補。
2、在大數據高並發的場合,NFS效率、性能有限(一般幾千萬pv的網站不是瓶頸,除非網站架構太差,2千萬pv/日)。
3、客戶端認證是基於ip和主機名的,權限是根據ID識別,安全性一般(用於內外則問題不大)。
4、NFS數據是明文的,NFS本身對數據完整性不作驗證。
5、多台客戶機器掛載一個NFS服務器時,連接管理維護麻煩(耦合度高)。尤其NFS服務出現問題後,所有NFS客戶端都掛掉狀態(測試環境可以使用autofs自動掛載解決)。
6、大中小型網站(2千萬PV以下)線上應用,都有用武之地。
短格式
長格式
用途及實例結果
-e
--exports
顯示NFS服務器輸出的目錄列表
[root@web-lamp01 ~]# showmount -e 192.168.31.129
Export list for 192.168.31.129:
/data 192.168.31.0/24
-d
--directories
顯示NFS服務器中提供共享的目錄
-a
--all
以ip:/die格式顯示NFS服務器的ip和可被掛載的目錄
http://xxxxxx/Linuxjc/1188808.html TechArticle