ext

1992年發表的文件系統

EXT是延伸文件系統(英語:Extended file system,縮寫為 ext或 ext1),也譯為擴展文件系統,一種文件系統,於1992年4月發表,是為linux核心所做的第一個文件系統。採用Unix文件系統(UFS)的元數據結構,以克服MINIX文件系統性能不佳的問題。它是在linux上,第一個利用虛擬文件系統實現出的文件系統,在linux核心0.96c版中首次加入支持,最大可支持2GB的文件系統主要包括三個大的文件:ext-all.css,ext-base.js,ext-all.js(包括所有的類庫,您可以根據需要進行刪減。官方網站提供這一介面),在引用ext類庫的時候,這三個文件必不可少。它提供了豐富的,非常漂亮的外觀體驗,成為眾多界面層開發人員的追捧!其核心的組件基本復蓋了我們構建client的常用的組件。從 Ext 2開始,商業版(針對那些以盈利為目的的開發方)要收費了。這可能會影響一些他的應用前景。目前的最新版本為5.0,於2014年6月22日發布。

系統分區


它是專門為Linux設計的,擁有最快的速度和最小的CPU佔用率。
Linux作為自由軟體,贏得了許多用戶,其磁碟分區格式一種是Linux Native主分區,另一種是Linux Swap交換分區,並且主分區和交換分區都採用同一種格式,既Native和Swap格式。
這兩種分區格式的安全和穩定性相當好,使用Linux操作系統死機的機會將大大減少。但是,目前支持這類分區格式的操作系統也有Linux和Android

EXT的數據存儲

雖然從Ext2Ext4,找數據的方式發生了變化,但是,磁碟的布局還是非常相似的。其實這個東西也不需要變化,因為現在也沒什麼特別巧妙的方式,而且磁碟的吞吐量、效率的瓶頸也不在這裡。當然,這裡排除那些根據自身文件特點設計的資料庫,畢竟還是為了支持通用文件。
Boot在第一個塊,放的應該是引導程序,超級塊就放在了第二個塊上,如果不是可以在mount的時候通過參數sb來設置。對於經常要訪問(比較重要)的內容可以在每個塊組中都存儲(當然這是比較浪費空間的,所有有的只選擇在部分),在不同的塊組中訪問這些內容的時候磁頭移動的距離就小了。如果開啟了sparse block功能,那麼只會在3、5、7的冪級的塊組上才冗餘這些信息
在超級塊裡面保存了這個文件系統的統計信息等,而且從中可以看出這個文件系統的特點。在內存中裝載的時候也從超級塊開始,知道了磁碟上的布局之後才能順利的進行後面的操作,ext4_super_block的內容大概如下:
(1)塊、inode等統計信息,訪問時間等。
(2)塊大小、以及每塊數目等布局信息。
(3)uid、gid。
(4)特性相關。
(5)預先分配相關。
(6)日誌支持相關。
(7)64位的支持,其實保存了需要的高16位。
塊組中其實沒有保存什麼有用的信息(例如超級塊),ext4_group_desc的存在就是為了把磁碟分成一個個的塊組。那分成塊組之後有什麼好處呢?試想一下如果沒有塊組,那麼是不是點陣圖這個關鍵的數據是不是要集中放到磁碟上的一個固定的位置?訪問當然是沒有問題的,但是不管在磁碟上的什麼地方訪問的時候都要跑到一個相同的地方去再訪問一次點陣圖,這樣的代價就比較大了。而且在分配的時候盡量把文件的數據塊放在同一個組,那麼能在分配階段就一定程度地避免了碎片。下面是ext4_group_desc中大概的內容(和Ext2中的不同的是對更大範圍的支持):
(1)塊組中塊點陣圖、inode點陣圖、inode表的位置
(2)空閑塊(inode)、目錄的數目
(3)校驗
接下來就是塊點陣圖、inode點陣圖了。為什麼需要inode點陣圖呢?因為ext4文件系統在要分配一個新的inode的時候並不是像在內存中分配其他數據結構的時候需要的時候分配數據結構佔用的空間,而是預先分配好一組放在點陣圖後面,就像一個inode池的感覺。那麼在需要ext4_inode的時候就需要知道哪些是空閑的,哪些是用過的,這就是點陣圖的作用了。點陣圖具體就沒什麼好介紹的了,下面看ext4_inode的內容:
(1)mode、uid、gid等我們能看到的信息
(2)各種時間戳
(3)i_data用來找到數據塊
(4)file acl

EXT的數據查找

在對Ext文件系統還什麼都不知道的時候應該比較關心從路徑名到ino的過程。這個過程的大部分工作量應該在VFS中吧,而且感覺沒什麼特別的地方。現在查找數據對這部分的內容就忽略不計了。我們關係的是,給定ino&offset,怎麼樣知道在磁碟上的位置呢?在課本上學到的只是告訴我們這個地方應該是用B樹的,但是從Ext2好像沒看的B樹的影子,反而看到了內存管理中見過的東西:間接塊。
間接塊管理磁碟上文件的數據塊位置和內存中分頁的效果有點像,當然細節還是不同的。不過這個地方的壞處就很明顯了,如果是訪問大文件中的兩個順尋的物理塊,那麼即使他們物理上也是相鄰的(如果內存中沒有其緩存的話),也要從第一層的間接塊開始訪問,直到最後一層才知道真正的塊號。在內存中分頁當然是問題不大的,但是磁碟上這樣高出幾倍的訪問時間效率會很差。

日誌

什麼是日誌以及日誌的作用就不在這裡說了。Ext3與Ext2的管理數據塊的方式都是差不多的,不同之處是加上了記錄日誌的功能,可以從Ext2平滑地過渡到Ext3。Ext3日誌文件系統的思想就是對文件系統任何的高級操作都分兩步進行,首先,把待寫入的塊的一個副本存放在日誌中;其次,當發往日誌的I/O數據傳送完成時,塊就寫入文件系統。當發往文件系統的I/O數據傳送終止時,日誌的塊副本就被丟棄。
Ext3既可以只對元數據的修改做日誌,也可以記錄所有的日誌。有下面的三種日誌模式:
(1)journal,把所有數據塊的改變都記入日誌,最安全也最慢。
(2)ordered,只記錄元數據的改動,Ext3會把元數據和相關的數據塊進行分組,以便把元數據寫入磁碟之前寫入數據塊。
(3)writeback,只記錄元數據改動,最快的一種模式。