29.3 網絡文件系統(NFS)
Reorganized and enhanced by Tom Rhodes. Written by Bill Swingle.網絡文件系統是FreeBSD支持的文件系統中的一種, 也被稱爲 NFS。 NFS允許一個系統在網絡上與它人共享目錄和文件。通過使用NFS,用戶和程序可以象訪問本地文件一樣訪問遠端系統上的文件。
以下是NFS最顯而易見的好處:
-
本地工作站使用更少的磁盤空間,因爲通常的數據可以存放在一臺機器上而且可以通過網絡訪問到。
-
用戶不必在每個網絡上機器裏頭都有一個home目錄。Home目錄 可以被放在NFS服務器上並且在網絡上處處可用。
-
諸如軟驅,CDROM,和 Zip® 之類的存儲設備可以在網絡上面被別的機器使用。這可以減少整個網絡上的可移動介質設備的數量。
29.3.1 NFS是如何工作的
NFS 至少包括兩個主要的部分:一臺服務器, 以及至少一臺客戶機, 客戶機遠程地訪問保存在服務器上的數據。要讓這一切運轉起來, 需要配置並運行幾個程序。
服務器必須運行以下服務:
服務 | 描述 |
---|---|
nfsd | NFS,爲來自NFS客戶端的 請求服務。 |
mountd | NFS掛載服務,處理nfsd(8)遞交過來的請求。 |
rpcbind | 此服務允許 NFS 客戶程序查詢正在被 NFS 服務使用的端口。 |
客戶端同樣運行一些進程,比如 nfsiod。 nfsiod處理來自NFS的請求。這是可選的,而且可以提高性能,對於普通和正確的操作來說並不是必須的。 參考nfsiod(8)手冊獲得更多信息。
29.3.2 配置NFS
NFS的配置過程相對簡單。這個過程只需要對/etc/rc.conf文件作一些簡單修改。
在NFS服務器這端,確認/etc/rc.conf 文件裏頭以下開關都配上了:
rpcbind_enable="YES" nfs_server_enable="YES" mountd_flags="-r"
只要NFS服務被置爲enable,mountd 就能自動運行。
在客戶端一側,確認下面這個開關出現在 /etc/rc.conf裏頭:
nfs_client_enable="YES"
/etc/exports文件指定了哪個文件系統 NFS應該輸出(有時被稱爲“共享”)。 /etc/exports裏面每行指定一個輸出的文件系統和哪些機器可以訪問該文件系統。在指定機器訪問權限的同時,訪問選項開關也可以被指定。有很多開關可以被用在這個文件裏頭,不過不會在這裏詳細談。您可以通過閱讀exports(5) 手冊來發現這些開關。
以下是一些/etc/exports的例子:
下面是一個輸出文件系統的例子, 不過這種配置與您所處的網絡環境及其配置密切相關。例如, 如果要把 /cdrom 輸出給與服務器域名相同的三臺計算機 (因此例子中只有機器名, 而沒有給出這些計算機的域名), 或在 /etc/hosts 文件中進行了這種配置。 -ro
標誌表示把輸出的文件系統置爲只讀。 由於使用了這個標誌,遠程系統在輸出的文件系統上就不能寫入任何變動了。
/cdrom -ro host1 host2 host3
下面的例子可以輸出/home給三個以IP地址方式表示的主機。對於在沒有配置DNS服務器的私有網絡裏頭,這很有用。 此外, /etc/hosts 文件也可以用以配置主機名;參看 hosts(5) 。 -alldirs
標記允許子目錄被作爲掛載點。也就是說,客戶端可以根據需要掛載需要的目錄。
/home -alldirs 10.0.0.2 10.0.0.3 10.0.0.4
下面幾行輸出 /a ,以便兩個來自不同域的客戶端可以訪問文件系統。 -maproot=root
標記授權遠端系統上的 root 用戶在被輸出的文件系統上以root身份進行讀寫。 如果沒有特別指定 -maproot=root 標記, 則即使用戶在遠端系統上是 root 身份, 也不能修改被輸出文件系統上的文件。
/a -maproot=root host.example.com box.example.org
爲了能夠訪問到被輸出的文件系統,客戶端必須被授權。 請確認客戶端在您的 /etc/exports 被列出。
在 /etc/exports 裏頭,每一行裏面,輸出信息和文件系統一一對應。一個遠程主機每次只能對應一個文件系統。而且只能有一個默認入口。比如,假設 /usr 是獨立的文件系統。這個 /etc/exports 就是無效的:
# Invalid when /usr is one file system /usr/src client /usr/ports client
一個文件系統,/usr, 有兩行指定輸出到同一主機, client. 解決這一問題的正確的格式是:
/usr/src /usr/ports client
在同一文件系統中, 輸出到指定客戶機的所有目錄, 都必須寫到同一行上。沒有指定客戶機的行會被認爲是單一主機。 這限制了你可以怎樣輸出的文件系統,但對絕大多數人來說這不是問題。
下面是一個有效輸出列表的例子, /usr 和 /exports 是本地文件系統:
# Export src and ports to client01 and client02, but only # client01 has root privileges on it /usr/src /usr/ports -maproot=root client01 /usr/src /usr/ports client02 # The client machines have root and can mount anywhere # on /exports. Anyone in the world can mount /exports/obj read-only /exports -alldirs -maproot=root client01 client02 /exports/obj -ro
在修改了 /etc/exports 文件之後, 就必須讓 mountd 服務重新檢查它, 以便使修改生效。一種方法是通過給正在運行的服務程序發送 HUP 信號來完成:
# kill -HUP `cat /var/run/mountd.pid`
或指定適當的參數來運行 mountd rc(8) 腳本:
# /etc/rc.d/mountd onereload
關於使用 rc 腳本的細節, 請參見 第 11.7 節。
另外, 系統重啓動可以讓 FreeBSD 把一切都弄好。 儘管如此, 重啓不是必須的。 以 root 身份執行下面的命令可以搞定一切。
在 NFS 服務器端:
# rpcbind # nfsd -u -t -n 4 # mountd -r
在 NFS 客戶端:
# nfsiod -n 4
現在每件事情都應該就緒,以備掛載一個遠端文件系統。 在這些例子裏頭,服務器名字將是:server ,而客戶端的名字將是: client。如果您只打算臨時掛載一個遠端文件系統或者只是打算作測試配置正確與否, 只要在客戶端以 root 身份執行下面的命令:
# mount server:/home /mnt
這條命令會把服務端的 /home 目錄掛載到客戶端的 /mnt 上。 如果配置正確,您應該可以進入客戶端的 /mnt 目錄並且看到所有服務端的文件。
如果您打算讓系統每次在重啓動的時候都自動掛載遠端的文件系統,把那個文件系統加到 /etc/fstab 文件裏頭去。下面是例子:
server:/home /mnt nfs rw 0 0
fstab(5) 手冊裏有所有可用的開關。
29.3.3 鎖
某些應用程序 (例如 mutt) 需要文件上鎖支持才能正常運行。在使用 NFS 時, 可以用 rpc.lockd 來支持文件上鎖功能。 要啓用它, 需要在服務器和客戶機的 /etc/rc.conf 中加入 (假定兩端均已配好了 NFS):
rpc_lockd_enable="YES" rpc_statd_enable="YES"
然後使用下述命令啓動該程序:
# /etc/rc.d/lockd start # /etc/rc.d/statd start
如果並不需要真的在 NFS 客戶機和 NFS 服務器間確保上鎖的語義, 可以讓 NFS 客戶機在本地上鎖, 方法是使用 mount_nfs(8) 時指定 -L
參數。 請參見 mount_nfs(8) 聯機手冊以瞭解更多細節。
29.3.4 實際應用
NFS 有很多實際應用。下面是比較常見的一些:
-
多個機器共享一臺CDROM或者其他設備。這對於在多臺機器中安裝軟件來說更加便宜跟方便。
-
在大型網絡中,配置一臺中心 NFS 服務器用來放置所有用戶的home目錄可能會帶來便利。這些目錄能被輸出到網絡以便用戶不管在哪臺工作站上登錄,總能得到相同的home目錄。
-
幾臺機器可以有通用的/usr/ports/distfiles 目錄。這樣的話,當您需要在幾臺機器上安裝port時,您可以無需在每臺設備上下載而快速訪問源碼。
29.3.5 通過 amd 自動地掛接
Contributed by Wylie Stilwell. Rewritten by Chern Lee.amd(8) (自動掛接服務) 能夠自動地在訪問時掛接遠程的文件系統。 如果文件系統在一段時間之內沒有活動, 則會被 amd 自動卸下。 通過使用 amd,能夠提供一個持久掛接以外的選擇, 而後者往往需要列入 /etc/fstab。
amd 通過將自己以 NFS 服務器的形式, 附加到 /host 和 /net 目錄上來工作。當訪問這些目錄中的文件時, amd 將查找相應的遠程掛接點,並自動地掛接。 /net 用於掛接遠程 IP 地址上導出的文件系統, 而 /host 則用於掛接遠程主機名上的文件系統。
訪問 /host/foobar/usr 中的文件, 相當於告訴 amd 嘗試掛接在主機 foobar 上導出的 /usr。
例 29-2. 通過 amd 來掛接導出的文件系統
您可以通過使用 showmount 命令來查看遠程主機上導出的文件系統。例如, 要查看 foobar 上導出的文件系統, 可以用:
% showmount -e foobar Exports list on foobar: /usr 10.10.10.0 /a 10.10.10.0 % cd /host/foobar/usr
如同在前面例子中所看到的, showmount 顯示了導出的 /usr。 當進入 /host/foobar/usr 這個目錄時, amd 將嘗試解析主機名 foobar 並自動地掛接需要的文件系統導出。
amd 可以通過啓動腳本來啓動, 方法是在 /etc/rc.conf 中加入:
amd_enable="YES"
除此之外, 還可以給 amd 通過 amd_flags
選項來傳遞額外的參數。 默認情況下, amd_flags
爲:
amd_flags="-a /.amd_mnt -l syslog /host /etc/amd.map /net /etc/amd.map"
/etc/amd.map 文件定義了掛接導出文件系統時所使用的默認選項。 /etc/amd.conf 文件, 則定義了更多關於 amd 的高級功能選項。
請參考 amd(8) 和 amd.conf(5) 聯機手冊,以瞭解進一步的情況。
29.3.6 與其他系統集成時的常見問題
Contributed by John Lind.某些特定的 ISA PC 系統上的以太網適配器上有一些限制,這些限制可能會導致嚴重的網絡問題, 特別是與 NFS 配合使用時。 這些問題並非 FreeBSD 所特有的, 但 FreeBSD 系統會受到這些問題的影響。
這樣的問題, 幾乎總是在當 (FreeBSD) PC 系統與高性能的工作站, 例如 Silicon Graphics, Inc., 和 Sun Microsystems, Inc. 的工作站聯網時發生。 NFS 掛接能夠正常工作,而且一些操作也可能成功, 但服務器會很快變得對客戶機不太理會,雖然對其他客戶機的請求仍然能夠正常處理。 這種情況通常發生在客戶端, 無論它是一個 FreeBSD 系統或是終端。 在許多系統上, 一旦發生了這樣的問題, 通常沒辦法正常地關閉客戶機。唯一的辦法通常是讓終端復位, 因爲這一 NFS 狀況沒有辦法被解決。
儘管 “正確的” 解決辦法, 是爲 FreeBSD 系統配備一塊高性能的、適用的以太網適配器, 然而也有辦法繞過問題並得到相對滿意的結果。 如果 FreeBSD 系統是 服務器, 則在客戶機掛接時, 應該指定 -w=1024
。 如果 FreeBSD 系統是 客戶機, 則應加入 -r=1024
參數。這些選項可以通過在對應的 fstab 的第四個字段加入,以便讓客戶機能夠自動地掛接, 或者通過 mount(8) 的 -o
參數在手工掛接時指定。
還需要注意的是另一個問題, 有時會被誤認爲是和上面一樣的問題。 這個問題多見於 NFS 服務器和客戶機在不同的網絡上時。 如果是這種情況, 一定要 確定 您的路由器確實把必需的 UDP 信息路由到了目的地, 否則您將什麼也做不了。
下面的例子中, fastws 是主機 (接口) 的名字,它是一臺高性能的終端, 而 freebox 是另一臺主機 (接口) 的名字,它是一個使用較低性能的以太網適配器的 FreeBSD 系統。 同時, /sharedfs 將被導出成爲 NFS 文件系統 (參見 exports(5)), 而 /project 將是客戶機上掛接這一導出文件系統的掛接點。所有的應用場景中, 請注意附加選項, 例如 hard
或 soft
以及 bg
可能是您的應用所需要的。
關於 FreeBSD 系統 (freebox) 作爲客戶機的示範 /etc/fstab 文件, 見於 freebox 之上:
fastws:/sharedfs /project nfs rw,-r=1024 0 0
在 freebox 上手工掛接:
# mount -t nfs -o -r=1024 fastws:/sharedfs /project
以 FreeBSD 系統作爲服務器的例子, 是 fastws 上的 /etc/fstab:
freebox:/sharedfs /project nfs rw,-w=1024 0 0
在 fastws 上手工掛接的命令是:
# mount -t nfs -o -w=1024 freebox:/sharedfs /project
幾乎所有的 16-位 以太網控制器, 都能夠在沒有上述讀寫尺寸限制的情況下正常工作。
對於那些關心到底是什麼問題的人, 下面是失敗如何發生的解釋,同時這也說明了爲什麼這是一個無法恢復的問題。 典型情況下, NFS 會使用一個 “塊” 爲單位進行操作, 其尺寸是 8 K (雖然它可能會將操作分成更小尺寸的分片)。由於最大的以太網包尺寸大約是 1500 字節, 因此 NFS “塊” 會分成多個以太網包,雖然在更高層的代碼看來它仍然是一個完整的單元, 並在接收方重新組裝, 作爲一個整體來 確認。 高性能的工作站, 可以將構成 NFS 單元的包迅速發出, 其節奏會快到標準允許的最大限度。 在容量較小的卡上,後來的包會沖掉同一單元內的較早的包, 因而整個單元無法被重建或確認。 其結果是,工作站將超時並重試, 但仍然是完整的 8 K 單元, 這一過程將無休止地重複下去。
如果將單元尺寸限制在以太網包尺寸之下,我們就能夠確保每一個以太網包都能夠被獨立地接收和確認, 從而避免了上面的死鎖情形。
溢出在高性能工作站將數據庫投向 PC 系統時仍會發生, 但在更好的網卡上,能夠保證這類溢出不會在每一個 NFS “單元” 上都發生。 當出現溢出時, 被影響的單元被重傳,因而此時有很大的機會它將被正確接收、 重組, 並確認。