NFS中的mount應用
在NFS的設置中,我們常會接觸到mount的使用。那么對于mount的操作我們應該如何進行呢?為了在同時出現多個NFS版本導出時有效地實現統一裝載,您必須具備一個NFS裝載工具.了解通用NFS裝載工具如何幫助減少多個NFS版本的處理,并簡化這些版本的管理.本文描述通用NFS裝載的概念,并且概括地介紹這個系統的優勢及其應用.此外,本文還給出一些總體設計細節.
網絡文件系統(Network File System,NFS)是一個常用的分布式文件系統,它使遠程客戶機能夠在服務器上執行文件操作.通過使用 export 操作,服務器就使外部機器能夠訪問它的目錄和文件系統.為了訪問這些目錄,客戶機將導出的目錄或文件系統 mount(裝載)到它的本地目錄結構中.在已裝載的目錄內部,客戶機能夠像訪問本地文件一樣訪問遠程文件.到目前為止,NFS 在導出和裝載目錄或文件系統方面支持 3 個版本:版本 2、3 和 4.
在本文中,我們演示如何使用通用NFS裝載工具將所有現有的NFS版本的導出和裝載合并到一個無縫的機制中.讓我們考慮這樣一個場景:服務器為 3 個版本的NFS導出目錄項.目前,如果客戶機要訪問所有這些項,它必須在不同的裝載點分開裝載每個項.盡管NFS版本 4 提供的偽樹(pseudo-tree)機制能夠一次裝載所有 NFSv4 導出項,但它僅適用于由該版本生成的項.雖然版本 4 能夠進行一次性裝載(存在偽樹時),但是客戶機必須分開裝載版本 2 和 3 的項.
通用NFS裝載工具實際上是 mount 命令的包裝器,它使用戶能夠通過一個命令從特定服務器裝載所有導出項.因為改動NFS服務器不太好,所以這個包裝器在客戶機(對用戶是透明的)內部分別執行不同的 mount.
看看NFS服務器上的目錄結構,如圖 1 所示:
圖 1. 服務器上的目錄結構
在這個場景中,需要在客戶機中執行以下 mount:
◆一個 NFSv4 mount:裝載 NFSv4 偽樹(Fileset1 和 Fileset2).NFSv4 偽樹特性允許 NFSv4 客戶機在偽樹中對所有導出的項僅執行一個 mount 操作.
◆兩個 NFSv3 mount:裝載 Tools 和 Docs.
◆一個 NFSv3 mount:裝載 Binaries.
使用NFS裝載工具可以將這些裝載合并為一個裝載.使用命令:
gennfsmount <NFS server> <mountpoint>
使用通用NFS裝載工具有以下優點:
◆用戶僅需進行一次裝載就能訪問服務器上的所有信息;以前不支持這個功能.
◆假如有這樣一個服務器,它不僅導出版本 2 和 3 的舊文件集,還導出版本 4 的新文件集.客戶機能夠通過一個操作訪問所有這些文件集并執行安裝.
◆使用這個通用工具改善了在特定服務器或特定導出目錄/文件系統中的搜索.
◆因為這個工具能夠自動隔離基于版本的NFS導出,所以用戶不再需要管理這些不同的裝載點.
◆NFS 管理員能夠在服務器上保留舊的NFS版本導出,因為僅需使用 mount 命令就可以像訪問新版本數據項一樣訪問它們.
使用 automount 工具也能夠獲得類似的結果,但它需要管理員對 automount 進行許多配置才能獲得所需的NFS裝載.automount 的 hostmap 特性聲稱能夠從服務器 mount 所有導出項,并且不需要管理員進行任何配置,但使用 hostmap 裝載 NFSv4 項時會出現問題.另外,它對 /etc/hosts 文件中列出的所有服務器都進行操作.它不能在單個裝載點上裝載特定服務器導出的所有項.總體而言,通用NFS裝載機制是最方便的.接下來,我們看看在實現通用NFS裝載工具的過程中的一些設計決策.#p#
設計實現細節
我們先看一下通用NFS裝載系統的基礎架構.通用NFS裝載工具從內部向服務器發送一個請求,要求訪問所有導出項.
圖 2. 通用NFS裝載工具請求訪問所有導出項
收到服務器的回復之后,將執行清單 1 中的算法:
清單 1. 通用NFS裝載工具的算法
Start
Create temporary directories for all versions.
Initialize list of mount security flavors.
Embed this list in each internal mount operation.
For each item in the export-list
Do
Mount internally for every NFSv2 and NFSv3 export
Update internal log
End for
Mount internally only once for NFSv4 export.
Update internal log
Stop
security flavors 是一個由逗號分隔的安全方法列表(sys、krb5 和 krb5i 等).在裝載點的 read/write 操作期間將用到這些方法.這個列表用于匹配服務器支持的安全方法.此外,隨后在該裝載點下發生系統調用時也用到該列表.相應的導出項的NFS版本也可以使用類似的機制.
當所有內部裝載完成時,將使用 UnionFS 合并所有內部目錄,如清單 2 所示.
清單 2. 使用 UnionFS 合并所有內部目錄
mount -t unionfs -o dirs=<temp_dir1>[:<temp_dir2>...] none <mount-point>
還記得 前一個場景嗎?在前面的場景中,客戶機上有一個針對 v4 偽樹的 NFSv4 裝載,兩個針對 Tools and Docs 的 NFSv3 裝載,一個針對 Binaries 的 NFSv3 裝載,并且我們使用通用NFS裝載工具 —gennfsmount <NFS server> <mountpoint>— 將它們合并到一個裝載中.在這個例子中,將創建以下臨時目錄:
◆/tmp/NFSv4
◆/tmp/NFSv3/Tools
◆/tmp/NFSv3/Docs
◆/tmp/NFSv2/Binaries
然后使用 unionfs 合并它們,如清單 3 所示:
清單 3. 使用 unionfs 進行合并
mount -t unionfs -o dirs=/tmp/NFSv4:/tmp/NFSv3:/tmp/NFSv2 none /mnt
這會生成以下目錄結構:
圖 3. unionfs 生成的目錄結構
接下來,我們看看如何使用這個系統.#p#
tips:
UnionFS
UnionFS 是針對 Linux和 FreeBSD 的文件系統服務,它允許透明地覆蓋獨立的文件系統(即分支)的文件和目錄以構成一個連貫的文件系統,從而實現統一裝載文件系統.對于具有相同路徑的目錄的內容,將出現在生成的文件系統的一個合并目錄中.針對 Linux 的 UnionFS 有兩個版本:
◆Version 1.x 是獨立的,可以作為模塊構建.
◆Version 2.x 是***的;它經過重新設計和實現,并且是 Andrew Morton 的 Linux -mm 樹的一部分(因此它應該出現在主資源樹中).
使用這個系統
在這個場景中,NFS 服務器導出屬于不同NFS版本的不同項.不過在客戶機上僅執行一個裝載:通用NFS裝載.圖 4 顯示了服務器導出的項.
圖 4. 在服務器上導出的項
在這里,服務器導出 5 個屬于不同NFS版本的NFS項.nfs4_A 和 nfs4_B 構成一個 NFSv4 偽樹(/nfs4_A 和 /nfs4_A/nfs4_B).其余的是版本 2 和 3 的NFS導出項.
圖 5 顯示了服務器上的文件.
圖 5. 服務器上的文件
在這個場景中,僅需使用一個裝載操作,客戶機就可以訪問不同裝載目錄下的文件.不過,在這個系統中,用戶使用一個裝載操作就可以在一個目錄結構中訪問所有這些文件.
圖 6 顯示了使用通用NFS裝載工具后的客戶機輸出:
圖 6. 通用NFS裝載工具的輸出
如您所見,圖 6 顯示了由通用NFS裝載工具執行的多個內部裝載./mnt 目錄合并了所有NFS裝載.
結束語
至此,我們已經演示了通用NFS裝載工具的架構和機制.這個工具不僅為NFS服務器上的文件提供更容易的單點訪問,而且為NFS空間提供更加緊湊的視圖,因此它是NFS客戶機的好幫手.