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