1. 程式人生 > >分散式檔案系統:NFS(3)

分散式檔案系統:NFS(3)

四、NFS

NFS(Sun Network File System)最初為SUN(不知道有這個公司?上百度或google查檢視)提供,後移植到Linux等其他平臺。其介面都已經標準化,如NFS version 3介面由RC1813定義,NFS version 4介面由 RFC3530定義。

NFS的主要特性有:1)竭力相容Unix檔案系統介面;大部分使用者在操作檔案的時候,可以不用關心目標檔案是位於NFS遠端伺服器上,還是本地磁碟上。2)檔案儲存載體對使用者透明;當客戶端機器完成對伺服器輸出檔案目錄的匯入之後,遠端資料夾就表現的跟本地資料夾基本一樣。3)伺服器不維護關於客戶端的狀態資訊。每一種客戶端檔案操作,並不受上次檔案操作的影響。舉例來說,在stdio庫中,FILE資料結構儲存有開啟的檔案控制代碼,記錄當前讀寫檔案位置。在NFS伺服器端,並沒有類似的設施。

1 架構

下圖是NFS原始架構圖。在LINUX實現中,大體依舊如此。先解釋一下圖中的幾個術語:

  • VFS(虛擬檔案系統):LINUX支援多種檔案系統,它們都通過VFS層向上提供統一的檔案系統呼叫。
  • RPC(遠端過程呼叫):介面實現(如檔案內容儲存、讀取、磁碟空間管理等)在遠端伺服器上。伺服器通過某種網路協議向用戶(可以在另一臺機器上)暴露所實現的介面。RPC執行過程簡述如下:使用者程式呼叫某RPC介面,本地RPC執行時庫負責解析、打包RPC介面名,引數型別及引數值;並將打包封裝好的資料包通過網路傳送到遠端伺服器。伺服器端的RPC執行時庫接受並解析資料包,呼叫伺服器端的RPC介面實現。呼叫結果按照相反的方向返回給使用者程式。

假設使用者針對一個NFS檔案發起檔案操作如read或write,相應的系統呼叫會通過VFS層傳到NFS底層實現。NFS底層會將該檔案操作通過RPC輸送至遠端NFS檔案伺服器。NFS檔案伺服器負責處理這個檔案操作,並向用戶返回操作結果。

2 客戶端

客戶端需要掛載伺服器公佈的檔案目錄,並獲得在這些檔案目錄中的檔案操作許可權。例如

mount server1.mydomain.com:/exported/directory /mnt/srv1dir

茲後,此客戶端上的應用程式就可以如同訪問本地檔案一樣訪問伺服器公佈的資料夾。

3 伺服器

NFS檔案儲存在伺服器的本地檔案系統中。從伺服器看,這些檔案都是普通的本地檔案。伺服器通過exportfs命令來對外公佈一個檔案目錄,客戶端在引入這個目錄後,就可以集在該目錄下面進行檔案操作。

exportfs通常讀取一個配置檔案,並據此確定公佈的目錄,以及使用者檔案操作的許可權。下面就是一個配置檔案的例子。在這個例子中,伺服器公佈的目錄為/exported/directory,客戶端可以是client1.mydomain.com;

/exported/directory client1.mydomain.com(rw, sync)

在伺服器上,幾個後臺程序會啟動起來,執行不同的任務。例如nfsd負責處理客戶端傳送過來檔案操作;mountd會處理客戶端的mount命令。

4. 檔案鎖

如前所述,NFS伺服器端並不維護檔案讀寫狀態;而檔案是否上鎖以及鎖型別就是一類檔案讀寫狀態。這樣NFS必須提供額外的服務,來提供檔案鎖功能。這是由伺服器的後臺程序lockd來實現的。flock操作最終由lockd來處理,在伺服器端對檔案實現鎖操作。

這種實現方式有一個潛在的問題,如果伺服器出現故障,如崩潰後重啟,客戶端所請求的檔案鎖都將失去,並且客戶端沒有辦法知道它的檔案鎖已經丟失這個事實。為了使伺服器與客戶端能夠在檔案鎖資訊方面取得一致,伺服器端和客戶端均有statd這樣一個後臺程序。在客戶端statd會記錄使用者獲取的檔案鎖。當伺服器重啟後,伺服器上的statd會與客戶端上的statd通訊,取得客戶端所獲取的檔案鎖。這樣客戶端就可以重新獲得這些檔案鎖。