Reduzieren Sie die Zeit zum Verkleinern des Ext4-Dateisystems

Reduzieren Sie die Zeit zum Verkleinern des Ext4-Dateisystems

Ich muss ein großes ext4-Volume verkleinern und möchte dies mit so wenig Ausfallzeit wie möglich tun. Nach den Tests, die ich bisher durchgeführt habe, sieht es so aus, als könnte es für die Größenänderung bis zu einer Woche lang ausgehängt werden. Gibt es eine Möglichkeit, das Dateisystem im Voraus online zu defragmentieren, damit resizefs nicht so viele Blöcke verschieben muss?

Aktualisieren: Es hat einige Zeit gedauert, bis ich an diesen Punkt gekommen bin. Ich habe zur Vorbereitung der Verkleinerung einige TB an Daten verschoben und mit den Informationen in der Antwort unten experimentiert. Schließlich habe ich die folgende Befehlszeile erstellt, die mit nur geringfügigen Änderungen für andere in einer ähnlichen Situation nützlich sein könnte. Beachten Sie auch, dass sie als Root ausgeführt werden muss, damit die Befehle filefrag und e4defrag ordnungsgemäß funktionieren – die Dateieigentümerschaft wird dadurch nicht beeinträchtigt. Sie funktioniert auch ordnungsgemäß bei Dateien mit mehreren Hardlinks, von denen ich viele habe.

find -type f -print0 | xargs -0 filefrag -v | grep '\.\.[34][0-9]\{9\}.*eof' -A 1 | awk '/extents found/ {match($0, /^(.*): [0-9]+ extents found/, res); print res[1]}' | xargs -n 1 -d '\n' e4defrag

Eine kurze Erklärung, um anderen die Änderung/Verwendung zu erleichtern:

Der erste „Find“-Befehl erstellt die Liste der zu bearbeitenden Dateien. Möglicherweise ist dies jetzt überflüssig oder könnte besser gemacht werden, aber beim Testen hatte ich andere Filter dort und habe es als praktischen Ort gelassen, um den Umfang des restlichen Befehls zu ändern.

Führen Sie als Nächstes jede Datei durch „filefrag -v“, um eine Liste aller von jeder Datei verwendeten physischen Blöcke zu erhalten.

Das grep sucht nach dem letzten Block, der von jeder Datei verwendet wird (Zeile, die mit „eof“ endet), und wo dieser Block eine 10-stellige Zahl ist, die mit 3 oder 4 beginnt. In meinem Fall wird die Größe meines neuen Dateisystems 2980024320 Blöcke lang sein, sodass es gut genug ist, nur mit Dateien zu arbeiten, die sich im zu entfernenden Festplattenbereich befinden. Wenn grep auch die folgende Zeile (das „-A 1“) einschließt, wird auch der Dateiname in die Ausgabe für den nächsten Abschnitt aufgenommen. Hier muss jeder andere, der dies tut, den Befehl je nach Größe seines Dateisystems ändern. Es könnte wahrscheinlich auch viel besser gemacht werden, aber das funktioniert jetzt für mich und ich bin faul.

awk extrahiert nur die Dateinamen aus dem ganzen anderen Müll, den grep in der Filefrag-Ausgabe hinterlassen hat.

Und schließlich wird e4defrag aufgerufen – die tatsächliche Fragmentanzahl ist mir egal, aber es hat den Nebeneffekt, dass die physischen Blöcke verschoben werden (hoffentlich in einen früheren Teil des Laufwerks), und es funktioniert ohne zusätzlichen Aufwand bei Dateien mit mehreren Hardlinks.

Wenn Sie nur wissen möchten, welche Dateien defragmentiert werden, ohne tatsächlich Daten zu verschieben, lassen Sie einfach den letzten Teil des Befehls weg.

find -type f -print0 | xargs -0 filefrag -v | grep '\.\.[34][0-9]\{9\}.*eof' -A 1 | awk '/extents found/ {match($0, /^(.*): [0-9]+ extents found/, res); print res[1]}'

Antwort1

Soweit ich das beurteilen kann,ext4fs unterstützt Online-Defragmentierung(es wird unter „erledigt“ aufgeführt, aber das Statusfeld ist leer;der Original-Patchist von Ende 2006) bise4defrag in e2fsprogs 1.42 oder neuer, was bei Ausführung unter Linux 2.6.28 oder neuerermöglicht es, den Status von Verzeichnissen oder ggf. Dateisystemen abzufragen und zumindest einzelne Dateien zu defragmentieren.e2fsprogsStand heute ist die Version 1.42.8.

Ich bin mir nicht sicher, ob dir das hilft, denn was du tun willst, scheint nicht so sehrdefragmentierendie Daten alskonsolidierendie Daten auf der Festplatte. Die beiden werden oft zusammen durchgeführt, es handelt sich jedoch um deutlich unterschiedliche Vorgänge.

Eine einfache Möglichkeit zur Konsolidierung der Daten, diekönnteDie beste Vorgehensweise, vorausgesetzt, Sie verfügen über ausreichend freien Speicherplatz, besteht darin, jede Datei in eine andere logische Logik auf demselben Dateisystem zu kopieren und dann mv zu verwenden, um die vom Inode angezeigten Daten durch die neue Kopie zu ersetzen. Dies hängt stark davon ab, wie der Ext4-Allocator im Detail funktioniert, aber es könnte einen Versuch wert sein und sollte relativ einfach zu skripten sein. Achten Sie einfach auf Dateien, die von mehr als einer Stelle aus fest verknüpft sind (bei einem solchen Schema ist es möglicherweise am einfachsten, alle Dateien mit einer Linkanzahl > 1 einfach zu ignorieren und resizefs diese verarbeiten zu lassen).

verwandte Informationen