作者:馬路遙 網絡文件服務器(Network File System,簡稱 NFS)是 Linux 上最容易配置的服務之一。盡管它的規則簡單,卻有著豐富的內涵。本刊今年第 2 期曾經介紹了如何構建 Linux 上的NFS服務器。但 NFS 還有許多 Unix/ Linux 愛好者,甚至系統管理員應該注意的特別之處。本文旨在幫助讀者更深入地了解 NFS。 NFS Server 的配置 首先介紹一下 Server 端和 NFS 相關文件的含義: ◆ /etc/eXPorts 是 NFS Server 最基本的配置文件之一,文件中列出了共享的文件系統和允許訪問這些文件系統的主機。這個文件可以用通配符或網段,以及一組主機名的形式來表示客戶機列表。它有很大的靈活性,一般由系統管理員配置。 ◆ /proc/fs/nfs/exports 導出文件列表的內核視圖,包括導出的參數。 ◆ /var/lib/nfs/etab 狀態文件,其中列出了當前的高級列表。此文件包含了 /etc/exports 中相同格式的所有項目,同時包含了由 exportfs -i 手工導入的項目。 ◆ /var/lib/nfs/rmtab 狀態文件,列出了掛接導出文件的遠程客戶機清單。 ◆ var/lib/nfs/xtab 狀態文件,當前的低級導出清單。 例如,/etc/exports 有下列一行 /data *.flying.com.cn (rw),顯然有多個主機可以匹配這個域。如果兩個主機,如 mail.flying.com.cn 和 FTP.flying.com.cn 都請求訪問該文件系統,則 /var/lib/nfs/xtab 文件包含了這個文件系統的兩個基本相同的項目。 /etc/exports 是純文本文件,空行和以 “#” 開頭的行會被忽略,長行可以用斜槓 “/” 分解為多行。文件中列出了允許 NFS 客戶機訪問服務器的文件系統,定義了導出文件系統和訪問權限。 /etc/exports 文件中任意行的格式如下: vol_name host_name1(option1,opeion2....) host_name2(option1,option2) 其中 vol_name(卷名)表示要導出的文件系統,除去卷名以外,其它參數都可以不寫,不顯示指出的參數都會采用缺省參數。host_name1 ( 主機名 ) 如果不寫的話,則任何主機都可以請求該文件系統。主機名的定義非常靈活,既可以指定某台主機,也可以指定一組主機。可以用下列四種方法來描述: ◆ 單個主機 可以用短名及完全限定名,或者用IP地址,例如 student01、student01.flying.com.cn 或者 192.168.10.1 都是合法的主機名。 ◆ 網組 可以列出 /etc/netgroup 文件中或 NFS 網組映射中定義的整組主機。網組名以 “@” 開頭,例如 @teacher 或 @students。 ◆ 通配符主機 用通配符可以列出一個域中的所有主機器,通配符可以使用 “*” 和 “?”、“*” 匹配 0 個或多個字符及 “?” 匹配一個字符,但通配符不能匹配主機名中的點號。*.flying.com.cn 可以匹配 ftp01.flying.com.cn,但不能匹配 backup.ftp01.flying.com.cn,而 *.*.flying.com.cn 就可以匹配 backup.ftp01.flying.com.cn。 ftp??.flying.com.cn可以匹配 ftp01.flying.com.cn 和 ftp02.flying.com.cn。 ◆ 主機網絡 可以用主機網絡的方式導出特定的子網或幾個子網,用 192.168.10.0/255.255.255.0 的方式可以匹配從 192.168.10.1 到 192.168.10.255 所有主機。導出選項用逗號分隔,但不能包含空格,長度可以任意設定。多數選項都是布爾選項,值為 True 或 False,選項與性能或者安全性有關。當 /etc/exports 文件沒有給出值時,系統會自動采用缺省值。選項的詳細用法可以用 man exportfs 命令來獲得。 更改 /etc/exports 文件後,可以用 exportfs 命令將文件的改變告訴服務器,也可以忽略 /etc/exports 文件,直接使用 exportfs 命令導出共享卷。exportfs 可以指定導出或非導出卷時影響的選項,可以影響一個卷或幾個卷的選項,見表1。 NFS 鎖及遠程配額監控程序 在 Unix 中可以鎖定文件,保證不會有兩個用戶同時寫入文件的同一部分,以確保數據的一致。保證一致性的關鍵是內核要仲裁鎖定和寫入請求。 而在 NFS/Samba 之類的分布式文件系統中,許多客戶可能同時要求寫入和鎖定同一文件。此時,只有服務器本身能扮演仲裁的角色。Unix/ Linux 的方法是增加一個 RPC 協議處理鎖操作,這就是 NFS 鎖監控程序 (NLM, NFS Lock Manager)。通常不需要關心它的具體運行方式,將此服務打開即可。 rpc.rquotad 監控程序實現 RQUOTA 協議,在 Linux 中 NFS 服務器總是執行配額,不管是否運行了 rpc.rquotad。 啟動和關閉 NFS Server 的順序 1. 啟動 NFS Server /etc/rc.d/init.d/portmap start /etc/rc.d/init.d/nfslock start /etc/rc.d/init.d/nfs start 其實,讀者可以根據 /etc/rc.d/rc3.d或 rc5.d 下的文件裡,以 “S” 開頭的帶有 portmap、nfslock nfs 的文件中數字的大小來判斷哪個服務應該優先啟動。在筆者的機器上,它們分別是 S13portmap、S14nfslock 和 S60nfs,這幾個數字清楚地表明了以上啟動的順序。 2. 關閉 NFS Server 的順序 /etc/rc.d/init.d/nfslock stop /etc/rc.d/init.d/nfs stop /etc/rc.d/init.d/portmap stop 如果在客戶端取消掛接前關閉 NFS Server, 顯而易見會發生錯誤,因此應該盡量避免。 NFS Client 的配置 配置 NFS 客戶機,可以通過配置 /etc/fstab 文件或運行 mount 命令來進行。 對於那些需要在啟動時就掛接的文件系統而言,往往將其寫入 /etc/fstab 文件中,其中要包括 NFS 服務器的主機名或 IP 地址、文件系統、掛接點、選項等。對於那些臨時需要的 NFS 共享卷來說,則多數會使用 mount 命令將其手動掛接。這兩種方法的參數使用基本上是一樣的。下面就以 /etc/fstab 文件為例,說明掛接 NFS 卷時參數的使用。 該文件中有關 NFS 卷的寫法通常如下: servername:/shareplace mountpoint nfs option01,option02,...optionX 表 2 列出了用於所有文件系統的一般選項。 對於 NFS 文件系統,還有一些可以使用的獨特選項,使用的時候可以和一般選項混合使用,順序任意。表 3 列出了 NFS 客戶機可用的部分掛接選項。 請注意,NFS 客戶機和服務器的選項並不一定完全相同,而且有的時候會有沖突。比如說服務器以只讀的方式導出,客戶端卻以可寫的方式 mount,雖然可以成功 mount 上,但嘗試寫入的時候就會發生錯誤。一般服務器和客戶端配置沖突的時候,會以服務器的配置為准。 NFS 性能優化和測試 1. 同步或異步寫入 了解了 NFS 配置的各種選項以後,再來看看各選項對性能及安全性的影響。Server 端同步寫入 (sync) 能提供較好的穩定性,但會減慢磁盤的速度。在高負載的服務器上,應用程序會經常花費大量的時間等待寫入完成。異步寫入 (async) 是服務器不把數據立即寫入磁盤,而先將其保存到內核內存 (緩沖區) 中,計劃在後邊的某個時刻寫入,迅速向客戶機返回寫入成功的信息。這種方法大大地提高了性能,但卻犧牲了可靠性,如果系統在將緩沖區中的內容寫入磁盤之前崩潰,則數據會永遠丟失。 NFS 客戶端也可以采用異步寫入的方式,在客戶端緩存用戶進程寫入的數據, Linux 的缺省方式如此。這種方法使得客戶機的速度更快,當客戶機崩潰時只丟失該客戶端的數據。顯而易見,客戶端異步寫入的風險比服務端異步寫入的風險要小。鑒於 Linux 是個相當穩定的系統,為了得到比較好的 NFS 性能,值得采用客戶端異步寫入的辦法。 2. 選擇 TCP 還是 UDP 早期,Sun 公司曾將 NFS v2 設計成為只使用 UDP 協議,主要原因是當時機器的內存、網絡速度和 CPU 的影響,不得不選擇對機器負擔較輕的方式。而到了 NFS v3,Sun 公司選擇了 TCP 協議作為缺省的傳輸方式。在 Linux 上,UDP 協議是缺省使用的協議。作為服務器而言,別無選擇。但作為客戶端,可以使用 TCP 協議和其它使用 TCP 的 Unix NFS 服務器互連。 3. NFS性能測試 通常使用測試硬盤讀寫速度的方法來測試 NFS 的讀寫速度,但要注意以下幾點: ◆ 保證主機和網絡工作正常,集線器、交換機、路由器等網絡設備工作正常; ◆ 分別在網絡安靜、普通和繁忙的時候進行測試,真實地了解實際狀況和理想狀況,以及最壞的狀況; ◆ 沒有必要為提高少許的性能而花費更多的精力。 基本測試可以用 ping 工具來檢查網絡狀況,分別從服務器 ping 客戶機,以及從客戶機 ping 服務器。如果沒有非對稱路由的問題,這兩種方法的結果應該相近。如果丟包率小於 5%,就會造成 NFS 的性能不良。 測試程序用下面命令就可以完成: time dd if=/dev/zero of=nfs.dat bs=4k count=4098 這個命令意思是在 nfs.dat 文件裡寫 4098 個 4KB 的塊,也就是一個 16MB 的文件,也可以根據需要改變命令的參數, 但要注意每次實驗時使用不同的文件名,否則又會和緩沖有關。 可能返回的結果如下: 4098+0 records in 4098+0 records out real 0m23.984s user 0m0.260s sys 0m4.080s 這裡主要關心