schnellere Alternative zu cp -a

9

Für eine einfache Übertragung von / home auf eine andere Festplatte verwende ich das cp -a, was mir extrem langsam erscheint. Möchten Sie einen effizienteren Weg kennen, um die Aufgabe zu erledigen. Ich habe / home als logisches Volume gemountet, aber die Zielfestplatte ist kein LVM-System

Yurij73
quelle
4
Wenn cpes langsam ist, wären auch andere Methoden langsam. Es sei denn, es ist nicht dateiorientiertes Kopieren
Gänseblümchen
Versuchen Sie, Ihren Engpass zu diagnostizieren, der von Ihrem speziellen Setup abhängt. Möglicherweise möchten Sie die noatimeMount-Option ausprobieren , um unnötige Schreibvorgänge zu reduzieren, insbesondere in das Quelldateisystem.
Elias Torres Arroyo

Antworten:

16

Versuchen Sie tar, pax, cpio, mit etwas Pufferung.

(cd /home && bsdtar cf - .) |
  pv -trab -B 500M |
  (cd /dest && bsdtar xpSf -)

Ich schlage bsdtarstatt tarweil zumindest bei einigen Linux-Distributionen vortar GNU-Tar zu verwenden, das im Gegensatz zu bsdtar(von libarchive) nicht die Beibehaltung erweiterter Attribute oder ACLs oder Linux-Attribute behandelt.

pvpuffert bis zu 500 MB Daten, um Schwankungen der Lese- und Schreibgeschwindigkeit auf den beiden Dateisystemen besser Rechnung zu tragen (obwohl in Wirklichkeit wahrscheinlich eine Festplatte langsamer ist als die andere und der Rückschreibemechanismus des Betriebssystems diese Pufferung als gut so wird es wahrscheinlich keinen großen Unterschied machen). Ältere Versionen von werden pvnicht unterstützt-a (für Durchschnittsgeschwindigkeitsberichte), können Sie pv -B 200Mdort alleine verwenden.

In jedem Fall haben die werden nicht die Begrenzung der cp, dass das tut liest und die Schreib nacheinander ausgeführt werden. Hier tararbeiten zwei gleichzeitig, sodass einer einen FS lesen kann, während der andere darauf wartet, dass der andere FS mit dem Schreiben fertig ist.

Für ext4 und wenn Sie auf eine Partition kopieren, die mindestens so groß wie die Quelle ist, sehen Sie auch clone2fs, wie diese funktioniertntfsclone : Kopieren Sie die zugewiesenen Blöcke nur und nacheinander, sodass der Rotationsspeicher wahrscheinlich am effizientesten ist.

Partclone verallgemeinert dies auf einige verschiedene Dateisysteme.

Nun einige Dinge, die beim Klonen eines Dateisystems berücksichtigt werden müssen.

Beim Klonen werden alle Verzeichnisse, Dateien und deren Inhalte kopiert ... und alles andere. Jetzt variiert alles andere von Dateisystem zu Dateisystem. Auch wenn wir nur die gemeinsamen Merkmale traditioneller Unix-Dateisysteme berücksichtigen, müssen wir Folgendes berücksichtigen:

  • Links: Symbolische Links und Hardlinks. Manchmal müssen wir uns überlegen, was mit absoluten Symlinks oder Symlinks zu tun ist, die auf das zu klonende Dateisystem / Verzeichnis verweisen
  • Letzte Änderungs-, Zugriffs- und Änderungszeiten: Nur die ersten beiden können mit der Dateisystem-API (cp, tar, rsync ...) kopiert werden.
  • Spärlichkeit: Sie haben diese 2-TB-Sparse-Datei, bei der es sich um ein VM-Disk-Image handelt, das nur 3 GB Speicherplatz benötigt. Der Rest ist spärlich. Eine naive Kopie würde das Ziellaufwerk füllen.

Wenn Sie dann die ext4meisten Linux-Dateisysteme in Betracht ziehen, müssen Sie Folgendes berücksichtigen:

  • ACLs und andere erweiterte Attribute (wie die für SELinux)
  • Linux-Attribute wie unveränderliche Flags oder Nur-Anhängen-Flags

Nicht alle Tools unterstützen alle diejenigen, oder wenn sie es tun, müssen Sie es explizit wie die ermöglichen --sparse, --acls... Optionen rsync, tar... Und wenn sie auf einem anderen Dateisystem kopieren, müssen Sie den Fall betrachten , wo sie es nicht tun unterstützen den gleichen Funktionsumfang.

Möglicherweise müssen Sie auch Attribute des Dateisystems selbst berücksichtigen, z. B. die UUID, den reservierten Speicherplatz für root, die fsck-Häufigkeit, das Journalverhalten, das Format der Verzeichnisse ...

Dann gibt es komplexere Dateisysteme, in denen Sie die Daten nicht wirklich kopieren können, indem Sie Dateien kopieren. Betrachten Sie zum Beispiel zfsoderbtrfs wenn Sie sie Schnappschüsse von Subvolumes und abzweigen nehmen können ... Diejenigen , würden ihre eigenen dedizierten Werkzeuge, um Daten zu kopieren.

Die Byte-zu-Byte-Kopie des Blockgeräts (oder zumindest der zugewiesenen Blöcke, wenn möglich) ist häufig die sicherste, wenn Sie sicherstellen möchten, dass Sie alles kopieren. Achten Sie jedoch auf das UUID-Konfliktproblem. Dies bedeutet, dass Sie auf etwas Größeres kopieren (obwohl Sie die Größe einer Snapshot-Kopie der Quelle vor dem Kopieren ändern können).

Stéphane Chazelas
quelle
1
GNU tar hat die --aclsMöglichkeit, die ACLs im Archiv zu speichern. Und ich wäre überrascht, wenn ein außerirdisches ( bsdtarbesseres ) Werkzeug besser damit
umgehen würde
@vonbrand. Ihr Teer muss dafür gepatcht worden sein (ich denke, RedHat hat einen Patch für GNU-Teer für ACLs), da die neueste Version von GNU-Teer eine solche Option nicht unterstützt. Es gibt eine Reihe von Implementierungen tarfür Linux ( star, bsdtar, tar), ich bin mir nicht bewusst , dass GNU tar ist besser als die andere. Die Wahl für GNU-Tools ist im Allgemeinen eher politischer als technischer Natur (siehe zum Beispiel bash).
Stéphane Chazelas
1
Die Verwendung von GNU-Tools mag eine politische Wahl sein, ist aber dennoch die Standardwahl. Und da sie viel beliebter sind als die Alternativen, steckt auch mehr Entwickler (und andere) Arbeitskräfte dahinter.
vonbrand
danke, das nächste mal werde ich pv und tar verwenden anstatt cp
Yurij73
@ StéphaneChazelas Derzeit GNU tar funktioniert Unterstützung--acls
Ploni
4

Ich empfehle rsync zum Beispiel:

rsync -av --progress --stats dest orig

Oder um mit Komprimierung zu übertragen:

rsync -avz --progress --stats dest orig
Victor Aurélio
quelle
rsyncist in der Regel viel langsamer als cpodertar|tar
Stéphane Chazelas
Danke für diese Information :) aber ich habe diese beiden nie verglichen ...
Victor Aurélio
Ich würde diesem Artikel nicht zu sehr vertrauen. Ich benutze rsync ziemlich häufig und kopiere regelmäßig mit 130-170 MB / s.
Laebshade
8
rsyncAm effizientesten ist es, wenn Sie die Quelldaten bereits teilweise auf dem Zieldatenträger verfügbar haben, da nur fehlende / geänderte Daten übertragen werden. Ich würde es nicht für eine schnelle "erste Kopie" verwenden.
Totor