Warum führt "cp -R --reflink = always" eine Standardkopie auf einem btrfs-Dateisystem durch?

12

Btrfs unterstützen Copy-On-Write. Ich habe versucht, mit dieser Funktion ein Verzeichnis zu klonen:

cp -R --reflink=always foo_directory foo_directory.mirror

Ich habe erwartet, dass der Befehl fast sofort beendet wird (wie a btrfs subvolume snapshot), aber der cpBefehl scheint eine langsame Standardkopie auszuführen.

Laut der Manpage würde ich erwarten --reflink=always, Copy-On-Write durchzusetzen:

Wenn --reflink [= immer] angegeben ist, führen Sie eine einfache Kopie durch, bei der die Datenblöcke nur kopiert werden, wenn sie geändert werden. Wenn dies nicht möglich ist, schlägt die Kopie fehl oder wenn --reflink = auto angegeben ist, greifen Sie auf eine Standardkopie zurück.

Fragen:

  • Weißt du warum --reflink=alwaysnicht funktioniert?
  • Welche Optionen (oder andere Befehle) sollte ich stattdessen verwenden?
Philipp Claßen
quelle

Antworten:

20

cp --reflink=alwaysfunktioniert mit ziemlicher Sicherheit richtig. Wenn dies nicht der Fall wäre, würden Sie einen Fehler erhalten. Das ist der Unterschied zwischen --reflink=alwaysund --reflink=auto. Der Fehler würde folgendermaßen aussehen:

# Filesystem that does not support the feature at all
cp: failed to clone `xx' from `yy': Inappropriate ioctl for device

# Filesystem that does support it, but copy across filesystems
cp: failed to clone `xx' from `yy': Invalid cross-device link

Kopieren Sie eine Verzeichnisstruktur mit vielen kleinen Dateien? In diesem Fall muss cpimmer noch jedes Verzeichnis erstellt und jede Datei geöffnet und geschlossen werden, sodass es im Gegensatz dazu immer noch einige Zeit dauert btrfs subvolume snapshot. Dies erklärt höchstwahrscheinlich die Zeit, die zur Durchführung der Operation benötigt wird.

Celada
quelle
3
Ja, es enthält eine große Anzahl von Dateien, die meisten davon kleine Textdateien. Ich wusste nicht, dass cp immer noch jede Datei verarbeiten muss. Danke, das war der Teil, den ich nicht verstanden habe. Ich denke, in meinem Anwendungsfall ist es besser, einen beschreibbaren Schnappschuss zu erstellen.
Philipp Claßen
1
Ja, wenn Sie einen Schnappschuss erstellen können, dann machen Sie es. cp --reflink=alwayskann immer noch nützlich sein, wenn das, was Sie klonen möchten, nicht die Wurzel eines Subvolumes ist, da es btrfs subvolume snapshotnur mit Subvolumes arbeitet, nicht mit Teilen von Subvolumes.
Celada