區塊配置(與配置位元圖)
磁碟只是一個巨大的、編了號的固定大小區塊陣列——比方說四十億個各 4 KiB 的區塊。當你建立一個檔案,檔案系統必須撥出其中一些區塊來存它的資料,而且絕不能把同一個區塊同時撥給兩個檔案。所以它需要一個方法記住哪些區塊被佔用、哪些空閒,以及一套挑選把哪些空閒區塊撥出去的策略。這份簿記就是區塊配置,而最常見的「空閒對已用」紀錄是一張位元圖。
一張配置位元圖是每個區塊一個位元:位元設上表示該區塊使用中,位元清除表示空閒。一個由 4 KiB 區塊組成的 1 GiB 區域含 262144 個區塊,故需要一張 262144 位元的位元圖,約 32 KiB——比它所追蹤的小得微不足道。要配置,檔案系統掃描位元圖找清除的位元、把它們設上、再把那些區塊號記進檔案的 inode(或 extent 樹)。ext4 等檔案系統把卷劃分成區塊群組(block group)——每塊各有自己的位元圖、inode 表與資料——好讓一個檔案的 inode 與它的資料區塊在實體上能靠在一起,減少旋轉磁碟上的尋道距離並改善區域性。配置器也設法讓一個檔案的區塊保持連續,使檔案能以長段循序讀取,而非到處跳躍。
為何重要:配置策略直接形塑碎片化與速度。一個天真、隨處抓第一個空閒區塊的配置器會把檔案撒滿整個磁碟;一個好的配置器會保留連續段、並為持續增長的檔案預先配置以保持連續。誠實之點:位元圖與超級區塊的空閒區塊計數器必須保持一致,而在位元圖標記某區塊已用、與真正把它記進某 inode 之間發生當機,可能洩漏一個區塊(計為已用卻不屬於任何檔案),或更糟地把一個區塊重複配置——這正是日誌與 fsck 存在要防範或修復的那類不一致。
區塊位元圖(每個區塊一個位元),1 = 已用,0 = 空閒: 位元組 0:1 1 1 0 0 1 0 0 | ^---^ 配置器可抓的 2 個空閒區塊連續段(#3、#4) 區塊 #0..#2 使用中
掃描位元圖找清除的位元便能找到空閒區塊;一段連續的空閒可讓檔案不碎片化。
光有空閒空間還不夠:一個磁碟可能有 40% 空閒,卻沒有任何一段夠長的連續空閒供大檔案偏好的連續配置使用,逼出碎片化。檔案系統用延遲配置(在回寫時、已知最終大小後才決定擺放位置)對抗這點,而非逐區塊決定。