====== Schnelles kopieren ====== Aus **Gentoo Linux Wiki**.\\ Der Inhalt stammt ursprünglich von [[http://de.gentoo-wiki.com/Schnelles_kopieren]]. Da die Datenbank des Gentoo Linux Wikis im Oktober 2009 verloren gegangen war (Meldung von dem Hauptadmin "Mikevalstar" vom 27.10.2009 auf [[http://de.gentoo-wiki.com/wiki/Hauptseite]], mehr dazu unter [[http://gentoo-wiki.com/outage-10-08.html]]), kann ich die ursprüngliche Seite nicht mehr verlinken. Durch Zufall habe ich aber eine lokale Kopie davon. Hier ist sie (wegen des anderen Wikis leicht umformatiert): ===== Der Normale Weg ===== Um Dateien **rekursiv** von quelle1/ und quelle2/ nach ziel/ zu kopieren, benutzt man folgende Anweisung: cp -Rv quelle1/ quelle2/ ziel/ ===== Der "piped way" ===== **cp** kopiert Zeichen für Zeichen. Mit den Kernel-**Pipes** können Daten Block für Block kopiert werden. **tar** konvertiert Verzeichnisse und Dateien **rekursiv** in einen einzigen Datenstrom (**stream**). An einem Ende der Pipe werden Dateien und Verzeichnisse in einen Stream gepackt und am anderen entpackt. # Kopieren mit tar: tar -c quelle1/ quelle2/ | tar -C ziel/ -xv Das ist nicht unbedingt schneller aber flexibler. Das geht natürlich auch über ein Script: # tcp (tar copy): #!/bin/bash tar -c $1 | tar -C $2 -xv Man sollte beachten, dass ext2, ext3 und die meisten modernen Linux-Dateisysteme sog. **sparse files** besitzen. Diese Funktion wird benutzt, um große Dateien, deren Inhalt aus vielen Nullen besteht auf effiziente Weise zu speichern. Im Normalfall ist das nicht von Interesse, aber manche Programme nutzen die Funktion ausgiebig (z.B. net-p2p/mldonkey). Man sollte vorsichtig sein, wenn man solche Dateien mit dieser Methode kopiert, weil dies den verfügbaren Speicherplatz sprengen könnte. Während das Hilfsmittel cp 'sparse files' automatisch erkennt, tut tar dies nicht. 'Sparse files' aus dem Quellverzeichnis werden im Quellverzeichnis vollständig dargestellt, solange nicht das Flag **-S** auf der linken Seite der Pipe gesetzt wird. ===== Der Netzwerk-"Way over SSH" ===== Dateien werden gestreamt durch die Pipe an **ssh** geschickt, welches eine Verbindung aufbaut und dann entfernt einen Befehl ausführt der die Daten verarbeitet, in diesem Fall den Stream entpackt. # Lokal zu entfernt: tar cv Dateiliste | ssh -C entfernter.rechner.de "tar x -C /home/user/Zielpfad" # Lokal zu entfernt, mit schnellerer Verschlüsselung: tar cv Dateiliste | ssh -C -c blowfish entfernter.rechner.de "tar x -C /home/user/Zielpfad" # Entfernt zu lokal: ssh -C entfernter.rechner.de "tar c -C Quellverzeichnis" |tar x -C Zielverzeichnis Der ssh-Parameter **-C** ist schaltet dabei die **Kompression** des Datenstroms an und ist nicht in jedem Fall sinnvoll. Zum einfachen kopieren von Files über SSH nutzt man **scp**: # Entfernt zu lokal: scp -C entfernter_rechner:pfad/zur/quelldatei . # Lokal zu entfernt: scp -C lokal1 lokal2 ... entfernter_rechner:pfad/zum/ziel/ Auch hier ist der Komprimierungsparameter **-C** wieder optional. ===== Der Netzwerk-"Way with netcat" ===== Datentransfer mit **Netcat** verursacht nur minimale CPU-Auslastungen gegenüber ssh. Das liegt daran, dass die Daten nicht verschlüsselt werden. Es findet auch **keine Authentifizierung** statt. Es wird einfach nur ein Port geöffnet und auf eine Verbindung gewartet. **Nachteile**:\\ - man muss am Quell- und Zielrechner einen Befehl eingeben - die Daten werden unverschlüsselt übertragen - auf der Firewall des Zielrechners muss ein Port geöffnet und hinterher wieder geschlossen werden Beispiel: - Öffnet den Port 2342 (-p 2342) und wartet (-l). - Die ankommenden Daten werden dann tar über eine Pipe übergeben(tar -C /ziel/verz -xz). # Ziel: user@zielrechner# nc -l -p 2342 | tar -C /ziel/verz –xz - Stellt die Daten mit tar zu einem Stream zusammen (tar -cz /quelle/verz). - Verbindet sich mit zielrechner (192.168.0.2) auf Port 2342. # Quelle: user@quellrechner# tar -cz /quelle/verz | nc 192.168.0.2 2342 Um die **CPU-Last** weiter zu reduzieren, kann **lzop** anstelle der tar-Option **z** verwendet werden. lzop komprimiert wesentlich schneller aber weniger effizient: Zielrechner: nc -l -p 2342 | lzop -d | tar -C /ziel/verz -x Quellrechner: tar -c /quelle/verz | lzop | nc zielrechner 2342 ===== Der Netzwerk-"Way with socat" ===== Selbe Idee wie bei Netcat. Zielrechner: socat -u - tcp4-listen:2342 | tar x -C /ziel/verz Quellrechner: tar c /quelle/verz | socat -u - tcp4:zielrechner:2342 Wir können eine ganze Reihe von Kompressionsmethoden durch einen allgemeinen Aufruf verwenden: Zielrechner: socat -u - tcp4-listen:2342 | ${UNZIP} | tar x -C /ziel/verz Quellrechner: tar c /quelle/verz | ${ZIP} | socat -u - tcp4:zielrechner:2342 Wir definieren schließlich ZIP als einen der folgenden Befehle: * cat * lzop * gzip * bzip2 und UNZIP als: * cat * lzop -d * gunzip * bunzip2 Wo liegen die Unterschiede? # Messvorrichtung: time -p tar /usr/src/linux-2.6.3 | ${ZIP} | cat > /dev/null ^Programm ^Daten ^Laufzeit ^ |cat |182 MB |1.1 sec | |lzop |64 MB |4 sec | |gzip --fast |51 MB |9 sec | |gzip |41 MB |18 sec | |gzip --best |41 MB |49 sec | |bzip2 |32 MB |134 sec | Diese Einsparungen beim Komprimieren (bzw. beim Nicht-Komprimieren) sollten jedoch mit der vorhanden Bandbreite abgewogen werden. So macht es wenig Sinn, große Datenmengen unkomprimiert über eine DSL Leitung zu schicken - andererseits macht es aber wenig Sinn, nicht weiter komprimierbare Daten (z.B. JPEG/PNG-Bilder, AVIs, MP3s, zips, ...) mit lzop/gzip/bzip2 nochmal zu "komprimieren". Hierdurch wird nur Rechenleistung verschwendet und somit u.U. ein geringerer Durchsatz erreicht. ===== Externe Links zum Thema: ===== Quelle: [[http://de.gentoo-wiki.com/]] - Gentoo Linux Wiki\\ ---- Stand: 19.11.2009 EOF