User Tools

Site Tools


public:it:linux-befehle:daten-kopieren

Daten auf einen anderen Rechner Kopieren

Wenn man ganz viele Daten (viele GB oder viele Dateien) auf einen anderen Rechner kopieren möchte, ist scp -r … nicht immer so optimal.

Besser eine der folgenden vier Möglichkeiten verwenden.

Allgemein sei zuerst gesagt, dass es jeweil zwei Möglichkeiten gibt: Ziehen oder Schieben .

  • Beim Ziehen wird zur Quelle verbunden (also zu dem Rechner, der die Daten bisher hat)
  • Beim Schieben wird zum Ziel verbunden (also zu dem Rechner, der die Daten erhalten soll)

Dieser Rechner darf natürlich nicht hinter einem NAT sitzen, wodurch sich meist schon geklärt hat, ob man ziehen oder schieben muss ;-)

tar | ssh

Die Daten werden auf dem Quell-Rechner in eine große tar-Datei eingepackt, die Datei wird aber nicht auf die Platte gelegt, sondern über das Pipe-Symbol | an die SSH übergeben, die den Stream auf den anderen Rechner überträgt, dort wird er von einem tar wieder On-the-fly entpackt.

Schieben (Quelle --> Ziel)

Dazu gibt man auf dem Rechner, auf dem die Daten liegen, folgendes ein:

tar -c --exclude=/proc / | ssh -T user@rechner tar -C /ziel/verzeichniss -xpv
  • Man kann mehrere –exclude=xyz Dinger rein machen, wenn man mehr

vom Übertragen ausschließen möchte.

  • Das -C mit dem Ziel-Verzeichnis muss der erste Parameter des zweiten tar sein
  • man kann zusätzlich im tar komprimieren, dazu beiden tar noch den Parameter -z ranmachen, bringt aber nicht so viel, denn die SSH komprimiert auch ;-)
  • das -v ganz hinten kann man weg lassen, dann gibt es keine Ausgaben
  • das -T ist bei neueren SSH-Versionen wichtig, damit auf jeden Fall die Verbindung als nicht-interaktiv betrachtet wird, sonst werden gewisse Sonderzeichen (~) ausgewertet und die Daten dabei geschrottet.

Man kann den Inhalt eines Rechners auch in ein Tar-File auf der anderen Seite schieben:

tar -c --exclude=/proc / | ssh -T user@rechner "cat 1>mein_archiv.tar"

Ziehen (Ziel <-- Quelle)

Dazu gibt man auf dem Rechner, auf dem die Daten hinterher liegen sollen, ein:

ssh -T user@rechner tar -c --exclude=/proc / | tar -C /ziel/verzeichnis -xpv

Optionen wie oben.

tar + netcat

Hierbei werden die Daten nicht verschlüsselt und nicht gesichert über das Netz übertragen, kann man also nur machen, wenn das Netz sicher ist! Man muss hier auf beiden Rechnern einen Befehl eingeben!

Schieben (Quelle --> Ziel)

Auf dem Ziel-Rechner:

nc -v -w 30 -l -p 4242 | tar -C /ziel/verzeichniss -xpv

auf einem aktuellen ubuntu (10.04) geht der befehl von oben nicht mehr, alternativ ist dieser Befehl zu verwenden

nc -v -l 4242 | tar -C /ziel/verzeichnis -xpv

Aus dem Quell-Rechner:

tar -c --exclude=/proc / | nc -v -w 2 ziel-ip 4242

Die Parameter bedeuten:

  • Die obere Zeile ist der Server (macht einen Port auf, Firewall muss daher für diesen Port offen sein und der Ziel-Rechner darf nicht hinter einem NAT sein!)
  • Die untere Zeile ist der Client, der verbindet zum Server
  • 4242 ist der Port, es kann stattdessen jeder andere TCP-Port verwendet werden
  • -v ist Verbose und zu empfehlen, dann sieht man, wenn eine Verbindung zustande kommt
  • Das -w ist der Timeout, der Server sollte einen langen, der Client einen kurzen (1 bis 5 Sekunden) haben
  • Hier macht ein zusätzliches -z beim tar bei langsamen Leitungen durchaus Sinn, weil kein SSH da ist, das selbst noch komprimiert.

Ziehen (Ziel <-- Quelle)

Aus dem Quell-Rechner:

tar -c --exclude=/proc / | nc -v -w 30 -l -p 4242

Auf dem Ziel-Rechner:

nc -v -w 2 quelle-ip 4242 | tar -C /ziel/verzeichniss -xpv

Hier macht die Quelle als Server einen Port auf und der Ziel-Rechner verbindet darauf.

Daten innerhalb desselben Rechners kopieren (z.B. von Partition X nach Partition Y)

Auf neueren Linux-Distributionen (>2001, z.B. ab Redhat 7.0 oder Debian woody) verwendet man (/proc und /sys sollte eigentlich nicht mitkopiert werden, oder wenigstens nachher auf dem Ziel den Inhalt löschen)

cp -a / /zielplatte

ansonsten besser:

tar -c --exclude /proc --exclude /sys / | tar -C /ziel -xp

rsync + ssh

Das Schöne am RSync ist, dass es nur die Unterschiede überträgt, falls die Datei schon existiert. Man kann auch komplette Ordnerstrukturen auf einmal übertragen.

rsync -avz --rsh=ssh user@remotehost:quelle ziel

Optionen:

-a für Archivmodus, entspricht -rlptgoD
-v für Verbose (anzeigen, was passiert)
-z für Kompression

Man kann die Option –sparse füer Dateien mit Löchern benutzen (z.B. QEMU-Images). Die sind bei mir z.B. 400MB groß, belegen aber nur 132MB auf der Platte.

Schieben und Ziehen sind beide möglich, einfach beim obigen Beispiel user@remotehost: vor das Ziel statt vor die Quelle schreiben.

dd + ssh

Ganz easy Plattenbackup mit dd

dd if=localfile | ssh target_address dd of=remotefile

Für localfile die Platte angeben (z.B. /dev/hda) und als remotefile eine Datei im Dateisystem.

public/it/linux-befehle/daten-kopieren.txt · Last modified: 2016/10/20 19:40 by 127.0.0.1