Gibt es Deduplizierungsskripte, die btrfs CoW als Dedup verwenden?

9

Auf der Suche nach Deduplizierungswerkzeugen unter Linux gibt es viele, siehe z . B. diese Wiki-Seite .

Fast alle Skripte erkennen entweder nur die doppelten Dateinamen oder entfernen doppelte Dateien, indem sie mit einer einzelnen Kopie verknüpft werden.

Mit dem Aufstieg von btrfs würde es eine andere Option geben: das Erstellen einer CoW-Kopie (Copy-on-Write) einer Datei (wie cp reflink=always). Ich habe kein Werkzeug gefunden, das dies tut. Ist jemandem ein Werkzeug bekannt, das dies tut?

Peter Smit
quelle
Update: Der Entwicklungszweig von rmlint, und ich glaube auch master, hat Folgendes hinzugefügt: 1) Inkrementelles Datei-Hashing. Eine Datei wird nicht erneut gehasht, es sei denn, sie hat sich seit dem letzten Lauf geändert [das ist riesig]. 2) Inkrementelles Deduping . Es werden nur Dateien dedupiert, die noch nicht vorhanden oder geändert wurden. [Das ist noch viel schlimmer.] In Kombination mit nur Hashing-Dateien, nachdem alle anderen Schnellvergleichsmethoden fehlgeschlagen sind, ist dies unschlagbar. Bedup wird aufgegeben und anscheinend nicht kompiliert. Ich habe einen detaillierten Vergleich durchgeführt: docs.google.com/spreadsheets/d/…
Jim

Antworten:

17

Zu diesem Zweck habe ich Bedup geschrieben . Es kombiniert inkrementelles Btree-Scannen mit CoW-Deduplizierung. Am besten unter Linux 3.6, wo Sie Folgendes ausführen können:

sudo bedup dedup
Gabriel
quelle
Hallo @Gabriel, ein Kommentar zu meiner Antwort unten besagt, dass "... bedup ... Dinge in Größenbehälter packen und nur die gesamte Datei lesen, um bei Bedarf Prüfsummen zu erstellen." Ist das wahr? Wenn ja, möchte ich meine Antwort unten aktualisieren. (Und benutze Bedup selbst!) Leider konnte ich dies nirgendwo überprüfen. Ich habe Google ausprobiert, auf Ihrer Github-Seite gesucht und nach dem Code gesucht. Vielen Dank.
Jim
4

Ich habe versucht, mich zu betten. Obwohl es gut ist (und einige nützliche, differenzierte Funktionen aufweist, die es für viele zur besten Wahl machen können), scheint es die Gesamtheit aller Zieldateien nach Prüfsummen zu durchsuchen.

Welches ist schmerzhaft langsam.

Andere Programme wie rdfind und rmlint scannen dagegen anders.

rdfind hat eine "experimentelle" Funktion zur Verwendung von btrfs reflink. (Und "solide" Optionen für Hardlinks, Symlinks usw.)

rmlint bietet "solide" Optionen für btrfs-Klonen, Reflink, reguläre Hardlinks, Symlinks, Löschen und Ihre eigenen benutzerdefinierten Befehle.

Noch wichtiger ist jedoch, dass rdfind und rmlint erheblich schneller sind. Wie in Größenordnungen. Anstatt alle Zieldateien nach Prüfsummen zu durchsuchen, geschieht dies ungefähr:

  • Scannen Sie das gesamte Zieldateisystem und erfassen Sie nur Pfade und Dateigrößen.
  • Entfernen Sie Dateien mit eindeutigen Dateigrößen aus der Betrachtung. Dies allein spart viel Zeit und Festplattenaktivität. ("Scads" ist eine inverse Exponentialfunktion oder so.)
  • Scannen Sie von den verbleibenden Kandidaten die ersten N Bytes. Entfernen Sie aus der Betrachtung diejenigen mit den gleichen Dateigrößen, aber unterschiedlichen ersten N Bytes.
  • Machen Sie dasselbe für die letzten N Bytes.
  • Nur von diesem (normalerweise winzigen Bruchteil) Rest, suchen Sie nach Prüfsummen.

Weitere Vorteile von rmlint sind mir bekannt:

  • Sie können die Prüfsumme angeben. md5 zu gruselig? Versuchen Sie es mit sha256. Oder 512. Oder Bit für Bit-Vergleich. Oder Ihre eigene Hashing-Funktion.
  • Sie haben die Möglichkeit, Btrfs "zu klonen" und "neu zu verknüpfen", anstatt nur neu zu verknüpfen. "cp --reflink = always" ist nur ein bisschen riskant, da es nicht atomar ist, nicht weiß, was sonst noch für diese Datei im Kernel vor sich geht, und Metadaten nicht immer erhalten bleiben. "Clone", OTOH (eine Abkürzung ... Ich habe den offiziellen API-bezogenen Namen ausgeblendet), ist ein Aufruf auf Kernel-Ebene, der atomar ist und Metadaten beibehält. Fast immer ergibt sich das Gleiche, aber ein bisschen robuster und sicherer. (Obwohl die meisten Programme intelligent genug sind, um die doppelte Datei nicht zu löschen, kann ein temporärer Reflink zum anderen nicht erfolgreich durchgeführt werden.)
  • Es gibt eine Menge Optionen für viele Anwendungsfälle (was auch ein Nachteil ist).

Ich habe rmlint mit deduperemove verglichen, das auch blind alle Zieldateien nach Prüfsummen durchsucht. Duperemove brauchte mehrere Tage, um mein Volumen zu vervollständigen (4, glaube ich), und ging auf Hochtouren . fmlint brauchte einige Stunden , um Duplikate zu identifizieren, und dann weniger als einen Tag, um sie mit dem Btrfs-Klon zu dedupieren.

(Das heißt, jeder, der sich die Mühe macht, qualitativ hochwertige, robuste Software zu schreiben und zu unterstützen und sie kostenlos zu verschenken, verdient ein großes Lob!)

Übrigens: Sie sollten um jeden Preis vermeiden, Deduping mit regulären Hardlinks als "allgemeine" Dedup-Lösung durchzuführen.

Während Hardlinks in bestimmten gezielten Anwendungsfällen äußerst praktisch sein können (z. B. einzelne Dateien oder mit einem Tool, das nach bestimmten Dateitypen suchen kann, die eine Mindestgröße überschreiten - oder als Teil vieler kostenloser und kommerzieller Backup- / Snapshot-Lösungen), kann dies katastrophal sein für "Deduplizierung" auf einem großen allgemein verwendeten Dateisystem. Der Grund dafür ist, dass die meisten Benutzer möglicherweise Tausende von Dateien in ihrem Dateisystem haben, die binär identisch, aber funktional völlig unterschiedlich sind.

Beispielsweise generieren viele Programme Vorlagen- und / oder versteckte Einstellungsdateien (manchmal in jedem einzelnen Ordner, den sie sehen können), die anfangs identisch sind - und die meisten bleiben so, bis Sie als Benutzer dies nicht benötigen.

Zur Veranschaulichung: Die Erstellung von Miniatur-Cache-Dateien für Fotos, die unzählige Programme in dem Ordner mit den Fotos generieren (und das aus gutem Grund - Portabilität), kann Stunden oder Tage dauern, aber die Verwendung einer Foto-App ist ein Kinderspiel. Wenn diese anfänglichen Cache-Dateien alle fest miteinander verknüpft sind, öffnen Sie die App später in einem Verzeichnis und es wird ein großer Cache erstellt. Dann raten Sie mal: Jetzt hat JEDER Ordner, der einen zuvor fest verknüpften Cache hat, jetzt den falschen Cache. Möglicherweise mit katastrophalen Folgen, die zu einer versehentlichen Datenvernichtung führen können. Und möglicherweise auch so, dass eine Backup-Lösung explodiert, die nicht über Hardlinks informiert ist.

Darüber hinaus können ganze Schnappschüsse ruiniert werden. Der springende Punkt bei Schnappschüssen ist, dass sich die "Live" -Version weiter ändern kann und ein Rollback auf einen vorherigen Status möglich ist. Wenn jedoch alles fest miteinander verbunden ist, "rollen" Sie auf dasselbe zurück.

Die gute Nachricht ist jedoch, dass das Dedupieren mit Btrfs-Klon / -Reflink diesen Schaden rückgängig machen kann (ich denke - da während des Scans fest verknüpfte Dateien als identisch angezeigt werden sollten ... es sei denn, es hat Logik, Hardlinks nicht zu berücksichtigen. Dies hängt wahrscheinlich davon ab das spezifische Dienstprogramm, das die Dedupierung durchführt.)

Jim
quelle
Das ist nicht richtig; bedup macht dasselbe, legt Dinge in Eimer und liest nur die gesamte Datei, um bei Bedarf Prüfsummen zu erstellen. Bedup speichert das Ergebnis auch so, dass nachfolgende Läufe noch schneller sind.
Peter Smit
@PeterSmit, ich möchte meine Antwort aktualisieren (und erwägen, selbst wieder ins Bett zu wechseln), wenn ich den ersten Teil Ihres Kommentars überprüfen kann. Bedups Github-Readme-Datei erwähnt dies nicht, und eine Suche nach "Dateigröße" oder "Dateigröße" liefert keine offensichtlichen Antworten. Wie kann ich überprüfen?
Jim
Außerdem scheint das Bett in den letzten 3 Jahren aufgegeben worden zu sein. Was schade ist, denn es scheint eine wirklich fantastische Idee zu sein, die ich gerne verwenden würde! Ich hoffe du nimmst es wieder auf.
Jim