Filesystems

如何對 ext4 目錄進行原子碎片整理

  • May 7, 2017

遍歷 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)。唉,這種方法需要在碎片整理期間刪除使用目錄樹的應用程序,這在處理數百萬個文件時可能需要相當長的時間。

引用自:https://unix.stackexchange.com/questions/350715