it-swarm.com.de

Lokal einen großen Verzeichnisbaum kopieren? cp oder rsync?

Ich muss einen großen Verzeichnisbaum kopieren, ungefähr 1,8 TB. Es ist alles lokal. Aus Gewohnheit würde ich rsync verwenden, aber ich frage mich, ob es viel Sinn macht und ob ich lieber cp verwenden sollte.

Ich mache mir Sorgen um Berechtigungen und uid/gid, da diese in der Kopie erhalten bleiben müssen (ich weiß, dass rsync dies tut). Sowie Dinge wie Symlinks.

Das Ziel ist leer, sodass ich mich nicht um die bedingte Aktualisierung einiger Dateien kümmern muss. Es ist alles lokale Festplatte, so dass ich mir keine Sorgen um SSH oder Netzwerk machen muss.

Der Grund, warum ich von rsync abgehalten werden würde, ist, dass rsync möglicherweise mehr kann, als ich brauche. rsync Prüfsummen Dateien. Ich brauche das nicht und mache mir Sorgen, dass es länger dauern könnte als cp.

Also, was denkst du, rsync oder cp?

244
Rory

Ich würde rsync verwenden, da es bedeutet, dass Sie es mit sehr geringen Kosten einfach neu starten können, wenn es aus irgendeinem Grund unterbrochen wird. Und da es sich um rsync handelt, kann es sogar teilweise durch eine große Datei neu gestartet werden. Wie andere bereits erwähnen, können Dateien leicht ausgeschlossen werden. Der einfachste Weg, die meisten Dinge zu bewahren, ist die Verwendung von -a flag - 'archive'. Also:

rsync -a source dest

Obwohl UID/GID und Symlinks von -a (sehen -lpgo), Ihre Frage impliziert, dass Sie möglicherweise eine vollständige Kopie der Dateisysteminformationen wünschen; und -a enthält keine Hardlinks, erweiterten Attribute oder ACLs (unter Linux) oder die oben genannten noch Ressourcengabeln (unter OS X.) Für eine robuste Kopie eines Dateisystems müssen Sie also Ich muss diese Flags einschließen:

rsync -aHAX source dest # Linux
rsync -aHE source dest  # OS X

Der Standard-CP wird erneut gestartet, obwohl -u flag wird "Nur kopieren, wenn die SOURCE-Datei neuer als die Zieldatei ist oder wenn die Zieldatei fehlt". Und der -a (Archiv) -Flag ist rekursiv und kopiert keine Dateien erneut, wenn Sie die Berechtigungen neu starten und beibehalten müssen. Damit:

cp -au source dest
214
Hamish Downer

Beim Kopieren in das lokale Dateisystem verwende ich normalerweise rsync mit den folgenden Optionen:

# rsync -avhW --no-compress --progress /src/ /dst/

Hier ist meine Argumentation:

-a is for archive, which preserves ownership, permissions etc.
-v is for verbose, so I can see what's happening (optional)
-h is for human-readable, so the transfer rate and file sizes are easier to read (optional)
-W is for copying whole files only, without delta-xfer algorithm which should reduce CPU load
--no-compress as there's no lack of bandwidth between local devices
--progress so I can see the progress of large files (optional)

Ich habe 17% schnellere Übertragungen mit den obigen rsync-Einstellungen über den folgenden tar-Befehl gesehen, wie in einer anderen Antwort vorgeschlagen:

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)
120
Ellis Percival

Wenn ich eine große Datenmenge kopieren muss, verwende ich normalerweise eine Kombination aus tar und rsync. Der erste Durchgang ist es zu tarieren, so etwas wie:

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

Normalerweise gibt es bei einer großen Anzahl von Dateien einige, die tar aus irgendeinem Grund nicht verarbeiten kann. Möglicherweise wird der Prozess unterbrochen, oder wenn es sich um eine Dateisystemmigration handelt, möchten Sie möglicherweise die erste Kopie vor dem eigentlichen Migrationsschritt erstellen. Auf jeden Fall mache ich nach der ersten Kopie einen rsync-Schritt, um alles zu synchronisieren:

# cd /dst; rsync -avPHSx --delete /src/ .

Beachten Sie, dass der abschließende Schrägstrich auf /src/ ist wichtig.

79
Chad Huneycutt

rsync

Hier ist der Rsync, den ich benutze. Ich bevorzuge cp für einfache Befehle, nicht diesen.

$ rsync -ahSD --ignore-errors --force --delete --stats $SRC/ $DIR/

cpio

Hier ist ein Weg, der noch sicherer ist, cpio. Es ist ungefähr so ​​schnell wie Teer, vielleicht etwas schneller.

$ cd $SRC && find . -mount -depth -print0 2>/dev/null | cpio -0admp $DEST &>/dev/null

tar

Dies ist auch gut und setzt sich bei Lesefehlern fort.

$ tar --ignore-failed-read -C $SRC -cf - . | tar --ignore-failed-read -C $DEST -xf -

Beachten Sie, dass dies alles nur für lokale Kopien ist.

14
AskApache

Was auch immer Sie bevorzugen. Vergiss nur nicht das -a wechseln, wenn Sie sich für cp entscheiden.

Wenn Sie wirklich eine Antwort brauchen: Ich würde rsync verwenden, weil es viel flexibler ist. Müssen Sie das Programm herunterfahren, bevor der Kopiervorgang abgeschlossen ist? Drücken Sie einfach Strg-C und fahren Sie fort, sobald Sie wieder da sind. Müssen Sie einige Dateien ausschließen? Benutz einfach --exclude-from. Müssen Sie Eigentümer oder Berechtigungen ändern? rsync erledigt das für Sie.

7
innaM

Der Befehl rsync berechnet immer Prüfsummen für jedes übertragene Byte.

Die Befehlszeilenoption --checksum bezieht sich nur darauf, ob Prüfsummen von Dateien verwendet werden, um zu bestimmen, welche Dateien übertragen werden sollen oder nicht, dh:

-c, --checksum Überspringen basierend auf Prüfsumme, nicht Mod-Zeit & Größe "

Die Manpage sagt auch folgendes:

Beachten Sie, dass rsync immer überprüft, ob jede übertragene Datei auf der Empfangsseite korrekt rekonstruiert wurde, indem die Prüfsumme für die gesamte Datei überprüft wird. Die automatische Überprüfung nach der Übertragung hat jedoch nichts mit der Option dieser Option vor der Übertragung zu tun aktualisiert werden?" prüfen.

Also berechnet rsync auch immer eine Prüfsumme der gesamten Datei auf der empfangenden Seite, selbst wenn -c/ --checksum Option ist "aus".

7
John

rsync -aPhW --protocol=28 beschleunigt diese großen Kopien mit RSYNC. Ich gehe immer rsync, weil der Gedanke, mitten in 90GiB zu sein und es zu brechen, mich von CP abschreckt

6
oneguynick

Dieser Thread war sehr nützlich und da es so viele Optionen gab, um das Ergebnis zu erzielen, habe ich beschlossen, einige davon zu vergleichen. Ich glaube, meine Ergebnisse können für andere hilfreich sein, um ein Gefühl dafür zu haben, was schneller funktioniert hat.

Um 532 GB Daten zu verschieben, die auf 1.753.200 Dateien verteilt sind, hatten wir diese Zeiten:

  • rsync dauerte 232 Minuten
  • tar dauerte 206 Minuten
  • cpio dauerte 225 Minuten
  • rsync + parallel dauerte 209 Minuten

In meinem Fall habe ich lieber rsync + parallel. Ich hoffe, diese Informationen helfen mehr Menschen, sich für diese Alternativen zu entscheiden.

Der vollständige Benchmark wird veröffentlicht hier

6
arjones

rsync ist großartig, hat aber Probleme mit wirklich großen Verzeichnisbäumen, da es die Bäume im Speicher speichert. Ich habe nur gesucht, ob sie dieses Problem beheben würden, als ich diesen Thread gefunden habe.

Ich fand auch:

http://matthew.mceachen.us/geek/gigasync/

Sie können den Baum auch manuell aufteilen und mehrere Rsyncs ausführen.

5
n3bulous

Wenn ich eine lokale Verzeichniskopie lokal mache, ist "cp -van src dest" meiner Erfahrung nach 20% schneller als rsync. Was die Neustartfähigkeit betrifft, ist dies das, was "-n" tut. Sie müssen nur die teilweise kopierte Datei rm. Nicht schmerzhaft, es sei denn, es ist eine ISO oder eine solche.

3
Ron

ARJ IS SO ALTE SCHULE !! Ich bezweifle wirklich, dass ARJ und/oder rsync Leistung bringen werden.

Auf jeden Fall benutze ich immer cpio:

find . -print | cpio -pdm /target/folder

Dies ist fast schnell als CP, definitiv schneller als Teer und ohne Rohrleitungen.

2

Sie möchten auf jeden Fall rclone ausprobieren. Dieses Ding ist schnell verrückt:

Sudo rclone sync /usr /home/fred/temp -P -L --transfers 64

Transferred:       17.929G / 17.929 GBytes, 100%, 165.692 MBytes/s, ETA 0s
Errors:                75 (retrying may help)
Checks:            691078 / 691078, 100%
Transferred:       345539 / 345539, 100%
Elapsed time:     1m50.8s

Dies ist eine lokale Kopie von und zu einer LITEONIT LCS-256 (256 GB) SSD.

Du kannst hinzufügen --ignore-checksum beim ersten Durchlauf, um es noch schneller zu machen.

1
Frédéric N.

Beides wird gut funktionieren.

0
pauska

Es gibt einige Beschleunigungen, die auf rsync angewendet werden können:

Vermeiden

  • -z/--compress: Durch die Komprimierung wird nur die CPU geladen, da die Übertragung nicht über ein Netzwerk, sondern über RAM erfolgt.
  • --append-verify: Eine unterbrochene Übertragung fortsetzen. Das klingt nach einer guten Idee, hat aber den gefährlichen Fehlerfall: Jede Zieldatei, die dieselbe Größe (oder größer) als die Quelle hat, wird ignoriert. Außerdem wird am Ende die gesamte Datei überprüft, was bedeutet, dass keine signifikante Beschleunigung über --no-whole-file beim Hinzufügen eines gefährlichen Fehlerfalls.

Verwenden

  • -S/--sparse: Sequenzen von Nullen in spärliche Blöcke umwandeln
  • --partial oder -P welches ist --partial --progress: Speichern Sie alle teilweise übertragenen Dateien für eine spätere Wiederaufnahme. Hinweis: Dateien haben keinen temporären Namen. Stellen Sie daher sicher, dass nichts anderes das Ziel erwartet, bis die gesamte Kopie abgeschlossen ist.
  • --no-whole-file damit alles, was erneut gesendet werden muss, die Deltaübertragung verwendet. Das Lesen der Hälfte einer teilweise übertragenen Datei ist oft viel schneller als das erneute Schreiben.
  • --inplace um das Kopieren von Dateien zu vermeiden (aber nur, wenn das Ziel erst gelesen wird, wenn die gesamte Übertragung abgeschlossen ist)
0
Tom Hale

tar würde auch die Arbeit erledigen, wird aber nicht wie rsync unterbrochen.

0
pgs

Was ist, wenn Sie ARJ verwenden?

arj a -jm -m1 -r -je filepack /source

wo -jm -m1 sind Komprimierungsstufen und -je macht es zu einer ausführbaren Datei. Jetzt haben Sie eine gekapselte Bash von Dateien.

Dann zur Extraktion auf die Zielkarte

filepack -y  

wo die Quellkarte erstellt wird (wo -y ist immer akzeptieren, überschreiben, überspringen usw.)

Man kann dann das Dateipaket in den Zielbereich scp ftp und es ausführen, wenn dies möglich ist.

0
herauthon