{"id":4,"date":"2013-03-24T19:36:25","date_gmt":"2013-03-24T17:36:25","guid":{"rendered":"http:\/\/www.theta-soft.de\/blog\/?p=4"},"modified":"2013-03-24T19:03:12","modified_gmt":"2013-03-24T18:03:12","slug":"kopieren-eines-gesamten-laufwerks-uber-eine-dsl-verbindung","status":"publish","type":"post","link":"https:\/\/www.theta-soft.de\/blog\/2013\/kopieren-eines-gesamten-laufwerks-uber-eine-dsl-verbindung\/","title":{"rendered":"Kopieren eines gesamten Laufwerks \u00fcber eine DSL-Verbindung"},"content":{"rendered":"<p>K\u00fcrzlich wollte ich ein gro\u00dfes Laufwerk (genauer: ein Logical Volume) von einem lokalen auf einen entfernten Linux-Server kopieren. Problem: Der lokale Server ist nur mittels DSL angebunden, und das Volume ist 20 GB gro\u00df &#8230;<\/p>\n<p>Da das Kopieren deutlich l\u00e4nger als 24 Stunden dauern w\u00fcrde, musste ich mit mindestens einem DSL-Disconnect rechnen. Somit konnte ich nicht einfach einen Kopierjob starten und das Ding beliebig lange laufen lassen. Andererseits wollte ich mir aber auch nicht die M\u00fche machen, einen Download-Manager (oder in diesem Fall: Upload-Manager) zu installieren.<\/p>\n<p>Mittels ein paar einfache Linux-Befehlen lie\u00df sich das Problem dann aber doch ganz elegant l\u00f6sen. Das Kopieren erledigte folgender Befehl:<\/p>\n<pre>for i in $(seq -w 0 199); do\r\n    file=$i.gz\r\n    echo $file\r\n    dd if=\/dev\/vg0\/foo bs=100M count=1 skip=$i | gzip -c &gt; $file\r\n    md5sum -b $file &gt;&gt; md5.txt\r\n    scp -i foo.key $file remote:\/mnt\/upload\r\n    rm $file\r\ndone<\/pre>\n<p>Die Idee: Die 20 GB an Daten werden in 200 Pakete zu je 100 MB zerlegt. Jedes Paket wird mittels\u00a0<em>dd<\/em> gelesen, wobei die Option\u00a0<em>skip<\/em> dazu dient, an die richtige Stelle zu springen. Die Pakete werden dann gepackt, und zur sp\u00e4teren Kontrolle wird eine MD5-Pr\u00fcfsumme berechnet. Anschlie\u00dfend kann das Paket zum Server kopiert und lokal gel\u00f6scht werden.<\/p>\n<p>Nachdem das Kopieren abgeschlossen war, konnte ich auf dem Server zun\u00e4chst pr\u00fcfen, welche Pakete nicht sauber kopiert wurden. Dazu dient der folgende einfache Befehl:<\/p>\n<pre>md5sum -c md5.txt<\/pre>\n<p>Wie erwartet war genau das Paket kaputt, w\u00e4hrend dessen \u00dcbertragung der DSL-Reconnect erfolgt war. Das Paket konnte ich dann leicht noch einmal \u00fcbertragen.<\/p>\n<p>Zum Zusammensetzen auf dem Server dient der folgende Befehl:<\/p>\n<pre>for i in $(seq -w 0 199); do\r\n    file=$i.gz\r\n    echo $file\r\n    gunzip -c $file | dd of=\/dev\/vg0\/foo obs=100M seek=$i\r\ndone<\/pre>\n<p>Wichtig ist, dass hier\u00a0<em>seek<\/em>\u00a0anstelle von\u00a0<em>skip<\/em> verwendet wird, um auf dem Ausgabeger\u00e4t an die richtige Stelle zu springen. Au\u00dferdem darf nicht mit\u00a0<em>bs<\/em>\u00a0gearbeitet werden. Stattdessen kommt\u00a0<em>obs<\/em> zum Einsatz. Die Option\u00a0<em>bs<\/em> setzt sowohl die Input Block Size\u00a0<em>(ibs)<\/em> als auch die Output Block Size\u00a0<em>(obs)<\/em>. Eine gro\u00dfe Input Block Size f\u00fchrt jedoch dazu, dass nur ein Bruchteil der Daten verarbeitet wird, da der\u00a0<em>gunzip<\/em>-Befehl nicht auf einen Schlag alle Daten liefern kann. Alternativ h\u00e4tte man die Daten zun\u00e4chst lokal entpacken k\u00f6nnen:<em><br \/>\n<\/em><\/p>\n<pre>for i in $(seq -w 0 199); do\r\n    file=$i.gz\r\n    echo $file\r\n    gunzip $file\r\n    dd if=$file of=\/dev\/vg0\/foo bs=100M seek=$i\r\n    rm $file\r\ndone<\/pre>\n<p>Da das andere Verfahren aber ebenso gut funktioniert, habe ich mich f\u00fcr die L\u00f6sung entschieden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>K\u00fcrzlich wollte ich ein gro\u00dfes Laufwerk (genauer: ein Logical Volume) von einem lokalen auf einen entfernten Linux-Server kopieren. Problem: Der lokale Server ist nur mittels DSL angebunden, und das Volume ist 20 GB gro\u00df &#8230; Da das Kopieren deutlich l\u00e4nger als 24 Stunden dauern w\u00fcrde, musste ich mit mindestens einem DSL-Disconnect rechnen. Somit konnte ich [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_members_access_role":[],"_members_access_error":""},"categories":[1],"tags":[],"class_list":["post-4","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"_links":{"self":[{"href":"https:\/\/www.theta-soft.de\/blog\/wp-json\/wp\/v2\/posts\/4","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.theta-soft.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.theta-soft.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.theta-soft.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.theta-soft.de\/blog\/wp-json\/wp\/v2\/comments?post=4"}],"version-history":[{"count":9,"href":"https:\/\/www.theta-soft.de\/blog\/wp-json\/wp\/v2\/posts\/4\/revisions"}],"predecessor-version":[{"id":11,"href":"https:\/\/www.theta-soft.de\/blog\/wp-json\/wp\/v2\/posts\/4\/revisions\/11"}],"wp:attachment":[{"href":"https:\/\/www.theta-soft.de\/blog\/wp-json\/wp\/v2\/media?parent=4"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.theta-soft.de\/blog\/wp-json\/wp\/v2\/categories?post=4"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.theta-soft.de\/blog\/wp-json\/wp\/v2\/tags?post=4"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}