檔案系統與儲存

間接區塊(indirect block)

經典的 Unix inode 又小又固定大小,但檔案可以巨大,所以 inode 不可能對一個龐大檔案的每一個區塊都持有一個直接指標。早期設計者用的妙招是一道巧妙的階梯:在 inode 本身為小檔案保留幾個直接指標,而對較大的檔案,存一個指向「整塊全是指標」之區塊的指標。那個全是指標的區塊就是間接區塊,而它正是一個小小的 inode 定址一個浩大檔案的方式。

想像一個 inode 有,比方說,12 個直接區塊指標——足夠一個至多 12 個區塊的檔案(在 4 KiB 區塊大小下是 48 KiB)。超過之後,inode 還持有一個單層間接指標:它指向一個區塊,那區塊裡裝的全是更多的區塊指標(一個 4 KiB 區塊容得下 1024 個指標,再定址 4 MiB)。再大一點,雙層間接指標指向一個由指標組成的區塊,其中每個指標又指向一個由指標組成的區塊(1024 乘 1024 個區塊)。三層間接指標再加一層。因此讀取一個大檔案深處的一個位元組,可能要先從磁碟循兩三個指標區塊才能抵達資料——這正是為何這類存取較慢、以及為何核心會快取間接區塊。

為何重要:間接區塊是用固定大小的 inode 來定址大檔案的歷史答案,你仍會在 ext2/ext3、在許多教科書、以及在檔案系統內部機制的考題裡遇到它們。它們的弱點是真實的:一次大型循序讀取要為取得指標區塊付出額外的磁碟跳躍,而逐區塊的簿記又笨重。那個弱點正是基於 extent 的配置被發明出來要修的,這也是為何 ext4 與現代檔案系統偏好 extent、只為向後相容才使用間接區塊。

ext2 風格的 inode 區塊對應: direct[0..11] -> 12 個資料區塊 (至 48 KiB) single_indirect -> [指標,指標,...共 1024 個指標] -> 1024 個資料區塊(+4 MiB) double_indirect -> 一塊 1024 個指標,每個 -> 一塊 1024 個指標 -> 資料

直接指標涵蓋小檔案;單層、雙層、三層間接區塊像階梯一樣往上撐到巨大檔案。

間接區塊對深層偏移付出額外的磁碟讀取、對大檔案付出笨重的簿記——正是 extent 所解決的問題。它們主要為向後相容而續存(ext2/ext3);在新設計裡採用它們,通常意味你還沒考慮過 extent。

又稱
indirect pointer blocksingle/double/triple indirect間接區塊間接指標區塊