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



















