Ich spiele mit btrfs, das cp --reflink
Copy-on-Write ermöglicht. Andere Programme wie beispielsweise lxc-clone
kö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 (Bearbeiten: siehemeine andere Antwort).inode
, das Ihnen beim Vergleich zwischen Dateien sagen würde, dass die Dateien die gleiche physische Ausdehnung haben.
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. Offenbarfilefrag
Das Dienstprogramm soll die Extents mit -v anzeigen. Außerdembtrfs-debug-tree
zeigt 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öffentlichtfienode
Dies 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.