APFS: Verzeichnisse im Terminal clonen

Johanna K

Aktives Mitglied
Thread Starter
Dabei seit
28.10.2009
Beiträge
1.148
Reaktionspunkte
805
Bei der Einführung des neuen APFS für den Mac wurde mit viel Getöse herausgestellt, dass Dateien und Verzeichnisse beim Kopieren nicht wirklich kopiert werden, sondern nur ein neuer Verzeichniseintrag erstellt werde. Erst dann wenn in der Kopie wirklich Änderungen vorgenommen würden, würden neue Blöcke angefordert und unterschiedliche Blöcke für Kopie und Original verwendet. Damit würden Kopien ganzer Verzeichnisse blitzschnell gehen. (Copy on Write)

Nun möchte ich dieses Feature auch mal nutzen.

Wenn ich aber mit cp -rp ein ganzes Verzeichnis kopiere, wird dieses Feature offensichtlich nicht benutzt (es dauert recht lange, da viele Daten und Unterverzeichnisse), sondern es wird direkt eine Kopie unter Verwendung neuer Blöcke auf der SSD erstellt.

Beim Duplizieren im Finder ist das ebenfalls der Fall.

Wie also kann man mit cp oder einem anderen Kommando Verzeichnisse clonen mit Copy-on-Write?
 
Und auch hier wieder mein Lieblingshinweis: man cp :D
 
meiner: man man.
 
  • Gefällt mir
Reaktionen: mj
cp -c kopiert nur einzelne Dateien. Verzeichnisse können damit nicht kopiert werden. Das hilft deswegen schon mal nicht weiter.
Außerdem ist cp -c kein APFS-Feature.

Und auch hier wieder mein Lieblingshinweis: man cp :D
Die Manpage habe ich schon längst gelesen. Sie äußert sich nicht zu APFS.
Das Einzige, was danach aussieht, ist die Option -c, aber die ist wie gesagt nicht für Verzeichnisse und hilft deshalb nicht weiter.

sollte eigentlich mit option-drag auch im finder funktionieren.
Was meinst du mit Option-Drag?

Wie? Im Menü Duplizieren anwählen tut es nicht, Kopieren ebensowenig. Beide kopieren Dateiweise statt mit dem APFS-Feature sofort eine Kopie des ganzen Astes anzulegen.
 
Die Manpage habe ich schon längst gelesen. Sie äußert sich nicht zu APFS.
Die Manpages sind halt (fast immer?) die originalen von UNIX. Auf Apple-Spezifika wird da nicht eingegangen. Apple bietet aber auf seinen Supportseiten ebenfalls Informationen an, die den Manpages entsprechen - da könnte (!) man vielleicht bereits Anpassungen an APFS finden.
 
Die Manpages sind halt (fast immer?) die originalen von UNIX. Auf Apple-Spezifika wird da nicht eingegangen.
Und warum weist man dann darauf hin, wenn sie hier doch nichts nützen? (Betrifft nicht dich, sondern den dadurch überflüssigen Beitrag von "mj".)
 
cp -c kopiert nur einzelne Dateien. Verzeichnisse können damit nicht kopiert werden. Das hilft deswegen schon mal nicht weiter.
Außerdem ist cp -c kein APFS-Feature.

Die Manpage habe ich schon längst gelesen. Sie äußert sich nicht zu APFS.
Das Einzige, was danach aussieht, ist die Option -c, aber die ist wie gesagt nicht für Verzeichnisse und hilft deshalb nicht weiter.

und -R geht mit -c nicht?
hast du die man page auch richtig gelesen?
-c copy files using clonefile(2)

man clonefile führt uns ja zu:
NAME
clonefile -- create copy on write clones of files

man muss bei man pages halt mal bis zum ende scrollen:
HISTORY
The clonefile(), clonefileat() and fclonefileat() function calls appeared
in OS X version 10.12
 
Du bist jetzt aber nicht in der Man-Page zum cp-Befehl.
 
Code:
cp -crp ./Ordner ./Zielordner/
funktioniert hier ohne Probleme (einen 10GB Ordner in wenigen Sekunden kopiert und der Finder zeigt keine 10GB weniger an). Wichtig ist den Backslash am Ende des Quellordners wegzulassen so dass das ganze Verzeichnis kopiert wird.

Option-Drag = Ordner im Finder auswählen und dann mit Option (ALT) + Klick + Ziehen kopieren.
 
  • Gefällt mir
Reaktionen: dg2rbf
nein, aber man cp verweist doch auch auf clonefile.
die man page wird ja auch nicht explizit ein dateisystem nennen, wenn clonefile allgemein copy-on-write nutzt.
 
cp -crp ./Ordner ./Zielordner/
Das geht schon in die richtige Richtung, und Dateien werden deutlich schneller kopiert.
Allerdings werden auch hier die Dateien einzeln kopiert, zwar wohl pro Datei mit Copy-on-Write, aber der Verzeichnisbaum wird weiterhin echt kopiert (also nicht erst "on write"). Bei Verzeichnissen mit sehr vielen Unterverzeichnissen und Dateien (z. B. Eclipse Workspace) dauert das immer noch einige Zeit.
Gleiches gilt für die von oneOeight genannte Option -R (als Großbuchstabe).

Das gewünschte Kopieren ganzer Verzeichnisbäume als Copy-on-Write geht damit also noch nicht.

Option-Drag = Ordner im Finder auswählen und dann mit Option (ALT) + Klick + Ziehen kopieren.
OK, das war gemeint. Aber auch hier wird dateiweise kopiert - also keine Verzeichnisbäume.
 
aber der Verzeichnisbaum wird weiterhin echt kopiert (also nicht erst "on write"). Bei Verzeichnissen mit sehr vielen Unterverzeichnissen und Dateien (z. B. Eclipse Workspace) dauert das immer noch einige Zeit.
Keine Ahnung was genau du erwartest. Natürlich muss selbst bei dem Clonen etliches an Daten geschrieben werden. Und natürlich für jede Datei einzeln. Oder was meinst du wie MacOS überhaupt erkennt dass da was verändert wurde?

Würde sogar vermuten dass der Verwaltungsaufwand größer ist als bei normalem Kopieren.
Gleiches gilt für die von oneOeight genannte Option -R (als Großbuchstabe).
cp -r und cp -R sind unter BSD die gleichen Befehle, laut man cp auf dem Mac wird cp -r gar nicht aufgeführt, würde daher in Zukunft nur -R nutzen.
Das gewünschte Kopieren ganzer Verzeichnisbäume als Copy-on-Write geht damit also noch nicht.
Ich habe den Eindruck dass du da falsche Erwartungen hast. Persönlich würde ich erwarten dass das Kopieren via "cp -c" eher länger dauert als das Kopieren einer entsprechenden Anzahl an Dateien der Größe 1 Byte.
 
Keine Ahnung was genau du erwartest. Natürlich muss selbst bei dem Clonen etliches an Daten geschrieben werden. Und natürlich für jede Datei einzeln. Oder was meinst du wie MacOS überhaupt erkennt dass da was verändert wurde?
Ich erwarte, dass (im Prinzip) nur ein Dateieintrag für die Kopie des Verzeichnisses angelegt werden muss. Das soll doch eine neue Fähigkeit des APFS sein. Wenn irgendwo geschrieben wird, sollte APFS dies erkennen und automatisch neue alternative Blöcke verwenden.

Apple selbst nutzt dieses Feature auch, z. B. für TimeMachine Backups. Wenn ein neues Backup angelegt wird, wird erst ein Snapshot angelegt (d. h. das ganze Dateisystem mit Copy-on-Write kopiert), was in Sekundenbruchteilen geschieht (also ein Kopie für das Root-Verzeichnis, und nicht Datei-weise). TimeMachine sichert jetzt den Snapshot, und wenn jetzt während des Backups Dateien geändert werden, bleibt das Backup konsistent (was vorher nicht der Fall war).
Auch wird jede Stunde ein Snapshot angelegt (ohne dass man es direkt merkt, weil es sehr schnell geht), aus dem man mit TimeMachine alte Stände zurück bekommt.

Dieses Feature möchte ich jetzt auch manuell für einzelne Verzeichnisse nutzen können.
 
Ich erwarte, dass (im Prinzip) nur ein Dateieintrag für die Kopie des Verzeichnisses angelegt werden muss. Das soll doch eine neue Fähigkeit des APFS sein. Wenn irgendwo geschrieben wird, sollte APFS dies erkennen und automatisch neue alternative Blöcke verwenden.

Apple selbst nutzt dieses Feature auch, z. B. für TimeMachine Backups. Wenn ein neues Backup angelegt wird, wird erst ein Snapshot angelegt (d. h. das ganze Dateisystem mit Copy-on-Write kopiert), was in Sekundenbruchteilen geschieht (also ein Kopie für das Root-Verzeichnis, und nicht Datei-weise). TimeMachine sichert jetzt den Snapshot, und wenn jetzt während des Backups Dateien geändert werden, bleibt das Backup konsistent (was vorher nicht der Fall war).
Du bringst hier einiges Durcheinander.

Time Machine verwendet hard links für Dateien die nicht verändert wurden ("man ln" falls du mehr dazu lesen willst) und hat mit dem was du erwartest gar nichts zu tun. So wird ein Snapshot erstellt, alle unveränderten Dateien werden durch hard links eingebunden und einzig die veränderten Dateien werden ins TM Backup kopiert. Das heißt jeder einzelne Snapshot hat für nicht geänderte Dateien einen eigenen hard link auf den gleichen Inhalt auf dem Laufwerk. Wird dagegen eine Datei auch nur minimal geändert, so wird die ganze Datei dem Backup im aktuellen Snapshot hinzugefügt.

Das neue APFS Feature dagegen legt die Datei neu an, kopiert aber noch nicht den Inhalt sondern verweist sozusagen auf die Blöcke der alten Datei. In dem Moment in dem du die neue Datei bearbeitest und abspeicherst wird erst wirklich kopiert/geschrieben (Copy on Write) indem die Änderungen geschrieben werden, auf unveränderte Datenblöcke wird aber weiterhin verwiesen.
 
cp -c kopiert nur einzelne Dateien.
ja, das ist eben die option für's [c]lonen. oben hast du ja selbst schon "-rp" verwendet.
zu "-r", siehe unten.
Außerdem ist cp -c kein APFS-Feature.
es ist ein clone feature. wenn das vom file system unterstützt wird, wird geklont, ansonsten kopiert. nicht mehr und nicht weniger.
Die Manpages sind halt (fast immer?) die originalen von UNIX. Auf Apple-Spezifika wird da nicht eingegangen. Apple bietet aber auf seinen Supportseiten ebenfalls Informationen an, die den Manpages entsprechen - da könnte (!) man vielleicht bereits Anpassungen an APFS finden.
Und warum weist man dann darauf hin, wenn sie hier doch nichts nützen? (Betrifft nicht dich, sondern den dadurch überflüssigen Beitrag von "mj".)
völliger unsinn. apples man pages werden natürlich angepasst. siehe ja z.b. option "-c".
und apple hat übrigens seine web-man-pages vor geraumer zeit gelöscht.

Ich erwarte, dass (im Prinzip) nur ein Dateieintrag für die Kopie des Verzeichnisses angelegt werden muss. Das soll doch eine neue Fähigkeit des APFS sein.
das kannst du eben bis dato nicht. weder im finder mit option-drag, noch im terminal mit cp -c. ich wüsste auch nicht, dass apple das angekündigt hätte.

laut man cp auf dem Mac wird cp -r gar nicht aufgeführt, würde daher in Zukunft nur -R nutzen.
doch, bitte man pages immer komplett lesen.
»COMPATIBILITY (10.11)
Historic versions of the cp utility had a -r option. This implementation supports that option; however, its use is strongly discouraged, as it does not correctly copy special files, symbolic links, or fifo's.«
 
Zuletzt bearbeitet:
doch, bitte man pages immer komplett lesen.
»COMPATIBILITY (10.11)
Historic versions of the cp utility had a -r option. This implementation supports that option; however, its use is strongly discouraged, as it does not correctly copy special files, symbolic links, or fifo's.«
Ich hatte es ganz durchgelesen. ;) Als offizielle Option wird es nicht angeführt sondern es wird lediglich erwähnt dass es aus historischen Gründen implementiert wurde man aber von der Nutzung abrät. Da mein Beitrag ohnehin länger war hatte ich da etwas kurz/unpräzise formuliert.
 
Zurück
Oben Unten