NFS文件(FOR LINUX)

ysping發表於2009-08-05

一、NFS簡介

NFS server可以看作是一個FILE SERVER,它可以讓你的PC透過網路將遠端得NFS SERVER共享出來的檔案MOUNT到自己的系統中,在CLIENT看來使用NFS的遠端檔案就象是在使用本地檔案一樣。
NFS協議從誕生到現在為止,已經有多個版本,如NFS V2(rfc1094),NFS V3(rfc1813)(最新的版本是V4(rfc3010)。

二、各NFS協議版本的主要區別

V3相對V2的主要區別:

[@more@]

1、檔案尺寸
V2最大隻支援32BIT的檔案大小(4G),而NFSV3新增加了支援64BIT檔案大小的技術。
2、檔案傳輸尺寸
V3沒有限定傳輸尺寸,V2最多隻能設定為8k,可以使用-rsize and -wsize來進行設定。
3、完整的資訊返回
V3增加和完善了許多錯誤和成功資訊的返回,對於伺服器的設定和管理能帶來很大好處。
4、增加了對TCP傳輸協議的支援
V2只提供了對UDP協議的支援,在一些高要求的網路環境中有很大限制,V3增加了對TCP協議的支援
*5、非同步寫入特性
6、改進了SERVER的mount效能
7、有更好的I/O WRITES效能。
8、更強網路執行效能,使得網路運作更為有效。
9、更強的災難恢復功能。

非同步寫入特性(v3新增加)介紹:
NFS V3 能否使用非同步寫入,這是可選擇的一種特性。NFS V3客戶端傳送一個非同步寫入請求到伺服器,在給客戶端答覆之前伺服器並不是必須要將資料寫入到儲存器中(穩定的)。伺服器能確定何時去寫入資料或者將多個寫入請求聚合到一起並加以處理,然後寫入。客戶端能保持一個資料的copy以防萬一伺服器不能完整的將資料寫入。當客戶端希望釋放這個copy的時候,它會向伺服器透過這個操作過程,以確保每個操作步驟的完整。非同步寫入能夠使伺服器去確定最好的同步資料的策略。使資料能儘可能的同步的提交和到達。與V2比較來看,這樣的機制能更好的實現資料緩衝和更多的平行(平衡)。而NFS V2的SERVER在將資料寫入儲存器之前不能再響應任何的寫入請求。

V4相對V3的改進:
1:改進了INTERNET上的存取和執行效能
2:在協議中增強了安全方面的特性
3:增強的跨平臺特性

三、CLIENT和SERVER的具體操作和設定

在講NFS SERVER的運作之前先來看一些與NFS SERVER有關的東西:
RPC(Remote Procedure Call)
NFS本身是沒有提供資訊傳輸的協議和功能的,但NFS卻能讓我們透過網路進行資料的分享,這是因為NFS使用了一些其它的傳輸協議。而這些傳輸協議用到這個RPC功能的。可以說NFS本身就是使用RPC的一個程式。或者說NFS也是一個RPC SERVER.所以只要用到NFS的地方都要啟動RPC服務,不論是NFS SERVER或者NFS CLIENT。這樣SERVER和CLIENT才能透過RPC來實現PROGRAM PORT的對應。可以這麼理 解RPC和NFS的關係:NFS是一個檔案系統,而RPC是負責資訊的傳輸。

NFS需要啟動的DAEMONS

rpc.nfsd:主要負責登陸許可權檢測等。
rpc.mountd:負責NFS的檔案系統,當CLIENT端透過rpc.nfsd登陸SERVER後,對client存取server的檔案進行一系列的管理。
NFS SERVER在RED HAT LINUX平臺下一共需要兩個套件:nfs-utils和PORTMAP
nfs-utils:提供rpc.nfsd及rpc.mountd這兩個NFS DAEMONS的套件
portmap: NFS其實可以被看作是一個RPC SERVER PROGRAM,而要啟動一個RPC SERVER PROGRAM,都要做好PORT的對應工作,而且這樣的任務就是由PORTMAP來完成的。通俗的說PortMap就是用來做PORT的mapping的。

(一):伺服器端的設定(以LINUX為例)
伺服器端的設定都是在/etc/exports這個檔案中進行設定的,設定格式如下:
欲分享出去的目錄主機名稱1或者IP1(引數1,引數2)主機名稱2或者IP2(引數3,引數4)
上面這個格式表示,同一個目錄分享給兩個不同的主機,但提供給這兩臺主機的許可權和引數是不同的,所以分別設定兩個主機得到的許可權。
可以設定的引數主要有以下這些:
rw:可讀寫的許可權;
ro:只讀的許可權;
no_root_squash:登入到NFS主機的使用者如果是ROOT使用者,他就擁有ROOT的許可權,此引數很不安全,建議不要使用。
root_squash:客戶機用root使用者訪問該共享資料夾時,將root使用者對映成匿名使用者;
all_squash:不管登陸NFS主機的使用者是什麼都會被重新設定為nobody。
anonuid:將登入NFS主機的使用者都設定成指定的userid,此ID必須存在於/etc/passwd中。
anongid: 將客戶機上的使用者對映成屬於指定的本地使用者組ID!
sync:資料同步寫入儲存器中。
async:資料會先暫時存放在記憶體中,不會直接寫入硬碟。
insecure:允許從這臺機器過來的非授權訪問。

例如可以編輯/etc/exports為:
/tmp     *(rw,no_root_squash)
/home/public 192.168.0.*(rw)  *(ro)
/home/test  192.168.0.100(rw)
/home/linux *.the9.com(rw,all_squash,anonuid=40,anongid=40)
設定好後可以使用以下命令啟動NFS:
/etc/rc.d/init.d/portmap start(在REDHAT中PORTMAP是預設啟動的)
/etc/rc.d/init.d/nfs start或service nfs start

注:/etc/exports中需要包括'sync' or 'async'引數:
[root@RHAS4-1 ~]cat /etc/exports
/archive 192.168.0.22(rw)
[root@RHAS4-1 ~]# exportfs -rv
exportfs: /etc/exports [1]: No 'sync' or 'async' option specified for export "192.168.0.22:/archive".
Assuming default behaviour ('sync').
NOTE: this default has changed from previous versions

[root@RHAS4-1 ~]cat /etc/exports
/archive 192.168.0.22(rw,async)
[root@RHAS4-1 ~]# exportfs -rv
exporting RHAS4-2:/archive


exportfs命令:
如果我們在啟動了NFS之後又修改了/etc/exports,是不是還要重新啟動nfs呢?這個時候我們就可以用exportfs命令來使改動立刻生效,該命令格式如下:
exportfs[-aruv]
-a:全部mount或者unmount /etc/exports中的內容
-r:重新mount /etc/exports中分享出來的目錄
-u:umount目錄
-v:在export的時候,將詳細的資訊輸出到螢幕上。
具體例子:
[root@testroot]#exportfs -rv <==全部重新export一次!
exporting 192.168.0.100:/home/test
exporting 192.168.0.*:/home/public
exporting *.the9.com:/home/linux
exporting *:/home/public
exporting *:/tmp
reexporting 192.168.0.100:/home/testtokernel

exportfs -au <==全部都解除安裝了。

(二):客戶端的操作(不需要啟動nfs,PORTMAP預設是啟動的):

1、showmout命令
對於NFS的操作和查錯有很大的幫助,所以我們先來看一下showmount的用法
showmout
-a:這個引數是一般在NFS SERVER上使用,是用來顯示已經mount上本機nfs目錄的client機器。
-e:顯示指定的NFS SERVER上export出來的目錄。

在客戶端執行showmount -a 會有問題(需要加host引數):
[root@RHAS4-2 ~]# showmount -a
mount clntudp_create: RPC: Program not registered

[root@RHAS4-2 ~]# showmount -a 192.168.0.21
All mount points on 192.168.0.21:
192.168.0.22:RHAS4-2
RHAS4-2:/archive

[root@RHAS4-2 ~]# showmount -e 192.168.0.21
Export list for 192.168.0.21:
/archive RHAS4-2


2、mount nfs目錄的方法:
若是臨時使用可直接執行mount命令:mount servername(or IP):共享目錄 本地掛載目錄(本地掛載目錄需要先建立好)。
若客戶機啟動就自動掛載伺服器的共享目錄,則需修改客戶機上的/etc/fstab檔案。

mount -t nfs hostname(orIP):/directory /mount/point
具體例子:
Linux:mount -t nfs 192.168.0.1:/tmp /mnt/nfs
Solaris:mount -F nfs 192.168.0.1:/tmp /mnt/nfs
BSD:mount 192.168.0.1:/tmp /mnt/nfs

3、mount nfs的其它可選引數:
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來執行XPROGRAM的話,你絕對不會希望由於一 些意外的情況(如網路速度一下子變的很慢,插拔了一下網路卡插頭等)而使系統輸出大量的錯誤資訊,如果此時你用的是HARD方式的話,系統就會等待,直到能夠重新與NFS SERVER建立連線傳輸資訊。另外如果是非關鍵資料的話也可以使用SOFT方式,如FTP資料等,這樣在遠端機器暫時連線不上或關閉時 就不會掛起你的會話過程。

rsize和wsize:
檔案傳輸尺寸設定:V3沒有限定傳輸尺寸,V2最多隻能設定為8k,可以使用-rsize and -wsize來進行設定。這兩個引數的設定對於NFS的執行效能有較大的影響
bg:在執行mount時如果無法順利mount上時,系統會將mount的操作轉移到後臺並繼續嘗試mount,直到mount成功為止。(通常在設定/etc/fstab檔案時都應該使用bg,以避免可能的mount不上而影響啟動速度)
fg:和bg正好相反,是預設的引數
nfsvers=n:設定要使用的NFS版本,預設是使用2,這個選項的設定還要取決於server端是否支援NFS VER3
mountport:設定mount的埠
port:根據server端export出的埠設定,例如如果server使用5555埠輸出NFS,那客戶端就需要使用這個引數進行同樣的設定
timeo =n:設定超時時間,當資料傳輸遇到問題時,會根據這個引數嘗試進行重新傳輸。預設值是7/10妙(0.7秒)。如果網路連線不是很穩定的話就要加大這個數值,並且推薦使用HARD MOUNT方式,同時最好也加上INTR引數,這樣你就可以終止任何掛起的檔案訪問。
intr允許通知中斷一個NFS呼叫。當伺服器沒有應答需要放棄的時候有用處。
udp:使用udp作為nfs的傳輸協議(NFS V2只支援UDP)
tcp:使用tcp作為nfs的傳輸協議
namlen=n:設定遠端伺服器所允許的最長檔名。這個值的預設是255
acregmin=n:設定最小的在檔案更新之前cache時間,預設是3
acregmax=n:設定最大的在檔案更新之前cache時間,預設是60
acdirmin=n:設定最小的在目錄更新之前cache時間,預設是30
acdirmax=n:設定最大的在目錄更新之前cache時間,預設是60
actimeo=n:將acregmin、acregmax、acdirmin、acdirmax設定為同一個數值,預設是沒有啟用。
retry=n:設定當網路傳輸出現故障的時候,嘗試重新連線多少時間後不再嘗試。預設的數值是10000 minutes
noac:關閉cache機制。
同時使用多個引數的方法:mount -t nfs -o timeo=3,udp,hard 192.168.0.30:/tmp/nfs
請注意,NFS客戶機和伺服器的選項並不一定完全相同,而且有的時候會有衝突。比如說伺服器以只讀的方式匯出,客戶端卻以可寫的方式mount,雖然可以成功mount上,但當嘗試寫入的時候就會發生錯誤。一般伺服器和客戶端配置衝突的時候,會以伺服器的配置為準。

4、/etc/fstab的設定方法

若客戶機啟動就自動掛載伺服器的共享目錄,則需修改客戶機上的/etc/fstab檔案。

/etc/fstab的格式如下:
fs_spec   fs_file  fs_type   fs_options  fs_dump fs_pass 
fs_spec:該欄位定義希望載入的檔案系統所在的裝置或遠端檔案系統,對於/tmp這個引數一般設定為這樣:192.168.0.1:/tmp
fs_file:本地的掛載點
fs_type:對於NFS來說這個欄位只要設定成nfs就可以了
fs_options:掛載的引數,可以使用的引數可以參考上面的mount引數。
fs_dump - 該選項被"dump"命令使用來檢查一個檔案系統應該以多快頻率進行轉儲,若不需要轉儲就設定該欄位為0
fs_pass - 該欄位被fsck命令用來決定在啟動時需要被掃描的檔案系統的順序,根檔案系統"/"對應該欄位的值應該為1,其他檔案系統應該為2。若該檔案系統無需在啟動時掃描則設定該欄位為0。

修改系統的啟動檔案,讓系統重啟後執行fstab檔案引數中的掛載。
Redhat系統:
# vi /etc/rc.d/rc 在檔案的末尾行新增“/bin/ mount -a”
/bin/mount -a 此命令是在系統啟動後再去執行fstab中mount
注:/bin/mount –a命令要新增在exit0前面
重新啟動Linux後,使用mount檢視。

5、與NFS有關的一些命令介紹
nfsstat:
檢視NFS的執行狀態,對於調整NFS的執行有很大幫助
rpcinfo:
檢視rpc執行資訊,可以用於檢測rpc執行情況的工具。

四、NFS調優

調優的步驟:
1、測量當前網路、伺服器和每個客戶端的執行效率。
2、分析收集來的資料並畫出圖表。查詢出特殊情況,例如很高的磁碟和CPU佔用、已經高的磁碟使用時間
3、調整伺服器
4、重複第一到第三步直到達到你渴望的效能


與NFS效能有關的問題有很多,通常可以要考慮的有以下這些選擇:

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(32k)。
如果設定的值比較大的時候,應該最好在CLIENT上進入mount上的目錄中,進行一些常規操作(LS,VI等等),看看有沒有錯誤資訊出現。有可能出現的典型問題有LS的時候檔案不能完整的列出或者是出現錯誤資訊,不同的作業系統有不同的最佳數值,所以對於不同的作業系統都要進行測試。

設定最佳的NFSD的COPY數目。
linux中的NFSD的COPY數目是在/etc/rc.d/init.d/nfs這個啟動檔案中設定的,預設是8個NFSD,對於這個引數的設定一般是要根據可能的CLIENT數目來進行設定的,和WSIZE、RSIZE一樣也是要透過測試來找到最近的數值。

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在複雜的網路環境中保持最好的傳輸穩定性。
可以參考這篇文章:http: //

版本的選擇
V3作為預設的選擇(REDHAT 8預設使用V2,SOLARIS 8以上預設使用V3),可以透過vers=mountoption來進行選擇。
LINUX透過mount option的nfsvers=n進行選擇。

五、NFS故障解決

1、NFSD沒有啟動起來
首先要確認NFS輸出列表存在,否則nfsd不會啟動。可用exportfs命令來檢查,如果exportfs命令沒有結果返回或返回不正確,則需要檢查/etc/exports檔案。
2、mountd程式沒有啟動
mountd 程式是一個遠端過程呼叫(RPC),其作用是對客戶端要求安裝(mount)檔案系統的申請作出響應。mountd程式透過查詢/etc/xtab 檔案來獲知哪些檔案系統可以被遠端客戶端使用。另外,透過mountd程式,使用者可以知道目前有哪些檔案系統已被遠端檔案系統裝配,並得知遠端客戶端的列 表。檢視mountd是否正常啟動起來可以使用命令rpcinfo進行檢視,在正常情況下在輸出的列表中應該象這樣的行:
1000051 udp 1039 mountd
1000051 tcp 1113 mountd
1000052 udp 1039 mountd
1000052 tcp 1113 mountd
1000053 udp 1039 mountd
1000053 tcp 1113 mountd
如果沒有起來的話可以檢查是否安裝了PORTMAP元件。
rpm -qa|grep portmap
3、fstype 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、被防火牆阻擋
這個原因很多人都忽視了,在有嚴格要求的網路環境中,我們一般會關閉linux上的所有埠,當需要使用哪個埠的時候才會去開啟。而NFS預設是使用111埠,所以我們先要檢測是否開啟了這個埠,另外也要檢查TCP_Wrappers的設定。


六、NFS安全

NFS的不安全性主要體現於以下4個方面:

1、新手對NFS的訪問控制機制難於做到得心應手,控制目標的精確性難以實現
2、NFS沒有真正的使用者驗證機制,而只有對RPC/Mount請求的過程驗證機制
3、較早的NFS可以使未授權使用者獲得有效的檔案控制程式碼
4、在RPC遠端呼叫中,一個SUID的程式就具有超級使用者許可權.

加強NFS安全的方法:
1、合理的設定/etc/exports中共享出去的目錄,最好能使用anonuid,anongid以使MOUNT到NFS SERVER的CLIENT僅僅有最小的許可權,最好不要使用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 --dpor t111 -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引數來改變這個埠,這樣就可以在一定程度上增強安全性。
6、使用Kerberos V5作為登陸驗證系統。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/670493/viewspace-1024912/,如需轉載,請註明出處,否則將追究法律責任。

相關文章