Wie kann ich überprüfen, ob es sich bei einer Dateikopie um einen Reflink/CoW handelt?

Wie kann ich überprüfen, ob es sich bei einer Dateikopie um einen Reflink/CoW handelt?

Ich spiele mit btrfs, das cp --reflinkCopy-on-Write ermöglicht. Andere Programme wie beispielsweise lxc-clonekönnen diese Funktion ebenfalls nutzen. Meine Frage ist, wie man erkennt, ob eine Datei eine CoW einer anderen ist. Wie bei Hardlinks kann ich das anhand der Inode-Nummer erkennen.

Antwort1

Gute Frage. Es sieht so aus, als gäbe es derzeit keine einfachen Möglichkeiten, dies auf hoher Ebene herauszufinden.

Ein Problem ist, dass eine Datei nur einen Teil der Daten über Copy-on-Write freigeben kann. Dies wird als physischer Umfang bezeichnet undmanche oder alleder physischen Bereiche können zwischen CoW-Dateien geteilt werden.

Es gibt nichts Analoges zu einem inode, das Ihnen beim Vergleich zwischen Dateien sagen würde, dass die Dateien die gleiche physische Ausdehnung haben. (Bearbeiten: siehemeine andere Antwort).

Die Antwort auf niedriger Ebene besteht darin, dass Sie den Kernel fragen können, welche physischen Extents für die Datei verwendet werden, indem SieFS_IOC_FIEMAP ioctl, welches istdokumentiert inDocumentation/filesystems/fiemap.txt. Wenn alle physischen Bereiche gleich sind, muss die Datei grundsätzlich denselben zugrunde liegenden Speicher gemeinsam nutzen.

Nur wenige Dinge implementieren eine Möglichkeit, diese Informationen auf einer höheren Ebene anzuzeigen. Ich fand einigeCode hier eingeben. OffenbarfilefragDas Dienstprogramm soll die Extents mit -v anzeigen. Außerdembtrfs-debug-treezeigt diese Informationen an.

Ich würde jedoch Vorsicht walten lassen, da diese Dinge in der Praxis für diesen Zweck möglicherweise kaum Verwendung fanden und Sie auf Fehler stoßen könnten, die zu falschen Antworten führen. Verlassen Sie sich also nicht bei der Entscheidungsfindung zu Vorgängen auf diese Daten, da dies zu Datenbeschädigungen führen könnte.

Einige verwandte Fragen:

Antwort2

Ergänzend zu meiner vorherigen Antwort, ich habe gerade veröffentlichtfienodeDies berechnet einen SHA1-Hash der physischen Ausdehnung der Datei und kann verwendet werden, um einige (identische) Reflink-Kopien zu finden. Aber Vorsicht, es gibt Einschränkungen (siehedie Dokumentation). BTRFS hat beschlossen, einige, aber nicht alle physischen Ausmaße einer von mir erstellten Refink-Kopie ohne Provokation oder Warnung zu ändern, was zu einer Wertänderung führte.

Antwort3

Die einfachste Lösung hierfür ist die Verwendung von btrfs filesystem du . „Exclusive“. Bei CoW beträgt der Wert 0,00 B.

Hier gefunden:https://unix.stackexchange.com/a/655813/525352

Antwort4

Dies trägt nicht viel zur akzeptierten Antwort bei, aber jemand hat die Probleme und verschiedene Methoden hier zusammengefasst -https://www.ctrl.blog/entry/unterscheiden-sie-datei-link-klon.html

Symptome:

  • Unterscheiden Sie symbolische Links und Hardlinks von Ref-Links
  • Identifizieren Sie partielle Klone (Dateien, die einige, aber nicht alle Daten gemeinsam haben).

Lösungen:

  • Verwenden Sie Filefrag
  • Wird zur Identifizierung des Geräts verwendet stat, da sich Klone auf demselben Dateisystem befinden müssen.

Zitat:

Hardlinks haben dieselbe Inode-Nummer wie ihr Ziel, während Klone ihre eigenen Inodes haben. Diese Unterscheidung (und ein Copy-on-Write-Dateisystem) ermöglicht es Klonen, unabhängig von ihren Originalen zu agieren, selbst wenn sie von Programmen geändert werden, die das Klonen nicht unterstützen."

  • Führen Sie den Befehl filefrag -v file1 file2 (Teil von e2fsprogs) aus. Vergleichen Sie die physical_offset-Bereiche der Dateien innerhalb der Extent-Zeilen, bei denen das Shared-Flag gesetzt ist.

Die beiden Dateien teilen sich deduplizierte/geklonte Daten auf dem Speicherlaufwerk, wenn sie identische oder sich überschneidende Bereiche teilen.

Was die Feststellung betrifft, was das Original und was der Klon ist … Das ist ohne Zeitmaschine fast unmöglich herauszufinden.

verwandte Informationen