Implementiert ein Dateisystem den Copy on Write-Mechanismus für CP?


16

Wir haben gesehen, dass das Betriebssystem die Optimierung beim Kopieren beim Schreiben durchführt, wenn ein Prozess gegabelt wurde. Grund dafür ist, dass die Gabelung in den meisten Fällen von exec ausgeführt wird, sodass die Kosten für die Zuweisung von Seiten und das unnötige Kopieren der Daten aus dem Adressraum des Anrufers vermieden werden sollen.

Dies geschieht auch, wenn CP unter Linux mit ext4- oder xfs-Dateisystemen (Journaling) ausgeführt wird. Wenn es nicht passiert, warum dann nicht?


Hoffe, jemand wird diese interessante Frage beantworten
Karim Manaouil

Ich glaube jedoch nicht, weil zum Beispiel das Coyen einer großen Datei erheblich länger dauern würde (Kopieren von Daten in neue Blöcke). Wenn es in solchen Dateisystemen eine COW gäbe (zumindest ext3 / ext4), würden Sie die Zeitverzögerung nicht bemerken (in einem solchen Fall könnten Sie nur den Inode ohne Zeiger auf Datenblöcke replizieren und ein COW-Flag markieren).
Karim Manaouil

Copy-on-Write ist auf ZFS implementiert und hat in der Tat sehr billige Dateisystem- / Volume-Klone. Ich glaube, ext4 / xfs haben ein zu primitives Festplattenformat, um dies zu unterstützen
myaut

Antworten:


7

Das zu suchende Schlüsselwort lautet reflink. Es wurde kürzlich in XFS implementiert.

BEARBEITEN: Die XFS-Implementierung wurde ursprünglich als EXPERIMENTELL markiert. Diese Warnung wurde in der Kernel-Version 4.16 entfernt, einige Monate nachdem ich oben geschrieben hatte :-).


11

Aus der cp Manpage :

Wenn --reflink [= always] angegeben ist, führen Sie eine Lightweight-Kopie durch, bei der die Datenblöcke nur beim Ändern kopiert werden. Ist dies nicht möglich, schlägt der Kopiervorgang fehl oder wird --reflink = auto angegeben, wird auf eine Standardkopie zurückgegriffen.

Dies funktioniert auf Dateisystemen, die Copy-on-Write ( reflink ) unterstützen, im Moment hauptsächlich BTRFS. Die XFS-Reflink-Implementierung befindet sich in der Entwicklung [1] [2] .


1
Einige Netzwerkdateisysteme wie NFS, CIFS, OCFS2 leiten diese möglicherweise auch an den Server weiter.
Stéphane Chazelas

2

Linux hat einen Systemaufruf, mit dem Userspace-Prozesse den Kernel anweisen können, beim Schreiben von Kopien von Dateien Kopien anzufertigen. Mit FICLONERANGE und FICLONE, die als Optionen für ioctl verwendet werden, können Kopien von Dateien und Bereichen innerhalb von Dateien erstellt werden.

Dies wird von cp --reflink verwendet, um die Kopien zu erstellen, sofern das Dateisystem dies unterstützt.


1

Wenn Sie keinen Systemaufruf für cp(oder zumindest zum Kopieren eines Blocks) einführen , kann das Betriebssystem nur schwer feststellen, dass die Daten, die das cpProgramm schreiben wird , mit den Daten übereinstimmen, die es gerade aus einem anderen Block gelesen hat. Darüber hinaus wäre ein zusätzlicher Aufwand erforderlich, um das Szenario "Mehrere Dateien teilen sich die gleichen Blöcke" zu verwalten. Große ähnliche Dateien, die sich nur in wenigen Blöcken unterscheiden, kommen selten vor. Es ist also insgesamt billiger, nur diese Blöcke zu kopieren und dann diesen Verwaltungsaufwand allen Dateien hinzuzufügen .

Wenn Sie nun Dateien (viele von ihnen) durch Hinzufügen eines weiteren Klons / Snapshots des Dateisystems in BTRFS "kopieren", sieht die Situation anders aus: Jetzt haben Sie alle Dateien im Dateisystem "kopiert" und alle Änderungen an Sie werden beim Schreiben kopiert. Dies existiert, aber nicht in ext4.

"Journalling" ist ein völlig unabhängiges Konzept, es sind die Verwaltungsstrukturen für die Dateien, die zählen.


Große Dateien, von denen eine eine binäre Kopie der anderen ist, unterscheiden sich extrem selten in einem einzelnen Bit, und was passiert, ist auf einen Fehler zurückzuführen.
Bitifet

Ein Systemaufruf zum Kopieren wurde eingeführt (siehe meine Antwort).
Q the Platypus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.