FreeBSD上的NFS

火星人 @ 2014-03-12 , reply:0


  在眾多的文件系統中,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的單元錯誤並不相同.當超時溢出發生時,受到影響的單元會被重傳,而這次是它們被接收,確認,還原可能會成功.





[火星人 via ] FreeBSD上的NFS已經有136次圍觀

http://www.coctec.com/docs/unix/show-post-73992.html