"split" an StdOut

  • Yohoo!


    Ich versuche das folgende moelgichst effektiv hinzubekommen:


    -Binaeres Einlesen eines Mediums
    -Aufteilung in gleich grosse Teile
    -md5 Feststellung und Notieren derselben in einer Datei
    -Schreiben des jeweiligen Teiles nur, wenn sich die md5sum von der frueher geschriebenen Datei unterscheidet



    Anfangs wollte ich das mit dd, tee und split machen. split hat jedoch den Nachteil, dass man es weder pausieren kann noch die Ausgabe auf StdOut geht.


    Zweite Idee ist jetzt, einfach eine for Schleife anzulegen und dann dd mit dem berechneten skip- Parameter aufzurufen. Dann bekomme ich in jeder Schleifenrunde via dd auf den StdOut eine Datei, die ich dann mittels tee and md5sum und eine temporaere Datei weitergeben kann. Stimmt die md5 ueberein, wird die temporaere Datei wieder geloescht und der naechste Durchgang gestartet.
    Dummerweise startet dd aber bei jedem Durchlauf von vorne. D.h liest die komplette Quelle ein und schreibt dann erst ab Block "skip" in den Output. Das bringt Geschwindigkeitsmaessig nicht wirklich viel....weiterer Nachteil ist, dass ich die Blockgroesse des Mediums vorher feststellen muss, um die richtige Anzahl an Schliefendurchgaengen zu nehmen...


    Ach ja, Verbesserungen lohnen sich tatsaechlich, Quellmedium ist ca. 500GB gross!


    Also, Ziel ist es, aus >500GB Blockdevice (sonst wuerde rsync gehen) mehrere (viele) Dateien mit ca. 1GB zu machen, die aber nur dann geschrieben werden sollen, wenn sie sich geaendert haben.


    Jemand eine Idee?


    Werde zwischenzeitlich mal mit dem Offset Parameter des loop devices spielen, das koennte gehen...

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • Nachdem Ihr ja alle wohl schon pennt :lol2 :gap habe ich es alleine gebastelt.


    Das Skript liest jeweils 512MB aus dem Source Device, erstellt dabei die md5 und vergleicht die md5 mit der md5 der bisherig gespeicherten Datei.
    Ist sie gleich, wird wieder geloescht. Ist sie verschieden, wird aktuelle Blockdatei komprimiert auf dem Zieldevice gespeichert und die md5 auch kopiert.
    Dadurch wird die Datei nur einmal vom physikalischen Device gelesen. Der Rest passiert im Speicher (Ramdisk /dev/shm) Und die Zieldatei muss auch nicht gelesen werden, nur deren md5.
    Der grosse vorteil ist, dass das Skript exakt linear skaliert (von der Kompression mal abgesehen). A
    NAchteil ist, dass es IMMER das ganze Device liest um festzustellen, ob sich was geaendert hat.


    So ,das Teil laeuft jetzt ueber Nacht. Und das mache ich auch :n8


    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • Hallo Knebb,


    mal unabhänig davon was Dein Script macht, wozu verwendest Du 'losetup'?
    'dd' hat doch die Option 'skip' um ab einer bestimmten Position zu lesen.


    Hardy

    Suche: 6 Richtige für die nächste Lottoziehung
    PS: Wer Rechtschreibfehler findet, darf sie behalten!

  • Zitat

    Originally posted by HFlor
    'dd' hat doch die Option 'skip' um ab einer bestimmten Position zu lesen.


    Eben nicht. Ich meine, ja es hat diese Option. Aber es "liest" doch alles von Anfang ein. Oder tut zumindest so.
    D.h. es liest immer ueber die geskippten Bytes drueber. Will ich also z.B. nur die letzten 2GB lesen, liest dd mir trotzdem auch die vorhergehenden 498GB ein.


    Werd's aber nochmal testen, war ja spaet gestern ;D


    Ich brauche das Skript, um ein Image Backup meiner Backuppartition zu ziehen und diese dann nach "remote" zu kopieren.
    Da das Image massenweise Hardlinks enthaelt, ist jedes Dateibasierte Tool (wie z.B. rsync) vollkommen ueberfordert und braucht alleine fuer das Abgleichen der Hardlinks Tage.
    Aber jedesmal das ganze Image zu transferieren, uebersteigt die Kapazietaet meiner Internetanbindung. Also Blockweise und jeweils nur die geaenderten Daten.

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • Zitat

    Originally posted by tag
    Spricht eigentlich etwas gegen dump/restore?


    Ja, funktioniert nicht.
    Weiss nicht mehr warum, habe es getestet, hat entweder ewig gebraucht oder hat grosse inkrementelle Sicherungen geschrieben, obwohl auf der Platte nichts geaendert wurde...
    ehrlich, ich habe so ziemlich alle Optionen durch. Ausser ZFS, aber das ist mir noch zu experimentell.

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • Ansonsten, tee bzw. split gehen nicht auf stdout. Das ist richtig. Aber Du kannst den Output auch in eine Named Pipe leiten.
    Wenn es sich nicht pausieren lässt bzw. die Verarbeitung stehen bleibt, dann kann man die Named Pipe noch durch einen buffer leiten. mbuffer wäre z.B. geeignet.


    Ich verwende so eine Konstruktion, um Videos ohne Zwischendateien von einer DVD zu lesen, zu demuxen und neu zu muxen.


    Manchmal muss man etwas mit der Buffer-Größe experimentieren.

  • An eine NamedPipe hatte ich auch gedacht- bleibt aber die Frage, wie und wo ich dann die Aufteilung in die gewuenschte Groesse mach und das den darauf aufbauenden Tools mitteile.


    Irgendwie weiss ich jetzt nicht, wo ich die Named Pipe sinnvoll einbinden koennte.

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • Yohoo!


    nochmal eine Ergaenzung, die mir gerade aufgefallen ist.


    gzip erstellt IMMER verschiedene Dateiinhalte, wenn es mehrmals aufgerufen wird! :motz2
    D.h. rsync kann damit nicht wirklich sinnvoll umgehen.


    Macht doch mal das Folgende:

    Code
    cd /tmp
    cat /etc/fstab | gzip > fstab.1
    cat /etc/fstab | gzip > fstab.2
    md5sum fstab*

    Na, faellt was auf?
    Jo, genau. Die beiden komprimierten Dateien haben unterschiedliche md5sum, obwohl sie aus der gleichen Quelldatei stammen....was soll das?


    Nimmt man bzip2 statt gzip, sind die Zieldateien gleich. Aber bzip2 ist soooo lahm.


    Ach ja, ihr koennt die unterschiedlichen Dateien ja auch gerne wieder entpacken. Dann sind sie wieder gleich...waere ja noch schoener. :lol2


    Bringt da gzip noch einen Random Wert mit rein oder was? Kann man das abstellen?

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!