Posted on 2011-01-06 11:21
幻海藍夢 閱讀(346)
評論(0) 編輯 收藏 所屬分類:
Linux
Linux 分區(qū)以柱面劃分,且必須格式化成 Linux 標準文件系統(tǒng) (ext2/ext3 等) 才能使用。通常來說,每個分區(qū)只能格式化為一個文件系統(tǒng)。
盡
管硬盤的最小存儲單位是扇區(qū),但對于文件系統(tǒng)而言,扇區(qū)的讀寫效率過低,因此以 n 個扇區(qū)為一個塊
(Block),這是文件系統(tǒng)的最小存儲單位,當前支持 1024/2048/4096
三種大小的塊。當分區(qū)存儲大文件時,大的塊有助于提高讀寫效率。以 10MB 文件為例,扇區(qū)是 512 字節(jié),需要讀取 (I/O) 20480
次,而對于 4096 字節(jié)的塊而言只需 2560
次。但也正因為塊是最小存儲單位,對于眾多的小文件來說,存儲空間浪費也就非常嚴重。即便文件小于塊,其剩余空間也是無法繼續(xù)使用的。
1. EXT2 文件系統(tǒng)結(jié)構(gòu)
在
EXT2 文件系統(tǒng)中,文件存儲分為 Inode 和數(shù)據(jù)塊兩部分。inode 中存儲了文件元數(shù)據(jù)(metadata
文件屬性)信息和塊指針(指向數(shù)據(jù)塊位置),數(shù)據(jù)塊中存儲了文件內(nèi)容數(shù)據(jù)。整個分區(qū)被劃分為 n 個塊組 (Block
Group),每個塊組又劃分為多個區(qū)域。
- Super Block: 超級塊,記錄文件系統(tǒng)信息,包括塊和 inode 總量、使用情況等等。
- Group Description: 組描述,記錄塊組信息。
- Block Bitmap: 塊位圖,記錄塊使用狀態(tài),用于分配和回收數(shù)據(jù)塊。
- Inode Bitmap: Inode 位圖,記錄 Inode 使用狀態(tài),用于分配和回收 Inode。
- Inode Table: Inode 表,存儲 Inode。
- Data Blocks: 數(shù)據(jù)塊。
可以用 dumpe2fs 查看分區(qū)的相關(guān)信息
$ sudo dumpe2fs /dev/sda1
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem OS type: Linux
Inode count: 498736
Block count: 1994060
Reserved block count: 99703
Free blocks: 1333369
Free inodes: 381040
First block: 0
Block size: 4096
Fragment size: 4096
Reserved GDT blocks: 486
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8176
Inode blocks per group: 511
Filesystem created: Sun Jul 19 14:03:01 2009
Last mount time: Wed Jul 29 11:21:01 2009
Last write time: Wed Jul 29 11:21:01 2009
First inode: 11
Block size: 4096
Inode size: 256
... ...
Group 0: (Blocks 0-32767)
Primary superblock at 0, Group descriptors at 1-1
Reserved GDT blocks at 2-487
Block bitmap at 488 (+488), Inode bitmap at 489 (+489)
Inode table at 490-1000 (+490)
1172 free blocks, 8161 free inodes, 2 directories
Free blocks: 19992, 20034-20035, 20037-20043, 31605-31606, 31608-32767
Free inodes: 16-8176
Group 1: (Blocks 32768-65535)
Backup superblock at 32768, Group descriptors at 32769-32769
Reserved GDT blocks at 32770-33255
Block bitmap at 33256 (+488), Inode bitmap at 33257 (+489)
Inode table at 33258-33768 (+490)
20522 free blocks, 4056 free inodes, 175 directories
Free blocks: 33771-33773, 34053-34062, 34107-34136, 34141, ...
Free inodes: 11956-11957, 11965, 11984, 11988, 11991, 11998, ...
Group 2: (Blocks 65536-98303)
Block bitmap at 65536 (+0), Inode bitmap at 65537 (+1)
Inode table at 65538-66048 (+2)
17487 free blocks, 5021 free inodes, 724 directories
Free blocks: 67305-67307, 67309, 68035, 68043-68044, 70506-70514, ...
Free inodes: 19508-24528
2. Inode 結(jié)構(gòu)
Inode 結(jié)構(gòu)中保存了文件的屬性信息和數(shù)據(jù)塊指針。每個 inode 大小為 128 字節(jié)。
- Mode: 包含 inode 描敘的內(nèi)容以及用戶使用權(quán)限。EXT2 中的 inode 可以表示一個文件、目錄、符號連接、塊設(shè)備、字符設(shè)備或 FIFO。
- Owner Information: 文件或目錄所有者(用戶/組)標志符。文件系統(tǒng)根據(jù)它可以進行正確的存取。
- Size: 文件尺寸 (單位: 字節(jié))。
- Timestamps: inode 創(chuàng)建及最后一次被修改的時間。
- Direct Blocks: 數(shù)據(jù)塊直接指針快,可存儲 12 個直接指針,也就是說指向 12 個數(shù)據(jù)塊。
- Indirect Blocks: 單級間接指針快,指向一個數(shù)據(jù)塊。假設(shè)每個塊為 1024B,那么一共可以存儲 1024 / 4 = 256 個數(shù)據(jù)塊指針。
- Double Indirect: 二級間接指針快。可存儲 256 * 256 個數(shù)據(jù)塊指針。
- Tripe Indirect: 三級間接指針快。可存儲 256 * 256 * 256 個數(shù)據(jù)塊指針。
當 Block = 1024 時,最大文件尺寸 = 1024 * 12 + 1024 * 256 + 1024 * 256 * 256 + 1024 * 256 * 256 * 256 = 16843020 KB (約 16 GB)。
所有的 Inode 都存儲在 Inode Table 中,當我們訪問一個文件時,將完成如下步驟。
(1) 首先訪問文件根目錄的 Inode,從根目錄的數(shù)據(jù)塊中,我們可以找到該目錄下所有文件和子目錄的 Inode。
(2) 利用找到的 Inode 從 Inode table 中繼續(xù)訪問下一級目錄,直到獲取文件的 Inode。
(3) 利用文件的 Inode 我們就可以讀取文件數(shù)據(jù)塊的內(nèi)容了。
目錄是一種特殊的文件,它的數(shù)據(jù)塊中存儲了該目錄中所有文件和目錄的名稱以及 Inode (見下面的示意圖)。從 Inode 數(shù)據(jù)結(jié)構(gòu)上我們也可以看到,其內(nèi)部并沒有保存文件名的區(qū)域。
一個分區(qū)所能容納的文件數(shù)量和 Inode 數(shù)量有關(guān),因為一個文件最少要占用一個 Inode (也可能是多個,比如硬鏈接)。當目錄下的文件數(shù)量過多時,那么就需要多個塊來記錄關(guān)聯(lián)數(shù)據(jù)。
3. EXT3 文件系統(tǒng)
操
作一個文件時,我們除了在數(shù)據(jù)塊寫入數(shù)據(jù)外,還需更新 Inode 中的相關(guān)信息。若在其完成操作前的任何時候出現(xiàn)異常(比如斷電)都會導(dǎo)致 Inode
中數(shù)據(jù)和數(shù)據(jù)塊不一致。如果發(fā)生這類問題,EXT2 文件系統(tǒng)會在重啟時進行檢查,從超級塊開始逐步校驗,這個過程非常耗時。EXT3 是 EXT2
的升級版本,其代碼、磁盤格式和元數(shù)據(jù)都和 EXT2 相同,這意味著 EXT2 可以無損轉(zhuǎn)化為 EXT3 。
EXT3 是一種日志文件系統(tǒng),它會在操作文件前記錄文件操作日志,在文件讀寫完成后,完成該日志,這類似于數(shù)據(jù)庫的事務(wù)機制。這種日志模式的好處就是在發(fā)生錯誤時,直接檢查日志就可獲知問題所在。
---------- 分割線 -------------
Linux 支持很多種文件系統(tǒng),本文不作一一描述,可自行參考相關(guān)文檔。
原文:http://www.rainsts.net/article.asp?id=842