f2fs源碼分析之文件讀寫過程


本篇包括三個部分:1)f2fs 文件表示方法; 2)NAT詳細介紹;3)f2fs文件讀寫過程;4)

 下面詳細闡述f2fs讀寫的過程。

 

管理數據位置關鍵的數據結構是node,node包括三種:inode、直接node、間接node。其中inode記錄了文件的基本信息,包括訪問權限、文件大小、修改時間等,也有索引的功能;直接node和間接node單純負責索引。F2fs的inode中有923個直接數據塊索引,2個一級索引,2個二級索引,1個三級索引,文件的邏輯表示如下圖:

inode中有923個索引項,直接node、間接node中都是有1018個索引項。

通過上圖,inode中923個直接數據塊索引能夠索引到××K的數據,

2個一級索引能夠索引到

2個二級索引能夠索引到

1個三級索引能夠索引到

因此,f2fs支持單文件最大3.94T,

上面介紹了f2fs三種node之間是如何配合索引文件的,但是有一個非常重要的細節:間接node的索引項記錄nid號(與NAT相關),直接node的索引項中直接記錄數據塊地址。拿圖(一)中的三級索引部分為例:

其中node block 1) 2)屬於間接node,索引項中為nid號,3)和4)屬於直接node,索引項中為數據塊的地址。這種設計是為了解決Log-structured 文件系統中雪崩樹問題,其中nid號是NAT表的下標。

f2fs文件系統中,NAT表是和文件存儲強相關的一個數據結構,非常重要。因此,這篇文章的第二部分,我們就詳細說說NAT表,包括它的作用以及f2fs是如何管理NAT表的。

NAT表位於元數據區,可以認為是一個大數組,數據下標是nid,每一個表項記錄着一個node塊的信息,包括該node塊屬於哪一個inode,以及該node塊在磁盤上的地址。

還是以圖(一)中的三級索引部分為例,我們發現,整個索引過程的真相應該是這樣的:

 

這和圖一相比已經面目全非了,圖一更宏觀,本圖粒度更細。

到這里我們基本上可以明白f2fs為什么可以削弱雪崩樹的影響了:當圖中數據塊因為數據變臟導致異地更新時,它的直接索引2)也會變臟,但是由於2)是一個直接索引,是node塊,信息是在NAT中管理,所以只需要在NAT中update下2)的新地址就好了!這樣3)中對應的索引項根本就不用變,因為3)的索引項指向的東西在NAT里呢!

這一機制有效杜絕了雪球越滾越大!但是,這種類似於”二級指針“的方法,會帶來一定程度的性能開銷,所以f2fs的NAT信息在內存中以鏈表+基數樹的方式維護,以加快查找、update過程。

好了,到這里NAT的作用基本清楚了,后面讀寫文件的過程還會涉及nat的操作。下面介紹下NAT的存儲方式:

元數據區中有兩份NAT,兩份NAT在元數據區中以segment的粒度交叉存放(假設每個NAT表有3個segment): 

 

之所以准備兩份NAT,是因為f2fs中有兩份snapshot,NAT是和文件存儲強相關的元數據,因此兩份。但是兩份snapshort和兩份NAT之間並不是一一對應關系,如上圖,並不是說第一份快照對應的NAT數據就完全存儲在圖中NAT0(或者NAT1)中。它是通過一個bitmap,完成NAT在block粒度上的映射: 

 

好了,把NAT介紹完畢后,我們對f2fs文件的索引有了新的認識,下面介紹文件的讀寫過程:

1)首先在VFS層,

上面介紹了f2fs文件的邏輯表示,下面看f2fs源碼中是如何

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM