Ihre Frage ist aufgrund des Begriffs "Blöcke" ein wenig verwirrend. Dies ist ein sehr überladenes Wort, wenn es um Festplatten und Dateisysteme geht. (Ihr umgebender Kontext hilft jedoch bei der Verdeutlichung.) Btrfs befasst sich nicht mit Dateisystemblöcken fester Größe, sondern mit "Extents" variabler Größe. (Verwirrenderweise werden jedoch auch Blockzonen mit variabler Größe definiert.) ZFS befasst sich mit Dateisystem- "Blöcken", teilweise oder hauptsächlich, weil dies erheblich einfacher zu lösende Probleme darstellt. Sowohl Btrfs als auch ZFS kennen "Blöcke" auf Festplattenebene, die selbst Abstraktionen sind. (Dann haben wir auch "Block-Level-Speicher", was eine semantisch andere Bedeutung haben kann.) Ich habe diese Beschreibungen möglicherweise ein wenig falsch, nicht klar genug oder nicht 100% genau. (Wenn Sie Klarheit und 100% ige Genauigkeit beim Thema Blöcke benötigen, Tu so, als hättest du das nicht gelesen. Wenn Sie nur ein grobes Verständnis benötigen, um fortzufahren, sollten Sie bereit sein.) Der Hauptpunkt dieser Antwort ist nicht, "Blöcke" perfekt zu definieren, sondern die folgende Diskussion, die viel mehr in meinem Steuerhaus ist.
Wie @killermist schrieb, unterstützt ZFS nativ die Deduplizierung auf Blockebene [ZFS].
Es ist in ZFS nicht standardmäßig aktiviert. Das Einschalten ohne genügend Speicher ist mit einem erheblichen Leistungseinbruch verbunden. Außerdem benötigt ZFS anekdotisch eine angemessene Menge mehr als die empfohlene Faustregel "1 GB RAM pro 1 TB Speicher", um die gesamte Hashtabelle in den RAM zu passen. Trotzdem können Sie je nach Hardware eine Schreibgeschwindigkeit von über 40 MB / s erreichen. Ich verstehe das auf Tech-Laufwerken der Ära 2008, die Laufwerke der Ära 2015 laufen lassen. Für mich größtenteils akzeptabel für hauptsächlich Archivdaten. Der größte Nachteil der ZFS-Deduplizierung besteht darin, dass es noch keine elegante Möglichkeit gibt, dies im "Batch / Offline" -Modus (oder genauer "Out-of-Band" -Modus) zu tun, außer das Dedup einzuschalten und alles auf a zu kopieren neues temporäres Verzeichnis im selben Dateisystem, löscht die Originale und verschiebt dann den (jetzt deduplizierten) temporären Inhalt zurück.
Die Btrfs-Deduplizierung ist wohl etwas skizzenhafter, da derzeit nur Dienstprogramme von Drittanbietern für die Arbeit verfügbar sind. (Die jedoch entweder gut unterstützte Kernel-APIs und / oder eine gut unterstützte Option für cp verwenden und in beiden Fällen eine eigene Logik zum Ermitteln von Duplikaten benötigen, von der man hofft, dass sie absolut korrekt ist.) Ein potenzieller Vorteil sind jedoch diese Dienstprogramme sind "out-of-band". Die Kosten für die meisten Dienstprogramme bestehen jedoch darin, dass sie die Leistung beim Hämmern beeinträchtigen - was Stunden, Tage oder sogar Wochen dauern kann. (Persönlich würde ich mich lieber mit der immer langsameren Schreibleistung der In-Band-ZFS-Deduplizierung befassen, als meine Festplatten tagelang zu hämmern, beispielsweise einmal pro Jahr.)
Zwei Btrfs-Lösungen, von denen ich weiß, dass sie sich eher mit "Blöcken" (aber in einer anderen Definition) als mit Dateien befassen, sind Bienen und Dduper .
Bienen definieren beispielsweise beim ersten Durchlauf willkürlich eine "Block" -Größe für sich selbst, basierend auf dem verfügbaren Speicher und möglicherweise anderen Faktoren. (Obwohl ich wahrscheinlich den Zweck, die Funktionen, den Mechanismus und die Vor- und Nachteile falsch darstelle, habe ich es erst kürzlich als Option bewertet, da ich es nicht verwende.)
Bees ist wohl leicht hybride, da es so konzipiert ist, dass es kontinuierlich läuft und die Festplatten nicht so hart hämmert - obwohl es technisch immer noch nicht "in-band" ist wie ZFS-Dedup. Es nimmt einfach Duplikate nachträglich auf und versucht, sie mit einer leichten Berührung zu deduplizieren. Wenn Sie mit einer beliebig definierten Blockgröße arbeiten, passt diese standardmäßig in die Hashtabelle im RAM. Der Nachteil (vermutlich) ist, dass es in einem "Block" Ausmaße geben kann, die gleich sind, aber Bienen möglicherweise nicht dedupieren, weil die "Blöcke", in denen sie sich befinden, ansonsten unterschiedlich sind.
Beachten Sie , dass selbst Dienstprogramme, die speziell eine Btrfs-Deduplizierung auf Dateiebene durchführen (wie Bedup , Duperemove , Rmlint und andere), Ihre Anforderungen möglicherweise noch erfüllen. Ich kann nicht sicher sein, aber es scheint, als würden sie es tun. Das liegt daran, dass selbst ein Befehl "cp --reflink = always" "Dateien" nicht wirklich dedupliziert. Es dedupliziert Btrfs- Extents . Wenn sich eine neu verknüpfte "Datei" ändert, de-dupliziert Btrfs nur die Änderungen, die sich ändern, in ihre eigenen eindeutigen Bereiche. Der Rest der Datei bleibt dedupliziert. Auf diese Weise können große deduplizierte Dateien immer noch voneinander abweichen, als ob sie ihre eigenen eindeutigen Dateien wären, aber immer noch größtenteils dedupliziert werden.
(Dies ist auch , warum es so schwierig ist , zu bestimmen , ob eine „Datei“ reflinked ist oder nicht, denn das Konzept nicht einmal wirklich Sinn machen. Mit einer Datei Ausdehnungen können sie auf anderen gleich Ausdehnungen reflinked werden, ein Konzept , das tut Sinn machen, aber das ist zufällig eine besonders schwer zu beantwortende Frage. Deshalb lohnt es sich nicht zu versuchen, zu "erkennen", ob eine Datei bereits dedupliziert wurde, es sei denn, ein Btrfs-Deduplizierungsdienstprogramm verfolgt, was bereits dedupliziert wurde. Es gibt kein Attribut wie refcount zum Überprüfen. Es ist ohnehin einfacher, es erneut zu deduplizieren. Im Gegensatz dazu ist es trivial zu bestimmen, ob eine gesamte Datei auf die altmodische Weise fest verknüpft ist. Überprüfen Sie einfach die Anzahl st_nlink für einen bestimmten Inode.)
Das Fehlen eines "vollständigen Dateiklons" ist in der Tat ein wesentliches Merkmal aller CoW-Dateisysteme, die "kostenlose" Snapshots und / oder Deduplizierungen unterstützen, und gilt unabhängig davon, ob es sich um Btrfs-Extents, ZFS-Blöcke oder etwas anderes handelt. Aus diesem Grund kann beides wahrscheinlich eine Antwort auf Ihre Frage sein. (Es gibt mindestens drei andere CoW-Dateisysteme, die all das können oder sollen, was mir bekannt ist: nilfs2, bcachefs und xfs.)
Obwohl Sie dies nicht erwähnt haben, ist meines Wissens keine Deduplizierungstechnologie für Dateitypen geeignet. Mit anderen Worten, kein Deduplizierer kann * .jpg-Metadaten überspringen und nur die komprimierten Bilddaten für die Deduplizierung berücksichtigen. Ebenso berücksichtigt keiner von ihnen die magischen Zahlen von Dateien (zumindest, um zu bestimmen, was für die Deduplizierung zu berücksichtigen ist). Das könnte ein Killer-Feature sein - obwohl es sicherlich ständige, fortlaufende Definitionsaktualisierungen erfordert. Und könnte sehr schwer zu entwerfen sein, während Dateien gleichzeitig als abstrakte M: M-Sammlung von Extents, Blöcken usw. behandelt werden.