Gibt es ein Dateisystem, in dem nur eine Kopie einer Datei gespeichert ist und andere Kopien nur Verweise sind?

18

Die Frage ist möglicherweise ungenau, daher werde ich versuchen, sie genauer zu erläutern.

Aus mehreren Gründen habe ich viele Kopien derselben Datei auf meinem Linux-Dateisystem. Viele von ihnen sind ziemlich groß.

Angenommen, ich habe /path/to/some.fileund Kopien dieser Datei /other/path/file.nameund /yet/another/path/third.copy. Ich frage mich, ob es ein Dateisystem gibt, bei dem zwei dieser Dateien buchstäblich als Referenz zum Original dienen. Wenn der Benutzer eine von ihnen ändert, werden sie natürlich zu eigenständigen Dateien.

PS. Ich weiß, dass dies (teilweise) durch die Verwendung von Links erreicht werden kann. Aber ich möchte, dass diese Funktion, die ich oben erklärt habe, transparent vom Dateisystem verarbeitet wird.

DejanLekic
quelle
Da es noch keine perfekte Antwort zu geben scheint, warum nicht ein Skript schreiben (möglicherweise von cron ausgeführt), das Dateien durch harte Links ersetzt (oder, wenn es für einige von ihnen sicher ist, Symlinks)? In jedem Fall sollten Sie fdupes code.google.com/p/fdupes überprüfen, wenn Sie nicht bereits wissen, wo sich alle Duplikate befinden .
Joe
1
Ich kann das nicht tun, weil, wenn einige Benutzer Daten in einem von Duplikaten ändern, sie unabhängige Dateien werden sollten, weil der Inhalt nach der Änderung unterschiedlich ist ... Wenn ich symbolische Links mache, dann wird die Änderung tatsächlich das Original ändern. Stellen Sie sich die Originaldatei als Wert in einer funktionalen Programmiersprache vor. Wenn Sie sie ändern, erhalten Sie buchstäblich ein neues Objekt und einen Verweis darauf.
DejanLekic
OKAY. Nur ein paar Ideen: Gibt es eine Möglichkeit, wie Sie zwischen Ihren Benutzern und diesen Dateien gelangen können? Wenn Sie können, können Sie mit einem Link beginnen (sym oder hard) und dann den Link unterbrechen, wenn sie etwas in die Datei schreiben. Sie können auch so etwas wie diff verwenden, um nur Unterschiede zu speichern und so viel Platz wie in einem Versionskontrollsystem zu sparen. Wenn Sie die Dateien in eine dieser Dateien einfügen, können die Unterschiede für Sie behoben werden. Ich habe nicht viel mit VCS-Systemen gearbeitet, daher kenne ich die Details nicht.
Joe

Antworten:

17

Diese Funktion wird als Deduplizierung bezeichnet . Keines der populären Linux-Dateisysteme (ext *) unterstützt es, aber anscheinend unterstützt ZFS es teilweise . Es gibt auch eine Tabelle mit Dateisystemen , in der unter anderem die Deduplizierung aufgeführt ist. Es gibt jedoch anscheinend keine gängigen Optionen - es ist jedoch eine geplante Funktion für Btrfs.

Ich würde vermuten, dass das regelmäßige Überprüfen Ihres Dateisystems und das Erstellen geeigneter fester Links das Beste ist, was Sie im Moment tun können, obwohl dies nicht das Kopieren beim Schreiben impliziert.

Claudius
quelle
Ich hoffte, dass BTRFS es schaffen würde. Ich wusste nicht, dass sie diese Funktion planen - gute Nachrichten! Vielen Dank!
DejanLekic
10

Das primäre Schlüsselwort, nach dem Sie suchen möchten, lautet "copy on write". BTRFS hat eine Klon-Operation, die genau das macht, was Sie wollen und cp --reflinktun wird, wonach Sie suchen, vorausgesetzt, Ihr System verfügt über einen Kernel und Coreutils 7.5. Wiki-Quelle Auch bedup ist ein Tool, mit dem Duplikate über ein gesamtes Volume zusammengeführt werden. CoW ist auch die treibende Kraft unter der Snapshot-Technologie IIRC von btrfs.

afrazier
quelle
Mir ist bewusst, cp --reflinkaber ich möchte, dass der FS Klone erkennt und stattdessen Referenzen transparent verwendet. Ich bin auch weg von dem bedupWerkzeug.
DejanLekic
Wenn ein Prozess auf Benutzerebene aus einer Datei liest und in eine andere schreibt, wie kann die FS-Ebene dann feststellen, dass es sich um eine exakte Kopie und nicht um eine geänderte Kopie handelt? Aus diesem Grund gibt es ein separates ioctl zum Klonen und nicht nur zum Lesen und Schreiben. Anwendungen, die Dateien klonen und CoW verwenden möchten, sollten solche Dinge verwenden, wenn sie verfügbar sind, und auf andere Weise zurückgreifen. Es gibt keine zuverlässige magische Methode, mit der die FS-Ebene ein Kopierereignis erkennen und stattdessen CoW ausführen kann. Eine App muss entweder den richtigen Aufruf für den Job ( cp --reflink/ clone) oder ein separates Tool verwenden, um den Job später zu beenden (bedup).
afrazier
Durch Vergleichen von Hashes (sicherer) oder CRC + Timestamp-Werten. Durch das Schreiben würde FS definitiv eine unabhängige Kopie einer Datei erstellen. Darüber hinaus kann dieses System auf Seitenebene implementiert werden ...
DejanLekic
Und wo genau im Kernel wird das gemacht? Was du redest, ist kein einfaches Problem. Dies auf Seitenebene ist ebenfalls möglich, erfordert jedoch eine enorme Menge an RAM, um dies inline zu tun. ZFS kann mehr als 20 GB RAM pro TB Daten [Quelle ] umfassen, und OpenDedup möchte 8 GB RAM pro TB Daten w / 4k Seiten [Quelle ]. Die Anforderungen von ZFS können mit L2ARC auf Kosten der Leistung reduziert werden.
afrazier
1
WHS führt keine Deduplizierung durch, es sei denn, Sie sprechen über den Sicherungsspeicher. Im Falle einer Backup-Software kann der Client den größten Teil der Arbeit erledigen und den Hash mit dem Server überprüfen, bevor Daten zum Schreiben an ihn gesendet werden. Ein Sicherungsdienst ist ein ganz anderes Tier als ein Dateisystem. Strategien, die für einen funktionieren, sind für einen anderen möglicherweise nicht realisierbar.
afrazier
4

Es gibt ein Online-Dateisystem S3QL, das für Backups mit hoher Deduplizierungskapazität entwickelt wurde.

Daniel Fanjul
quelle
Ich hätte sagen sollen, dass ich das für ein lokales Dateisystem brauche ... +1 auf jeden Fall für nützliche Informationen.
DejanLekic
@DejanLekic, URLs wie local: // ... sind erlaubt.
Daniel Fanjul
0

Zfs, Btrfs, Ext3cow, Bcachefs (Afaik, aber es besteht die Möglichkeit, dass es noch nicht implementiert ist). Microsoft hatte eine in der Entwicklung, aber sie stoppten aus unbekannten Gründen.

orange_juice6000
quelle