1、NFS簡介 linux
NFS-Network FileSystem的縮寫,NFS是由Sun開發並發展起來的一項用於在不一樣機器,不一樣操做系統之間經過網絡互相分享各自的文件。NFS server也能夠看做是一個FILE SERVER,它可讓你的PC經過網絡將遠端得NFS SERVER共享出來的檔案MOUNT到本身的系統中,在CLIENT看來使用NFS的遠端文件就象是在使用本地文件同樣。 安全
NFS協議從誕生到如今爲止,已經有多個版本,如NFS V2(rfc1094),NFS V3(rfc1813)(最新的版本是V4(rfc3010)。 服務器
2、各NFS協議版本的主要區別 網絡
V3相對V2的主要區別: 併發
1、文件尺寸 app
V2最大隻支持32BIT的文件大小(4G),而NFS V3新增長了支持64BIT文件大小的技術。 異步
2、文件傳輸尺寸 async
V3沒有限定傳輸尺寸,V2最多隻能設定爲8k,可使用-rsize and -wsize 來進行設定。 tcp
3、完整的信息返回 ide
V3增長和完善了許多錯誤和成功信息的返回,對於服務器的設置和管理能帶來很大好處。
4、增長了對TCP傳輸協議的支持
V2只提供了對UDP協議的支持,在一些高要求的網絡環境中有很大限制,V3增長了對TCP協議的支持
*5、異步寫入特性
6、改進了SERVER的mount性能
7、有更好的I/O WRITES 性能。
9、更強網絡運行效能,使得網絡運做更爲有效。
10、更強的災難恢復功能。
異步寫入特性(v3新增長)介紹:
NFS V3 可否使用異步寫入,這是可選擇的一種特性。NFS V3客戶端發發送一個異步寫入請求到服務器,在給客戶端答覆以前服務器並非必需要將數據寫入到存儲器中(穩定的)。服務器能肯定什麼時候去寫入數據或者將多個寫入請求聚合到一塊兒並加以處理,而後寫入。客戶端能保持一個數據的copy以防萬一服務器不能完整的將數據寫入。當客戶端但願釋放這個copy的時候,它會向服務器經過這個操做過程,以確保每一個操做步驟的完整。異步寫入可以使服務器去肯定最好的同步數據的策略。使數據能儘量的同步的提交何到達。與V2比較來看,這樣的機制能更好的實現數據緩衝和更多的平行(平衡)。而NFS V2的SERVER在將數據寫入存儲器以前不能再相應任何的寫入請求。
V4相對V3的改進:
1:改進了INTERNET上的存取和執行效能
2:在協議中加強了安全方面的特性
3:加強的跨平臺特性
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
pc.nfsd:主要複雜登錄權限檢測等。
rpc.mountd:負責NFS的檔案系統,當CLIENT端經過rpc.nfsd登錄SERVER後,對clinet存取server的文件進行一系列的管理
NFS SERVER在REDHAT 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:在登入 NFS 主機使用分享之目錄的使用者若是是 root 時,那麼這個使用者的權限將被壓縮成為匿名使用者,一般他的 UID 與 GID 都會變成 nobody 那個身份;
all_squash:無論登錄NFS主機的用戶是什麼都會被從新設定爲nobody。
anonuid:將登入NFS主機的用戶都設定成指定的user id,此ID必須存在於/etc/passwd中。
anongid:同 anonuid ,可是變成 group 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
exportfs命令:
若是咱們在啓動了NFS以後又修改了/etc/exports,是否是還要從新啓動nfs呢?這個時候咱們就能夠用exportfs命令來使改動馬上生效,該命令格式以下:
exportfs [-aruv]
-a :所有mount或者unmount /etc/exports中的內容
-r :從新mount /etc/exports中分享出來的目錄
-u :umount 目錄
-v :在 export 的時候,將詳細的信息輸出到屏幕上。
具體例子:
[root @test root]# 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/test to kernel
exportfs -au <==所有都卸載了。
客戶段的操做:
1、showmout命令對於NFS的操做和查錯有很大的幫助,因此咱們先來看一下showmount的用法
showmout
-a :這個參數是通常在NFS SERVER上使用,是用來顯示已經mount上本機nfs目錄的cline機器。
-e :顯示指定的NFS SERVER上export出來的目錄。
例如:
showmount -e 192.168.0.30
Export list for localhost:
/tmp *
/home/linux *.linux.org
/home/public (everyone)
/home/test 192.168.0.100
2、mount nfs目錄的方法:
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來運行X PROGRAM的話,你絕對不會但願因爲一些意外的狀況(如網絡速度一會兒變的很慢,插拔了一下網卡插頭等)而使系統輸出大量的錯誤信息,若是此時你用的是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 VER 3
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的格式以下:
fs_spec fs_file fs_type fs_options fs_dump fs_pass
fs_spec:該字段定義但願加載的文件系統所在的設備或遠程文件系統,對於nfs這個參數通常設置爲這樣:192.168.0.1:/NFS
fs_file:本地的掛載點
fs_type:對於NFS來講這個字段只要設置成nfs就能夠了
fs_options:掛載的參數,可使用的參數能夠參考上面的mount參數。
fs_dump - 該選項被"dump"命令使用來檢查一個文件系統應該以多快頻率進行轉儲,若不須要轉儲就設置該字段爲0
fs_pass - 該字段被fsck命令用來決定在啓動時須要被掃描的文件系統的順序,根文件系統"/"對應該字段的值應該爲1,其餘文件系統應該爲2。若該文件系統無需在啓動時掃描則設置該字段爲0 。
5、與NFS有關的一些命令介紹
nfsstat:
查看NFS的運行狀態,對於調整NFS的運行有很大幫助
rpcinfo:
查看rpc執行信息,能夠用於檢測rpc運行狀況的工具。
4、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。
若是設置的值比較大的時候,應該最好在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://www.hp.com.tw/ssn/unix/0212/unix021204.asp
版本的選擇
V3做爲默認的選擇(RED HAT 8默認使用V2,SOLARIS 8以上默認使用V3),能夠經過vers= mount option來進行選擇。
LINUX經過mount option的nfsvers=n進行選擇。
5、NFS故障解決
1、NFSD沒有啓動起來
首先要確認 NFS 輸出列表存在,不然 nfsd 不會啓動。可用 exportfs 命令來檢查,若是 exportfs 命令沒有結果返回或返回不正確,則須要檢查 /etc/exports 文件。
2、mountd 進程沒有啓動
mountd 進程是一個遠程過程調用 (RPC) ,其做用是對客戶端要求安裝(mount)文件系統的申請做出響應。mountd進程經過查找 /etc/xtab文件來獲知哪些文件系統能夠被遠程客戶端使用。另外,經過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、cant 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的設定。
6、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 --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參數來改變這個端口,這樣就能夠在必定程度上加強安全性。
6、使用Kerberos V5做爲登錄驗證系統