2009年9月29日 星期二

網絡文件系統(NFS)

網絡文件系統(NFS)

轉載

在眾多的文件系統中,FreeBSD的支持的是非常獨特的,那就是網絡文件系統(NFS)。NFS可以使一台或几台机器通過網絡共享目錄或文件。使用NFS,用戶和程序能夠訪問遠程系統上的文件就如同訪問本地的一樣。

NFS有以下几種特性: 
本地工作站無須太多磁盤空間,因為常用的數据被存放在單一的机器上並且還會剩余一些空間可被網絡上的其它人訪問。

在網絡上,每個用戶不一定需要有唯一的home目錄。一旦建立一個可以通過NFS使用的目錄,那麼它可以被網絡上任何處訪問。 

像軟盤和CD-ROM能夠在網絡上被其它机器訪問,而不需要額外的硬件。 

它如何工作 
NFS由兩個方面組成--客戶端和服務器端。考慮到它們的聯系,客戶端需要服務器端所擁有的數据。服務器與客戶共享數据。為了這個系統正常地工作,少數進程不得不在限制下運行。 

服務器必須運行以下几個守護進程: 
nfsd--NFS的守護進程,它響應客戶的請求。 
mountd--NFS Mount守護進程,真正實現nfsd傳遞給它的客戶請求。 

客戶端只需要運行一個守護進程: 
nfsiod--NFS异步I/O守護進程,響應從NFS服務器來的請求。 

設置NFS 
非常幸運,在FreeBSD系統上設置它是非常容易的。只需通過极少的修改/etc/rc.conf文件,就可以在啟動時運行這個進程了。 

在NFS服務器上,請确定你有: 
nfs_server_enable="YES" 
nfs_server_flags="-u -t -n 4" 
mountd_flags="-r" 
每當NFS服務器啟動時,mountd就自動運行了。-u和-t標志,告訴nfsd是否服務于UDP和TCP的客戶端。-n 4標志,告訴nfsd運行自己的4個相同的拷貝。 

在客戶端,确定你有: 
nfs_client_enable="YES" 
nfs_client_flags="-n 4" 
像nfsd,-n 4告訴nfsiod運行自己的4個拷貝。 

最后一個設置是要求你建立一個叫作/etc/exports的文件。這個文件指定你的服務器使用何種文件系統,以及哪几個客戶端將要共享。這個文件中的每一行指定一個需要被共享的文件系統。在文件可以使用的這些選擇是比較煩的,但只需要涉及其中一部分。你可以查找man page。 

這兒有几個例子: 
以下的几行輸出/cdrom到三個"笨"机器上,它們有相同的域名,或者在你的/etc/hosts文件中登錄過。-ro標志使得共享的文件系統只讀,通過這個標志,遠程系統將不可能在共享文件系統上作任何更改。 
/cdrom -ro moe larry curly 
下一行輸出/home通過IP地址到三台主机。這是一個非常有用的設置,如果你有一個私有的網絡,但沒有DNS。-alldirs標志可以使指定的文件系統中的所有目錄被輸出。 
/home -alldirs 10.0.0.2 10.0.0.3 10.0.0.4 
下一行輸出/a到兩台机器上,它們與NFS服務器在不同域上。-maproot=0標志允許在遠程系統上的root用戶,使用root權限向共享文件系統寫入。除去-maproot=0標志,即使一些人有root權限訪問遠程系統,但它們不可以修改共享文件系統。 
/a -maproot=0 host.domain.com box.example.com 
為了使客戶能夠共享一個輸出的文件系統,它必須有這個權限。确定你的客戶列表在你的/etc/exports文件中。 
現在你已經改動了設置,你可以reboot並且在啟動時運行了。或者你也可以在命令行下輸入: 

在NFS服務器上: 
# nfsd -u -t -n 4 
# mountd -r 
在NFS客戶上: 
# nfsiod -n 4 
現在你已經准備真正地挂起一個遠程文件系統。有兩種方法。在這個例子中,服務器名字是server,而客戶端是client。如果你只是臨時挂起一個遠程文件系統或希望測試一下你的設置,你可以在客戶机的命令行下,以root的權限輸入: 
# mount server:/home /mnt 
這樣將挂起在server上的/home到client的/mnt。如果一切都設置正确,那麼你可以在/mnt下看見server上的文件. 
如果你愿意每次啟動時都挂起一人遠程文件系統,那麼你就需要修改你的/etc/fstab文件.例如: 
server:/home /mnt nfs rw 0 0 
更多細節請參見fstab的man page. 


實際使用 

NFS有許多非常"酷"的用途.我在我管理的網絡上大量使用它.以下只是我使用它的一部分方法:. 

在網絡上,有好几台机器,但是只有一台机器有CD-ROM.為什麼?因為我使用NFS使用所有的机器共享CD-ROM.而對于軟驅其實也一樣. 

如此多的机器,而你的個人文件就存儲地非常地分散了.我使用一台中央NFS服務器存儲了所有的用戶的home目錄,並且與其它机器一起共享它們,所以無論從何處登錄,我總是有相同的home目錄. 

當你准備在其中的一台机器上重新安裝FreeBSD,使用NFS是一種方法.只要將光盤放入你的文件服務器,然后一切照舊. 
我有一個公共目錄:/usr/ports/distfiles,所有的机器都共享它.這樣,當我將要在一台已經安裝過某個port的机器上安裝這個port時,我不需要重新再下載一遍所有的源文件. 

問題匯總 
某些ISA的以太網卡可能會引起一些問題,特別是在NFS上.這些困難在FreeBSD上並不特別明顯,但系統可能會受影響. 

這些問題几乎總是發生在以及聯網的高性能工作站上,例如Sun公司的机器.NFS挂起將會工作非常好,一些操作也是成功的,但是突然server對client沒有了響應,即使另外的系統請求繼續被響應.這些問題通常在client系統上,無論client是FreeBSD或者是其它的工作站.許多系統上,一旦這個問題出現,系統將無法正常關閉.唯一的解決方法就是經常重置client,因為NFS的情況不能解決. 
盡管這個"正确"的解決方法是對付運行FreeBSD的高性能工作站,但這也是一個簡單的安全的方法.如果FreeBSD系統是server,client運行時要有參數-w=1024.如果FreeBSD是client,那麼挂起NFS文件系統時,要有參數-r=1024.如果需要在client上自動挂起NFS,這些選擇需要在fstab的第四個域中輸入,或使用mount命令的-o參數手動挂起. 

需要注意的是,在NFS server和client在不同的網絡上時,這個問題也會出現.如果是這個原因,請确定你的路由器有必須支持UDP信息. 

下例中,fastws是高性能工作站的host名,freebox是一台有低效率網卡的FreeBSD系統.當然,/sharedfs將作為NFS文件系統,而在client上就是/project.在所用情況下,注意附加選項. 

將freebox作為client:在/etc/fstab中輸入 
fastws:/sharedfs /project nfs rw,-r=1024 0 0 
如果是手工挂起: 
# mount -t nfs -o -r=1024 fastws:/sharedfs /project 
將freebox作為server,在fastws的/etc/fstab中輸入: 
freebox:/sharedfs /project nfs rw,-w=1024 0 0 
如果需要手工挂起: 
# mount -t nfs -o -w=1024 freebox:/sharedfs /project 
几乎任何16-bit以太網卡不需要以上的關于讀寫的限制. 

對于細心的人,可能已經看出,何處出了這種錯誤,也就說明了此處為什麼不可恢復正常的原因了.NFS是典型的每塊8K的文件系統.(當然也可以優化成更小的).當最大的數据包在1500字節時,NFS的塊被分成几個數据包,盡管它對于上層協議來說,還是一個獨立的需要接收,确認並且組合的單元.高性能工作站能夠從組成NFS單元的一個個緊接著的小包中還原這個包.在低效率的網卡中,后面的小包由于超時在與其在相同NFS單元中前面的小包到達目的地之前就會溢出,使用得整個單元不能被還原,並且不會發出确認信號.結果,工作站會超時,並且會重新再試一次,但是以8K一個單元,還是出現以上的錯誤,就這樣永遠休止. 

使單元的大小小于數据包的尺寸限制,這樣就可以确保信號會被接收,並且收到确認信號,從而避免以上局面. 

當高性能服務器對一台配有高效的網卡的机器輸入數据時,超時溢出仍會發生,但是這種超時溢出與以上所述的NFS的單元錯誤並不相同.當超時溢出發生時,受到影響的單元會被重傳,而這次是它們被接收,确認,還原可能會成功. 

沒有留言:

張貼留言