Linux NFS文件系統端架構與代碼解析
我們知道NFS分布式文件系統是一個客戶端-服務端架構(CS架構)。其客戶端是Linux內核中的一個文件系統,跟Ext4和XFS類似,差異在于其數據請求不存儲在本地磁盤,而是通過網絡發送到服務端進行處理。
圖片
從上圖所示的整體架構圖上可以看出,NFS也是位于VFS下的文件系統。因此當NFS掛載后,其與本地文件系統并沒有任何差異,用戶在使用的時候也是透明的。
1NFS整體架構
作為VFS下的具體文件系統,NFS主要需要實現兩套函數指針,對于文件(對于目錄來說是另外的指針)來說前端實現了nfs_file_operations,用于適配VFS的調用。后端的接口實現則是nfs_file_aops,其用于實現與NFS服務端的通訊。
圖片
2nfs_file_operations實現
nfs_file_operations的實現如下所示,可以看出這里實現了文件讀寫相關的函數接口,比如打開,讀寫,尋址和鎖等等。
圖片
以寫數據為例,當用戶調用write API時,首先會觸發VFS的vfs_write函數,而該函數通過函數指針的方式調用nfs_file_write,具體如下所示。
圖片
3nfs_file_aops實現
nfs_file_aops的具體實現如下所示,這里主要實現了如何將緩存頁的數據通過網絡發送到服務端,或者從服務端接收消息。其中nfs_writepags用于將緩存頁發送到服務端。對于本地文件系統來說該函數的實現通常是將數據寫入持久化的設備上。
圖片
對于讀數據來說通常是通過nfs_readpages,該函數則用于從遠端設備讀取數據。除此之外還有很多其它函數實現,本文不再贅述。
本文主要從架構上來介紹NFS文件系統的實現,后續我們會結合具體的流程深入到函數實現的細節。更多精彩內容還請關注本號。