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