linux文件系统pdf_一篇文章理解Ext4文件系统的目录
使用過Linux的同學應該對Ext4文件系統都有了解。在Linux文件系統中一切皆文件,同樣目錄也是文件的一種類型。熟悉Linux服務器的同學經常會看到如下內容,上圖是某個目錄的列表內容。
在上圖中每一行的前面形如drwxr-xr-x的內容為文件的屬性,而第一個字符d則表示這個文件是一個特殊的文件,也就是目錄(directory)。第一個字符是用于標示文件類型的,對于塊設備則是b,字符設備是c等等,每種特殊的文件這個字符都是不同的。
對于有圖像界面(GUI)的情況下,目錄的呈現形式更加豐富,如圖2所示,目錄中有子目錄和文件。同時有些文件(例如圖片和PDF等)還可以呈現其概覽。這樣在瀏覽文件的時候很有幫助,可以很方便的找到想要的文件。
什么是目錄
廢話說了一大籮,下面我們進入正題。到底什么是目錄?目錄的本質是什么?我們知道在Ext4中文件是被組織成樹型結構的,而目錄就是其中的中間節點。如圖是一個目錄結構的基本示意圖。
直觀上感覺目錄就是一個容器,其中子目錄和文件是包含在目錄中的。那么目錄在磁盤空間上有事怎么樣一個存在呢?直觀的感覺是目錄是一個比較大的存儲區域,然后子目錄和文件等都在這個區域中,如圖4所示。
然而,上述存儲形式可能問題會比較多: - 由于目錄是層層嵌套的,如果采用這種形式,那子目錄中的內容就不容易放置 - 由于文件大小差異比較大,目錄中內容的檢索不太容易 實際上,在目錄中并沒有存儲文件的數據信息,而只是存儲了一個類似C語言指針的東東,這個東東就是文件的inode id。而目錄中的子目錄數據和文件數據仍然是平鋪在磁盤上的。這樣,在目錄中通過這個指針就可以輕易的找到文件的數據,而且目錄的數據和文件的數據組織也變得非常簡單。
目錄數據結構與組織
前面我們了解了Ext4文件系統目錄的組織形式,但還是停留在感性的認識層面。接下來我們結合Ext4文件系統中關鍵的數據結構和磁盤實際數據理解一下目錄數據到底是怎么存儲的。首先我們需要意識到的是目錄本質上也是一個文件,只不過其中存儲的數據是關于子目錄和文件的名稱信息。理解到這一層面對理解后續內容來說很重要。在邏輯層面上,文件就是一個線性空間,可以理解為一個大的數組(物理層面可能是分散的,暫時不考慮)。 那么這個大數組中的元素是什么呢?就是圖6所示的這個結構體。從該結構體可以看出,每一項內容包括inode的id、該結構體的大小、文件(子目錄)名大小和文件名等信息。在檢索目錄內容的時候,其實就是根據文件名獲得inode的id,然后在根據該id從inode表中獲得inode(文件)的詳細信息。
為了便于理解上述數據結構,我們看一個具體的例子。我們在一個目錄中創建文件名為test-0到test-2000等幾千個文件,然后把目錄中一部分數據導出到某個文件中,圖7是這個文件的局部數據。可以對照這圖7的數據和圖6的數據結構理解一下,圖中test-223文件的inode是0X800E1(524513),文件名長度為0X8,結構體長度為0X10(16)。
我們再通過stat命令看一下test-223文件的詳細信息。可以看到inode信息與上面存儲的信息是一致的。
目錄數據組織本文就介紹到這里,關于邏輯地址與物理地址的對應關系部分本文不再介紹。如果想了解,可以參考《Ext4文件系統之文件數據組織》一文,目錄和文件的數據組織形式是一致的。 細心的同學可能會發現圖7中文件名并不是有序的,這樣就存在一個問題。如果一個目錄中文件的數量非常多,比如數萬個,那么查找文件的性能就會非常差,這個問題怎么解決?
目錄查詢加速
上面我們提出了一個問題,那就是對于大目錄,如何提升查詢性能。在Ext4文件系統中實現了一個名為目錄索引的特性,通過索引可以極大的提升性能。
Use hashed b-trees to speed up name lookups in large directories. This feature is supported by ext3 and ext4 file systems, and is ignored by ext2 file systems.在Ext4文件系統中這個索引是通過一個成為哈希樹(多叉樹)的方式實現的,其中Key為文件名的哈希值,而Value則是具體的數據位置(磁盤塊位置)。由于Key是有序的,因此查找非常方便,也就是可以通過文件名快速的找到ext4_dir_entry_2,然后可以找到inode信息。 如圖9是關于哈希樹的一個簡單示意圖,例如其中hash1和hash2之間的值的文件名都存儲在hash1所指向的塊中,而hash2和hash3之間的內容則存儲在hash2存儲的塊中,以此類推。當然,這里給出的是一個一層的哈希樹,實際上可以是二層。
可以通過debugfs工具查看目錄的哈希樹信息,如圖10為本文構造的目錄的哈希樹樹根內容。其中Entry #0就是一個哈希項的內容,其中包括哈希值(Key)和指向的邏輯地址(Value)。
我們結合Ext4文件系統的數據結構可以將哈希樹調整為圖11所示。從這個圖上可以看出inode節點并沒有任何變化,而是其中i_block指針發生了變化。這里從原來的Extent B樹變成了現在的哈希樹。
總結
以上是生活随笔為你收集整理的linux文件系统pdf_一篇文章理解Ext4文件系统的目录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python上传excel文件_flas
- 下一篇: git 获取最新代码_常用命令之git操