Wie finde ich Datenkopien einer bestimmten Datei im Btrfs-Dateisystem?

7

Ich habe mein Btrfs-Dateisystem mit Bedup dedupliziert, daher sind jetzt alle doppelten Dateien (über einer bestimmten Größe) "Reflink" -Kopien.

Gibt es eine Möglichkeit, unter Berücksichtigung eines Dateinamens zu sehen, welche anderen Dateien dieselben Reflinks sind?

Peter Smit
quelle
Wenn es keine native Methode für btrfs gibt, können Sie immer filefrag -valle Dateien ausführen und gemeinsame Bereiche finden.
Stéphane Chazelas
@ StéphaneChazelas das funktioniert nicht. Zwei nicht verwandte Dateien mit nichts gemeinsam zeigen die gleiche Ausgabe
Hilikus
@Hilikus, müssen Sie möglicherweise eine syncbesonders ausgeben, wenn die Flaggen unknown_loc oder delalloc zeigen
Stéphane Chazelas
@ StéphaneChazelas gist.github.com/theHilikus/5fd0e38fd72fbcc97ae45ced703b0b47 Wie Sie sehen, ergeben zwei verschiedene Dateien mit unterschiedlichem Inhalt und unterschiedlicher Größe die gleichen Offsets
Hilikus
1
@Hilikus, ja, in diesem Fall gibt es nichts zum erneuten Verknüpfen (wie bei leeren Dateien oder kurzen Symlinks gibt es keinen Datenblock). Um zusammenzufassen, anstatt zu vergleichen filefrag -v, vergleichen Sie, filefrag -v | grep -ve inline -e unknown_loc -e delallocda diese nicht erneut verknüpft werden können. Sie werden einen weiteren Hinweis darauf bemerken, dass der "physische Offset" für diese immer 0 ist (obwohl sich natürlich nicht alle am Anfang des Blockgeräts befinden)
Stéphane Chazelas,

Antworten:

3

Der springende Punkt bei einem CoW-Dateisystem (Copy-On-Write) wie btrfs ist, dass der Inhalt mehrerer Versionen einer Datei effizient gemeinsam genutzt werden kann. Sie können eine Datei also als eine Sammlung von Bereichen mit Inhalten sehen, in denen der Inhalt möglicherweise von anderen Dateien gemeinsam genutzt wird oder nicht. Oder durch andere Versionen der Datei. Die Implementierung ähnelt eher einem Erweiterungsbaum, in dem Erweiterungen gemeinsam genutzt werden können.

Für die Deduplizierung wird derselbe Mechanismus verwendet, der beim Schreiben einer Änderung an einer Datei (und beim Erstellen einer neuen Version dieser Datei) funktioniert. Die Implementierung wird unter https://github.com/g2p/bedup beschrieben :

Die Deduplizierung wird mithilfe einer Btrfs-Funktion implementiert, mit der Daten von einer Datei in die andere geklont werden können. Die geklonten Bereiche werden auf der Festplatte gemeinsam genutzt, wodurch Platz gespart wird.

Die Implementierung im Kernel erfolgt (zum Beispiel) unter http://lxr.free-electrons.com/source/fs/btrfs/ioctl.c#L2843 ; Der Kommentar macht deutlich, dass es nicht darum geht, die Datei neu zu flinken, sondern um Bereiche:

2843 /**
2844  * btrfs_clone() - clone a range from inode file to another
2845  *
2846  * @src: Inode to clone from
2847  * @inode: Inode to clone to
2848  * @off: Offset within source to start clone from
2849  * @olen: Original length, passed by user, of range to clone
2850  * @olen_aligned: Block-aligned value of olen, extent_same uses
2851  *               identical values here
2852  * @destoff: Offset within @inode to start clone
2853  */

Es ist also nicht die Datei, die erneut verknüpft wird, sondern der Bereich, der gemeinsam genutzt wird. Eine neue Datei könnte auch erstellt worden sein, indem der Bereich mit mehreren Dateien geteilt wurde. Oder über mehrere Volumes hinweg geteilt werden. Oder (nicht sicher, ob dies derzeit unterstützt wird) sogar denselben Bereich mehrmals in derselben Datei zu haben;)

Daher gibt es kein übergeordnetes Tool zum Suchen von Dateien, die die gesamte Datei gemeinsam nutzen, da dies ein abgeleitetes Konzept ist. Natürlich wäre es möglich, Unterstützung dafür zu schreiben, aber soweit ich weiß, ist das nicht der Fall ...

Rutger Nijlunsing
quelle
0

Ich habe gerade ein Programm namens fienode(← Link) veröffentlicht, das einen SHA1-Hash der physischen Ausmaße einer Datei berechnet. Identische CoW-Kopien haben denselben Hash.

Im Prinzip können Sie dies für alle Dateien im Dateisystem ausführen und dann nach identischen Hashes suchen.

Hier finden Sie auch eine ausführlichere Antwort, in der erläutert wird, warum dies erforderlich ist.

Beachten Sie jedoch, dass es BTRFS frei steht, die physischen Ausmaße zu ändern. Ich habe beobachtet, dass eine große reflinked Datei ihre physischen Ausdehnungen ohne Provokation ändert, wodurch sich die fienodeAusgabe unterscheidet, obwohl die Mehrheit der physischen Ausdehnungen noch gemeinsam genutzt wurde.

pwaller
quelle