NFS概述
NFS 就是 Network FileSystem 的縮寫,最早之前是由Sun所發展出來的。他最大的功能就是可以透過網絡,讓不同的機器、不同的操作系統、可以彼此分享自己的文件 ( share file ),所以也可以簡單的將他看做是一個 file server。這個NFS Server可以讓你的PC來將網絡遠程的 NFS主機分享的目錄,掛載到本地端的機器當中,所以,在本地端的機器看起來,那個遠程主機的目錄就好象是自己的partition一樣。這里遠程的那臺給你共享的機器就是server,而你的pc就是client。
NFS協議從誕生到現在為止,已經有多個版本,如NFS V2(rfc1094),NFS V3(rfc1813),最新的版本是V4(rfc3010)。
V3相對V2的增加了很多功能,其中一個重要的功能就是增加了異步寫入特性功能,下面是它的介紹:
NFS V3 能否使用異步寫入,這是可選擇的一種特性。NFS V3客戶端發發送一個異步寫入請求到服務器,在給客戶端答復之前服務器并不是必須要將數據寫入到存儲器中(穩定的)。服務器能確定何時去寫入數據或者將多個寫入請求聚合到一起并加以處理,然后寫入。客戶端能保持一個數據的copy以防萬一服務器不能完整的將數據寫入。當客戶端希望釋放這個copy的時候,它會向服務器通過這個操作過程,以確保每個操作步驟的完整。異步寫入能夠使服務器去確定最好的同步數據的策略。使數據能盡可能的同步的提交何到達。與V2 比較來看,這樣的機制能更好的實現數據緩沖和更多的平行(平衡)。而NFS V2的SERVER在將數據寫入存儲器之前不能再相應任何的寫入請求。
那么NFS到底是怎么實現的?
RPC概述
雖然 NFS 有屬于自己的協議與使用的port number,但是在資料傳送或者其它相關訊息傳遞的時候,NFS使用的則是一個稱為遠程過程調用(Remote Procedure Call, RPC)的協議來協助 NFS 本身的運作。
當我們在使用某些服務來進行遠程聯機的時候,有些信息,例如主機的IP、服務的port number、與對應到的服務之PID等等,都需要管理與對應。這些管理 port的對應與服務相關性的工作,就是這個Remote Procedure Call, RPC的任務了。
NFS 本身的服務并沒有提供資料傳遞的協議,但是 NFS卻能讓我們進行檔案的分享,這其中的原因,就是NFS使用到一些其它相關的傳輸協議。而這些傳輸的協議,就是使用到這個所謂的RPC的功能。這也就是說,NFS本身就是使用RPC的一個program而已,說的更白話一點, NFS 也可以視作是一個 RPC server。
同時要注意到的是,在某些狀況中,不但跑NFS的Server需要激活RPC的服務,連帶的,要掛載NFS partition的Client機器,也需要同步激活RPC才行。原因就是這樣做才能使Server端與Client端能藉由RPC的協議來進行program port的對應。NFS主要在管理分享出來的目錄,而至于資料的傳遞,就直接將他丟給RPC的協議來運作就行了。
那么要訪問Server端的文件,需要哪些后臺程序,也就是Server端要提供NFS的服務,需要有哪些daemon程序支持?由前面的討論可以知道nfs server其實就是一個rpc server,因此提供nfs的daemon 就是rpc daemon。
NFS Server的RPC daemons
客戶端要訪問nfs server的文件,NFS Server端必須NFS的服務,NFS的服務是由以下兩個后臺進程來完成的。
2、????????????? rpc.mountd:這個daemon主要的功能,就是是管理NFS的文件系統。
當Client端順利的通過rpc.nfsd而登入主機之后,在他可以使用NFS server提供的檔案之前,還會經過檔案使用權限(就是那個 -rwxrwxrwx 與 owner, group 那幾個權限) 的認證程序。他會去讀NFS的設置文件/etc/exports來比對 Client 的權限,當通過這一關之后, Client就可以取得使用NFS文件的權限。(注:這個也是我們用來管理 NFS 分享之目錄的使用權限與安全設定的地方)。
要讓NFS運行起來,對外提供服務,一共需要兩個套件的支持。分別是:
1、????????????? nfs-utils:就是提供rpc.nfsd及rpc.mountd這兩個NFS daemons與其它相關documents與說明文件、執行檔等的套件,這個就是NFS的主要套件。
2、????????????? portmap:提高端口映射的功能。
就如同剛剛提的到,我們的NFS其實可以被視為一個RPC server program,而要激活任何一個RPC server program之前,我們都需要做好port的對應(mapping)的工作才行,這個工作其實就是『portmap』這個服務所負責的。也就是說,在激活任何一個RPC server之前,我們都需要激活portmap才行。
那么這個portmap到底在干嘛呢?就如同這個服務的名稱,就是作port的mapping。舉個例子來說:當Client端嘗試來使用RPC server所提供的服務時,由于Client需要取得一個可以連接的port才能夠使用RPC server所提供的服務,因此,Client首先就會去跟 portmap講『可不可以通知一下,給我個port number,好讓我可以跟RPC聯絡吧!』,這個時候portmap就自動的將自己管理的port mapping告知 Client ,好讓他可以連接上server 來。
所以:『激活 NFS 之前,請先激活portmap』
NFS客戶端的設定
所謂客戶端的設定,其實就是說客戶端該如何掛載主機的目錄,當然是使用mount目錄,它的語法格式:
#mount -t nfs hostname(orIP):/directory /mountpoint
為了擔心會不小心將NFS端掛進來的具有SUID權限檔案的程序執行,root可以將NFS 所分享的目錄以較為安全的情況掛載進來,可以
#mount -t nfs -o nosuid,ro hostname:/directory /mountponit
有關mount nfs的其它可選參數:
1、HARD mount和SOFT MOUNT:
HARD:NFS CLIENT會不斷的嘗試與SERVER的連接(在后臺,不會給出任何提示信息,在LINUX下有的版本仍然會給出一些提示),直到MOUNT上。
SOFT:會在前臺嘗試與SERVER的連接,是默認的連接方式。當收到錯誤信息后終止mount嘗試,并給出相關信息。
例如:mount -F nfs -o hard 192.168.0.10:/nfs /nfs
對于到底是使用hard還是soft的問題,這主要取決于你訪問什么信息有關。例如你是想通過NFS來運行X PROGRAM的話,你絕對不會希望由于一些意外的情況(如網絡速度一下子變的很慢,插拔了一下網卡插頭等)而使系統輸出大量的錯誤信息,如果此時你用的是HARD方式的話,系統就會等待,直到能夠重新與NFS SERVER建立連接傳輸信息。另外如果是非關鍵數據的話也可以使用SOFT方式,如FTP數據等,這樣在遠程機器暫時連接不上或關閉時就不會掛起你的會話過程。
2、rsize和wsize:
文件傳輸尺寸設定:V3沒有限定傳輸尺寸,V2最多只能設定為8k,可以使用“-rsize”和“-wsize”來進行設定。這兩個參數的設定對于NFS的執行效能有較大的影響
3、bg:在執行mount時如果無法順利mount上時,系統會將mount的操作轉移到后臺并繼續嘗試mount,直到mount成功為止。(通常在設定/etc/fstab文件時都應該使用bg,以避免可能的mount不上而影響啟動速度)
4、fg:和bg正好相反,是默認的參數
5、nfsvers=n:設定要使用的NFS版本,默認是使用2,這個選項的設定還要取決于server端是否支持NFS VER 3
6、mountport:設定mount的端口
7、port:根據server端export出的端口設定,例如如果server使用5555端口輸出NFS,那客戶端就需要使用這個參數進行同樣的設定
8、timeo =n:設置超時時間,當數據傳輸遇到問題時,會根據這個參數嘗試進行重新傳輸。默認值是7/10妙(0.7秒)。如果網絡連接不是很穩定的話就要加大這個數值,并且推薦使用HARD MOUNT方式,同時最好也加上INTR參數,這樣你就可以終止任何掛起的文件訪問。
9、intr 允許通知中斷一個NFS調用。當服務器沒有應答需要放棄的時候有用處。
10、udp:使用udp作為nfs的傳輸協議(NFS V2只支持UDP)
11、tcp:使用tcp作為nfs的傳輸協議
12、namlen=n:設定遠程服務器所允許的最長文件名。這個值的默認是255
13、acregmin=n:設定最小的在文件更新之前cache時間,默認是3
14、acregmax=n:設定最大的在文件更新之前cache時間,默認是60
15、acdirmin=n:設定最小的在目錄更新之前cache時間,默認是30
16、acdirmax=n:設定最大的在目錄更新之前cache時間,默認是60
17、actimeo=n:將acregmin、acregmax、acdirmin、acdirmax設定為同一個數值,默認是沒有啟用。
18、retry=n:設定當網絡傳輸出現故障的時候,嘗試重新連接多少時間后不再嘗試。默認的數值是10000 minutes
19、noac:關閉cache機制。
同時使用多個參數的方法:mount -t nfs -o timeo=3,udp,hard 192.168.0.30:/tmp /nfs
請注意,NFS客戶機和服務器的選項并不一定完全相同,而且有的時候會有沖突。比如說服務器以只讀的方式導出,客戶端卻以可寫的方式mount,雖然可以成功mount上,但嘗試寫入的時候就會發生錯誤。一般服務器和客戶端配置沖突的時候,會以服務器的配置為準。
與NFS有關的一些命令介紹
nfsstat:查看NFS的運行狀態,對于調整NFS的運行有很大幫助,在主機和客戶端都可以使用。
Rpcinfo:查看rpc執行信息,可以用于檢測rpc運行情況的工具。
NFS調優
調優的步驟包括:
1、測量當前網絡、服務器和每個客戶端的執行效率。
2、分析收集來的數據并畫出圖表。查找出特殊情況,例如很高的磁盤和CPU占用、已經高的磁盤使用時間
3、調整服務器
4、重復第一到第三步直到達到你渴望的性能
與NFS性能有關的問題有很多,通常可以要考慮的有以下這些選擇:
1、WSIZE,RSIZE參數來優化NFS的執行效能。
WSIZE、RSIZE對于NFS的效能有很大的影響。wsize和rsize設定了SERVER和CLIENT之間往來數據塊的大小,這兩個參數的合理設定與很多方面有關,不僅是軟件方面也有硬件方面的因素會影響這兩個參數的設定(例如LINUX KERNEL、網卡,交換機等等)。
下面這個命令可以測試NFS的執行效能,讀和寫的效能可以分別測試,分別找到合適的參數。對于要測試分散的大量的數據的讀寫可以通過編寫腳本來進行測試。在每次測試的時候最好能重復的執行一次MOUNT和unmount。
time dd if=/dev/zero of=/mnt/home/testfile bs=16k count=16384
用于測試的WSIZE,RSIZE最好是1024的倍數,對于NFS V2來說8192是RSIZE和WSIZE的最大數值,如果使用的是NFS V3則可以嘗試的最大數值是32768。如果設置的值比較大的時候,應該最好在CLIENT上進入mount上的目錄中,進行一些常規操作(LS,VI等等),看看有沒有錯誤信息出現。有可能出現的典型問題有ls的時候文件不能完整的列出或者是出現錯誤信息,不同的操作系統有不同的最佳數值,所以對于不同的操作系統都要進行測試。
2、設定最佳的NFSD的COPY數目。
linux中的NFSD的COPY數目是在/etc/rc.d/init.d/nfs這個啟動文件中設置的,默認是8個NFSD,對于這個參數的設置一般是要根據可能的CLIENT數目來進行設定的,和WSIZE、RSIZE一樣也是要通過測試來找到最近的數值。
3、UDP and TCP
可以手動進行設置,也可以自動進行選擇
mount -t nfs -o sync,tcp,noatime,rsize=1024,wsize=1024 EXPORT_MACHINE:/EXPORTED_DIR /DIR
UDP 有著傳輸速度快,非連接傳輸的便捷特性,但是UDP在傳輸上沒有TCP來的穩定,當網絡不穩定或者黑客入侵的時候很容易使NFS的 Performance 大幅降低甚至使網絡癱瘓,所以對于不同情況的網絡要有針對的選擇傳輸協議。
nfs over tcp比較穩定, nfs over udp速度較快。在機器較少網絡狀況較好的情況下使用UDP協議能帶來較好的性能,當機器較多,網絡情況復雜時推薦使用TCP協議(V2只支持UDP協議)。在局域網中使用UDP協議較好,因為局域網有比較穩定的網絡保證,使用UDP可以帶來更好的性能,在廣域網中推薦使用TCP協議,TCP協議能讓NFS在復雜的網絡環境中保持最好的傳輸穩定性。
4、版本的選擇
V3作為默認的選擇(RED HAT 8默認使用V2,SOLARIS 8以上默認使用V3),可以通過vers= mount option來進行選擇。LINUX通過mount option的nfsvers=n進行選擇。
NFS安全性
NFS的不安全性主要體現于以下4個方面:
1、新手對NFS的訪問控制機制難于做到得心應手,控制目標的精確性難以實現
2、NFS沒有真正的用戶驗證機制,而只有對RPC/Mount請求的過程驗證機制
3、較早的NFS可以使未授權用戶獲得有效的文件句柄
4、在RPC遠程調用中,一個SUID的程序就具有超級用戶權限
加強NFS安全的方法:
1、合理的設定/etc/exports中共享出去的目錄,最好能使用anonuid,anongid以使MOUNT到NFS SERVER的CLIENT僅僅有最小的權限,最好不要使用no_root_squash。
2、使用IPTABLE防火墻限制能夠連接到NFS SERVER的機器范圍
iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p TCP -s 140.0.0.0/8 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 140.0.0.0/8 --dport 111 -j ACCEPT
3、為了防止可能的Dos攻擊,需要合理設定NFSD 的COPY數目
4、修改/etc/hosts.allow和/etc/hosts.deny達到限制CLIENT的目的
/etc/hosts.allow
portmap: 192.168.0.0/255.255.255.0 : allow
portmap: 140.116.44.125 : allow
/etc/hosts.deny
portmap: ALL : deny
5、改變默認的NFS 端口
NFS默認使用的是111端口,但同時你也可以使用port參數來改變這個端口,這樣就可以在一定程度上增強安全性。使用Kerberos V5作為登陸驗證系統
NFS故障解決
1、NFSD沒有啟動起來
首先要確認NFS輸出列表存在,否則nfsd不會啟動。可用exportfs命令來檢查,如果exportfs命令沒有結果返回或返回不正確,則需要檢查/etc/exports文件。
2、mountd 進程沒有啟動
mountd進程是一個遠程過程調用(RPC),其作用是對客戶端要求安裝(mount)文件系統的申請作出響應。
mountd進程通過查找/etc/fstab文件來獲知哪些文件系統可以被遠程客戶端使用;另外,通過mountd進程,用戶可以知道目前有哪些文件系統已被遠程文件系統裝配,并得知遠程客戶端的列表。
查看mountd是否正常啟動起來可以使用命令rpcinfo進行查看,在正常情況下在輸出的列表中應該象這樣的行:
100005 1 udp 1039 mountd
100005 1 tcp 1113 mountd
100005 2 udp 1039 mountd
100005 2 tcp 1113 mountd
100005 3 udp 1039 mountd
100005 3 tcp 1113 mountd
如果沒有起來的話可以檢查是否安裝了PORTMAP組件:rpm -qa|grep portmap
3、fs type nfs no supported by kernel:kernel不支持nfs文件系統,重新編譯一下KERNEL就可以解決。
4、can't contact portmapper: RPC: Remote system error - Connection refused:出現這個錯誤信息是由于SEVER端的PORTMAP沒有啟動。
5、mount clntudp_create: RPC: Program not registered:NFS沒有啟動起來,可以用showmout -e host命令來檢查NFS SERVER是否正常啟動起來。
6、mount: localhost:/home/test failed, reason given by server: Permission denied:這個提示是當client要mount nfs server時可能出現的提示,意思是說本機沒有權限去mount nfs server上的目錄。解決方法當然是去修改NFS SERVER咯。
7、限的設定不符合
8、被防火墻搞掉
這個原因很多人都忽視了,在有嚴格要求的網絡環境中,我們一般會關閉linux上的所有端口,當需要使用哪個端口的時候才會去打開。而NFS默認是使用111端口,所以我們先要檢測是否打開了這個端口,另外也要檢查TCP_Wrappers的設定。
重新設置防火墻,包括iptables與TCP_Wrappers,因為激活了portmap,所以端口111必須提供出去.因此在iptables rules中,要增加:
iptables -A INPUT -p TCP --dport 111 -j ACCEPT
iptables -A INPUT -p UDP --dport 111 -j ACCEPT
如果還不行,那就是TCP_Wrappers的問題,檢查/etc/hosts.deny,如果有一行是:
ALL: ALL: deny
那就必須在/etc/hosts.allow中增加:
portmap: ALL: allow
9、另外,需要注意的下面這個問題:
由于NFS使用的這個RPC在client端連上主機時,那么你的主機想要關機,那可就會成為『不可能的任務』。即如果你的Server上面還有Client在聯機,那么你要關機,可能得要等到數個鐘頭才能夠正常的關機成功!所以,建議在NFS Server要關機之前,要先『關掉portmap與nfs』這兩個東西。如果無法正確的將這兩個daemons關掉,那么先以netstat -utlp找出PID,然后kill掉。
?
評論
查看更多