磁盤是用來儲文件的,可是必須先把磁盤格式化爲某種格式的文件系統,才能存儲文件。文件系統的目的就是組織和管理磁盤中的文件。在 Linux 系統中,最長見的是 ext2 系列的文件系統。其早期版本爲 ext2,後來又發展出 ext3 和 ext4。ext3 和 ext4 雖然對 ext2 進行了加強,可是其核心設計並無發生變化,因此咱們還是以較老的 ext2 做爲演示對象。html
Ext2 文件系統在格式化的時候通常會包含多個區塊羣組(blockgroup)。Ext2 格式化後有點像下面這樣:前端
這是由於文件系統很是大時,若是將全部的 inode 和全部的 block 放在一塊兒管理起來會比較麻煩。因此將文件系統分割爲多個 Block Group,每一個 Block Group 中都有獨立的 inode/block/superblock 系統。node
Block
Block 就是咱們在《Linux 文件系統相關的基本概念》一文中介紹的邏輯塊。對於 ext2 文件系統來講,硬盤分區首先被分割爲一個一個的邏輯塊(Block),每一個 Block 就是實際用來存儲數據的單元,大小相同,Block 按照0,1,2,3 的順序進行編號,第一個 Block 的編號爲 0。ext2 文件系統支持的 Block 的大小有 1024 字節、2048 字節和 4096 字節,Block 的大小在建立文件系統的時候能夠經過參數指定,若是不指定,則會從 /etc/mke2fs.conf 文件中讀取對應的值。原則上,Block 的大小與數量在格式化後就不可以發生改變了,每一個 Block 內最多隻會存放一個文件的數據(即不會出現兩個文件的數據被放入同一個 Block 的狀況),若是文件大小超過了一個 Block 的 size,則會佔用多個 Block 來存放文件,若是文件小於一個 Block 的 size,則這個 Block 剩餘的空間就浪費掉了。
可使用 dumpe2fs 命令查看 Block 的大小:linux
$ sudo dumpe2fs /dev/sda1 | grep "Block size:"
在筆者的環境中,輸出的結果以下:
Block size: 1024spa
注意,Ext2 文件系統的 block 主要有下面一些特色:.net
Block Group
Block 在邏輯上被劃分爲多個 Block Group,每一個 Block Group 包含的 Block 數量相同,具體是在 SuperBlock 中經過 s_block_per_group 屬性定義的(最後一個 Block Group 除外,最後剩下的 Block 數量可能小於 s_block_per_group,這些 Block 會被劃分到最後一個 Block Group 中)。dumpe2fs 命令會列出全部的 Block Group 信息,可是在統計信息中卻沒有說明當前的文件系統中包含有多少個 Block Group。下面是 dumpe2fs 輸出的 Block Group 信息的節選:設計
... Group 0: (Blocks 1-8192) [ITABLE_ZEROED] Checksum 0xa22b, unused inodes 501 Primary superblock at 1, Group descriptors at 2-81 Reserved GDT blocks at 82-337 Block bitmap at 338 (+337), Inode bitmap at 354 (+353) Inode table at 370-497 (+369) 5761 free blocks, 501 free inodes, 2 directories, 501 unused inodes Free blocks: 2432-8192 Free inodes: 12-512 Group 1: (Blocks 8193-16384) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED] Checksum 0xea71, unused inodes 512 Backup superblock at 8193, Group descriptors at 8194-8273 Reserved GDT blocks at 8274-8529 Block bitmap at 339 (bg #0 + 338), Inode bitmap at 355 (bg #0 + 354) Inode table at 498-625 (bg #0 + 497) 7855 free blocks, 512 free inodes, 0 directories, 512 unused inodes Free blocks: 8530-16384 Free inodes: 513-1024 ...
Group0 佔用從 1 到 8192 號的 block。其中的 Superblock 則在 1 號 block 內。
文件系統描述說明(Group descriptors)佔用從 2 到 81 號 block。
Block bitmap 和 Inode bitmap 分別在 338 和 354 號 block 上。
Inode table 佔用 370-497 號 block。
Group0 當前可用的 block 號爲:2432-8192,可用的 inode 號碼爲:12-512。
Group 內 inode 數的計算方式:
一個 inode 佔用 256 Bytes
Inode 佔用的 block 數:497 - 370 + 1 = 128
每一個 block 的大小爲 1024 Bytes
Inode 數爲:128 * 1024 / 256 = 5123d
Boot Block
每一個磁盤分區的開頭 1024 字節大小都預留爲分區的啓動扇區,存放引導程序和數據,因此又叫引導塊。引導塊在第一個 Block,即 Block 0 中存放,可是未必佔滿這個 Block,緣由是 Block 的大小可能大於 1024 字節。
這裏是存放開機管理程序的地方,這是個很是重要的設計。由於這樣使得咱們可以把不一樣的開機管理程序安裝到每一個文件系統的最前端,而不用覆蓋整顆磁盤惟一的 MBR,這樣就能支持多系統啓動了。code
如上圖所示,每一個 Block Group 都由下面幾個組成部分:htm
Superblock(超級區塊)
Superblock 是記錄整個 filesystem 相關信息的地方,其實上除了第一個 block group 內會含有 superblock 以外,後續的 block group 不必定都包含 superblock,若是包含,也是作爲第一個 block group 內 superblock 的備份。superblock 記錄的主要信息有:
Superblock 的大小爲 1024 Bytes,它很是重要,由於分區上重要的信息都在上面。若是 Superblock 掛掉了,分區上的數據就很難恢復了。可使用 dumpe2fs 命令查看 分區的 Superblock 信息,若是添加選項 -h,dumpe2fs 命令則只輸出 Superblock 中的信息:
$ sudo dumpe2fs -h /dev/sdd1
Group Description(組描述)
Group Description 用來描述每一個 group 的開始與結束位置的 block 號碼,以及說明每一個塊(superblock、bitmap、inodemap、datablock) 分別介於哪個 block 號碼之間。
Block bitmap(區塊對照表)
在建立文件時須要爲文件分配 block,屆時就會選擇分配空閒的 block 給文件使用。如何查看 block 是否已經被使用了呢?此時就須要藉助於 block bitmap 了。經過 block bitmap 能夠知道哪些 block 是空的,所以系統就可以很快地找到空閒空間來分配給文件。一樣的,在刪除某些文件時,文件本來佔用的 block 號碼就要釋放出來,此時在 block bitmap 當中相對應到該 block 號碼的標誌就須要修改爲"空閒"。這就是 block bitmap 的做用。
Inode bitmap(inode 對照表)
inode bitmap 與 block bitmap 的功能相似,只是 block bitmap 記錄的是使用與未使用的 block 號,而 inode bitmap 則記錄的是使用與未使用的 inode 號。
Inode table
Inode table 中存放着一個個 inode,inode 的內容記錄文件的屬性以及該文件實際數據是放置在哪些 block 內,inode 記錄的主要的文件屬性以下:
inode 的數量與大小也是在格式化時就已經固定了的,另外 inode 還有以下特色:
Data block
Data block 是用來存放文件內容的地方,Ext2 文件系統 1K、2K 和 4K 大小的 block。在格式化文件系統時 block 的大小就肯定了,而且每一個 block 都有編號。須要注意的是,因爲 block 大小的差別,會致使文件系統可以支持的最大磁盤容量和最大單個文件的大小並不相同。下表描述了 block 大小與文件系統以及單個文件大小的關係:
此外 Ext2 文件系統的 block 還有下面一些限制:
參考:
鳥哥的私房菜
dumpe2fs man page
Linux ext2, ext3, ext4 文件系統解讀[1]
Ext2文件系統簡單剖析(一)