Wie kann ich das ext4-Dateisystem vollständig defragmentieren?

Wie kann ich das ext4-Dateisystem vollständig defragmentieren?

Ich willallemeine Dateien in einem ext4-Dateisystem sind aus bestimmten Gründen nicht fragmentiert. Leider e4defrag(hier empfohlen:So defragmentieren Sie ein ext4-Dateisystem) kann mehrere Dateien nicht defragmentieren. Welche Alternativen habe ich?

Das Dateisystem enthält bereits alle Dateien (sie dürfen in keiner Weise geändert werden) und ist fast voll. Es gibt mehrere freie Blöcke (laut df -h: 434 MB verfügbar von 85 GB und 80 GB verwendet), die als Puffer verwendet werden können. Ich muss das Dateisystem während der Defragmentierung nicht mounten. Außerdem habe ich ein anderes Dateisystem mit genügend Speicherplatz zur Verfügung, das als Puffer verwendet werden kann.

Eine meiner Ideen besteht darin, die Dateien in ein anderes Dateisystem zu verschieben und sie dann irgendwie wieder zurückzukopieren und dem Dateisystem mitzuteilen, dass es sie zusammenhängend speichern soll.

[BEARBEITEN]

Ich habe gerade festgestellt, dass ich mich nicht auf e4defragdie Ausgabe verlassen kann. Sie zählt Dateien mit mehr als einem Extent als fragmentiert, obwohl sie weiß, dass die Extents zusammenhängend sind:

$ 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.

Antwort1

Ich möchte aus bestimmten Gründen, dass alle meine Dateien in einem Ext4-Dateisystem nicht fragmentiert sind.

Es gibt zwar legitime Gründe für eine Defragmentierung, aber keiner erfordertjeder einzelneDatei, die defragmentiert werden soll und zusammenhängend ist. Die Hauptgründe, warum jemand jede Datei defragmentieren möchte, hängen mit OCPD zusammen, was reine Zeitverschwendung ist, da das Dateisystem kurz nach der RW-Montage wieder „fragmentiert“ wird.

Das Dateisystem ... ist fast voll ...

In diesem Szenario können Sie wahrscheinlich nicht jede Datei defragmentieren, da Linux-Defragmentierungsprogramme dazu neigen, auf Dateiebene zu arbeiten und Sie nicht unbedingt über genügend zusammenhängenden freien Speicherplatz verfügen, um jede Datei zu defragmentieren.

Eine meiner Ideen besteht darin, die Dateien in ein anderes Dateisystem zu verschieben und sie dann wieder zurückzukopieren ...

Das ist Ihre praktikabelste Option. Die spezifische Dateizuordnung wird jedoch vom Dateisystemtreiber bestimmt.


Um Blöcke neu anzuordnen, reicht es aus, einen freien Block als Puffer zu haben.

Die Entwickler von Linux-Dateisystemen haben der Defragmentierung nicht die gleiche Priorität eingeräumt wie die Windows-Entwickler. Das Problem ist also nicht so sehr, dass es technisch unmöglich ist, sondern dass sich niemand die Mühe gemacht hat, entsprechende Programme zu schreiben.

Das FS kann nach der Defragmentierung auf ro gesetzt werden.

Verwenden Sie dann ein für die Verwendung mit Ro entwickelter Dateisystem wie Squashfs. Alle Dateien werden defragmentiert, zusammenhängend und sogar komprimiert.

Antwort2

Wenn einige Ihrer Dateien groß sind, ist es möglicherweise technisch unmöglich, sie alle zu defragmentieren, ohne das Dateisystem neu zu formatieren.

Beliebigext4-Dateisystembesteht aus einer Folge von Blockgruppen. Standardmäßig ist jede Blockgruppe 128 MiB lang.

Jede Blockgruppe beginnt mit einer Reihe von Dateisystemmetadaten (Superblock, Gruppendeskriptor, Zuordnungsbitmaps und Inode-Tabellen), gefolgt von den eigentlichen Datenblöcken, die von den zu dieser Blockgruppe gehörenden Dateien verwendet werden. Das bedeutet, dass die Dateisystemmetadaten größtenteils gleichmäßig über das gesamte Gerät verteilt sind.

Dank der optionalen flex_bgFunktion können jedoch mehrere Blockgruppen zu einer einzigen größeren zusammengefasst werden. mke2fserstellt seit etwa 2008 standardmäßig Dateisysteme mit 16 zusammengepackten Blockgruppen. Vorausgesetzt, Sie haben dies beim Erstellen des Dateisystems mit der -GOption für mkfs nicht geändert, ist Ihr Dateisystem daher wahrscheinlich in 2-GiB-Flex-Gruppen aufgeteilt.

Sofern nicht alle Ihre Dateien deutlich kleiner als 2 GiB sind, würden Sie zwangsläufig in eine Situation geraten, in der die nächste zu speichernde Datei auf zwei oder mehr (flexible) Blockgruppen aufgeteilt werden müsste. Dies ist natürlich garantiert, wenn eine Ihrer Dateien größer ist als die nutzbaren Datenblöcke in einer (flexiblen) Blockgruppe.

Um Ihr Ziel zu erreichen, müssen Sie das Dateisystem daher wahrscheinlich mit einer viel höheren Einstellung der -GOption als der Standardeinstellung 16 neu formatieren, damit das Dateisystem wirklich große Flexblockgruppen verwendet.

Antwort3

Vor DOS 6 lautete der übliche Rat zum Defragmentieren einer FAT-Partition:

  1. Kopieren Sie die Dateien von der Partition auf eine andere Partition.
  2. Löschen Sie die Partition.
  3. Erstellen Sie die Verzeichnisstruktur auf der leeren Partition neu.
  4. Kopieren Sie die Dateien zurück.

Ich habe das nie ausprobiert, da MS-DOS 6 (mit dem enthaltenen Defragmentierungsprogramm) herauskam, bevor die Defragmentierung für mich zum Problem wurde.

verwandte Informationen