如何對 ext4 檔案系統進行徹底碎片整理

如何對 ext4 檔案系統進行徹底碎片整理

我想全部由於某些原因,我的 ext4 檔案系統中的檔案沒有碎片化。可悲的是e4defrag(這裡建議:如何對 ext4 檔案系統進行碎片整理)無法對多個文件進行碎片整理。我有什麼選擇?

檔案系統中已經包含所有檔案(不能以任何方式更改它們)並且幾乎已滿。有幾個空閒區塊(根據df -h:85G 和 80G 已使用的 434M 可用)可以用作緩衝區。我不需要在碎片整理時安裝檔案系統。此外,我還有其他可用的檔案系統,有足夠的空間用作緩衝區。

我的一個想法是將檔案移動到其他檔案系統,然後以某種方式將它們複製回來,告訴檔案系統連續儲存它們。

[編輯]

我剛剛發現我不能依賴e4defrag輸出。它將具有多個範圍的檔案計為碎片,但它知道範圍是連續的:

$ sudo filefrag file.file
file.file: 1 extent found
$ sudo e4defrag -vc file.file
e4defrag 1.45.5 (07-Jan-2020)
<File>
[ext 1]: start 22388736: logical 0: len 32768
[ext 2]: start 22421504: logical 32768: len 32768
[ext 3]: start 22454272: logical 65536: len 32768
[ext 4]: start 22487040: logical 98304: len 27962

 Total/best extents 4/1
 Average size per extent 126266 KB
 Fragmentation score 0
 [0-30 no problem: 31-55 a little bit fragmented: 56- needs defrag]
 This file (file.file) does not need defragmentation.
 Done.

答案1

我希望 ext4 檔案系統中的所有檔案不會因為某些原因而碎片化。

雖然有合理的理由進行碎片整理,但沒有要求每一個要進行碎片整理且連續的文件。任何人可能希望對每個文件進行碎片整理的主要原因與 OCPD 相關,這完全是浪費時間,因為文件系統在掛載 rw 後不久就會再次變得「碎片化」。

檔案系統...幾乎已滿...

在這種情況下,您可能無法對每個文件進行碎片整理,因為 Linux 碎片整理程序往往在文件級別工作,並且您不一定有足夠的連續可用空間來對每個文件進行碎片整理。

我的一個想法是將文件移動到其他文件系統,然後將它們複製回來...

這是你最可行的選擇。然而,具體的文件分配是由檔案系統驅動程式決定的。


要重新排序區塊,有一個空閒區塊作為緩衝區就足夠了。

Linux 檔案系統開發人員沒有給予碎片整理與 Windows 開發人員相同的優先順序。所以問題不在於技術上不可能,而是沒有人費心寫任何程式來做到這一點。

碎片整理後,fs 可以設定為 ro。

然後使用專為 ro 使用而設計的檔案系統,例如 squashfs。所有文件都將被整理、連續甚至壓縮。

答案2

如果某些文件很大,從技術上來說,在不重新格式化文件系統的情況下對所有文件進行碎片整理可能是不可能的。

任何ext4 檔案系統由一系列塊組組成。預設情況下,每個區塊組的長度為 128 MiB。

每個區塊組以一堆檔案系統元資料(超級區塊、群組描述符、分配點陣圖和索引節點表)開始,後面是屬於該區塊群組的檔案所使用的實際資料區塊。這意味著檔案系統元資料大部分均勻地分佈在整個裝置上。

然而,由於可選flex_bg功能,多個區塊組可以聚合在一起形成一個更大的區塊組。mke2fs自 2008 年左右以來,我們一直在預設情況下建立包含 16 個區塊組的檔案系統。假設您在使用 mkfs 選項建立檔案系統時沒有變更此設置-G,那麼您的檔案系統可能會分為 2-GiB 的彈性組。

除非所有檔案都明顯小於 2 GiB,否則您將不可避免地遇到這樣的情況:下一個要儲存的檔案必須分散在兩個或更多(靈活)區塊組中。當然,如果您的任何檔案大於(flex)區塊組中的可用資料區塊,則肯定會發生這種情況。

為了實現您的目標,您可能必須使用-G比預設 16 高得多的選項設定來重新格式化檔案系統,以使檔案系統使用真正大的彈性區塊組。

答案3

早在 DOS 6 之前,對 FAT 分區進行碎片整理的通常建議是:

  1. 將文件從分區複製到其他分區;
  2. 擦拭分區;
  3. 在空分區上重新建立目錄結構;和
  4. 將文件複製回來。

我從來沒有嘗試過這個,因為在碎片整理對我來說成為一個問題之前,MS-DOS 6 就已經出來了(及其包含的碎片整理實用程式)。

相關內容