Filesystems
如何對 ext4 目錄進行原子碎片整理
遍歷 HDD 上的目錄樹時,碎片似乎會產生很多不必要的查找:
# stat -c %F 00 01 02 directory directory directory # filefrag -v 00 01 02 Filesystem type is: ef53 File size of 00 is 12288 (3 blocks of 4096 bytes) ext: logical_offset: physical_offset: length: expected: flags: 0: 0.. 0: 428351942.. 428351942: 1: 1: 1.. 2: 428352760.. 428352761: 2: 428351943: last,eof 00: 2 extents found File size of 01 is 12288 (3 blocks of 4096 bytes) ext: logical_offset: physical_offset: length: expected: flags: 0: 0.. 0: 428351771.. 428351771: 1: 1: 1.. 2: 428891667.. 428891668: 2: 428351772: last,eof 01: 2 extents found File size of 02 is 12288 (3 blocks of 4096 bytes) ext: logical_offset: physical_offset: length: expected: flags: 0: 0.. 0: 428351795.. 428351795: 1: 1: 1.. 2: 428352705.. 428352706: 2: 428351796: last,eof 02: 2 extents found
e4defrag 無法對它們進行碎片整理
# e4defrag -v 00 ext4 defragmentation for directory(00) [1/116] "00" File is not regular file [ NG ]
那麼如何對目錄進行碎片整理呢?不是它的內容,而是目錄本身。目錄正在使用中,因此應該以原子方式完成,就像對正常文件進行碎片整理不會干擾它們的使用一樣。
由於似乎沒有任何用於目錄索引的線上碎片整理工具,甚至離線碎片整理程序似乎也無濟於事,我不得不求助於遞歸重建目錄樹。
為此,我編寫了一個小工具(defrag-dirs)。唉,這種方法需要在碎片整理期間刪除使用目錄樹的應用程序,這在處理數百萬個文件時可能需要相當長的時間。