Effektiv Platten kopieren

Dieses Thema im Forum "FreeBSD - Allgemein" wurde erstellt von sirko, 20 Oktober 2006.

  1. sirko

    sirko Sirko

    Registriert seit:
    27 Juni 2004
    Beiträge:
    14
    Hi.

    ich habe regelmäßig ne Installation, die auf andere Platten kopiert werden muß. Die Platten haben leider oft unterschiedliche Größen. Daher würde ich mir gern ein Script schreiben welches die Inhalte der Platten mit cpdup anstelle von dd schnell und effektiv kopiert.
    Folgendes Script kann so nicht funktionieren, denke ich. Es ist bestimmt nicht möglich, mit bsdlabel einfach so Platte A auszulesen und auf Platte B übertragen zu wollen. Die Platte muss ja auch irgendwie bootfähig gemacht werden. Aber grundsätzlich müßte es mit der Methode doch gehen, man könnte auch noch einen Schritt einbauen, im gemounteten Ziel-Dateisystem Konfigurations-Dateien anzupassen. Da ich keinerlei Erfahrung mit bsdlabel habe, stelle ich den ersten Arbeitsentwurf mal zur Diskussion.

    Meine wichtigste Fragen wären:

    Wie kriege ich bsdlabel dazu, für einzelne Partitionen wie /, /usr, swap feste Größen zu benutzen und den kompletten restlichen freien Bereich z.B. für /var oder /home zu benutzen?

    Wie kriege ich die Platte bootfähig?

    Also nochmal: Dieser Code funktioniert so nicht!

    Code:
    #!/bin/sh
    
    dd if=/dev/zero of=/dev/da1 bs=1k count=1
    
    # Initialisieren der neuen Platte
    fdisk -BI ad2
    
    # Labeln
    bsdlabel -B -w -r ad2s1 auto
    
    # Disklabel von der Quell-Platte lesen
    bsdlabel ad0 > /tmp/bsdlabel.txt
    
    # Editieren des Disklabels und Hinzufügen von Partitionen
    bsdlabel -R /tmp/bsdlabel.txt
    rm /tmp/bsdlabel.txt
    
    # Diesen Part fuer jede Partition wiederholen
    #--------------------------------------------------
    [test -d /mnt/root/] || mkdir -p /mnt/root
    
    # Dateisystem erzeugen
    newfs /dev/ad2s1a
    
    # Anhängen der Partitionen
    mount /dev/ad2s1a /mnt/root/
    
    # Kopie mit cpdup von der Quelle
    cpdup -v / /mnt/root/
    #--------------------------------------------------
  2. -Daemon-

    -Daemon- Lehrling

    Registriert seit:
    3 August 2005
    Beiträge:
    956
    Ich habe vor einiger Zeit auch meine FreeBSD-Installation auf neue Platten kopiert. Ich habe dazu die neue Platte partitioniert, und dann mit dd den Inhalt der alten Platte auf die neue Platte gebuegelt.
    Die Groesse der Slices/Partitionen ist dabei (fast) egal, um von der neuen Platte zu booten habe ich einfach die alte ausgebaut. Fertig :D

    Das ist etwas mehr Handarbeit als die Loesung die dir vorschwebt, hat aber gut funktioniert :)
  3. cheasy

    cheasy SysAdm*n from Hell

    Registriert seit:
    5 Mai 2003
    Beiträge:
    668
    Wohnort:
    Steinbach / Taunus
    Indem Du bsdlabel mit einer Konfigurationsdatei fütterst, z.B. so:
    bsdlabel -R [-An] [-m machine] disk protofile
    protofile enthält
    Code:
    8 partitions:
    	 #	  size	 offset    fstype   [fsize bsize bps/cpg]
    	   a:	    1G	     16    4.2BSD        *     *     *
    	   b:	  512M	      *      swap
    	   c:        *	      0    unused	 *     *	 # "raw" part, don't edit
    	   d:	     *	      *    4.2BSD        *     *     *
    Dabei soll protofile in demselben Format sein, in dem bsdlabel die Partitionstabelle ausgibt. Die Sterne werden von bsdlabel durch sinnvolle Werte ersetzt, in diesem Fall wird der Partition d: der Rest der Platte zugeordnet.

    Wenn ich mich recht erinnere, sind als Multiplikatoren k, M, G und % zulässig. Genaueres findet man in "The Complete FreeBSD" von Greg Lehey. Dieses Buch ist inzwischen auch online zu finden.

    Sinnvollerweise lässt man einmal bsdlabel eine Platte automatisch labeln, gibt das entstandene Label in eine Datei aus, editiert diese und füttert das Ergebnis wieder in bsdlabel.
    Zuletzt bearbeitet: 20 Oktober 2006
  4. sirko

    sirko Sirko

    Registriert seit:
    27 Juni 2004
    Beiträge:
    14
    Das es so geht, ist mir schon klar. Das Scrip wäre sinnvoll, denn

    1. Ich will sämtlichen auf der Ziel-Platte vorhandenen Platz ausnutzen
    2. Das kopieren per dd dauert viel zu lange, wenn Du 10 Installationen an einem Tag schaffen willst.
    3. Es soll so wenig Interaktion wie möglich nötig sein, um den Arbeitsaufwand gering zu halten
  5. sirko

    sirko Sirko

    Registriert seit:
    27 Juni 2004
    Beiträge:
    14
    Cheasy, Du bist ein Held. Vielen Dank!

    Bleibt nur noch die Frage, wie ich die Platte bootable setzen kann.
    Zuletzt bearbeitet: 20 Oktober 2006
  6. sirko

    sirko Sirko

    Registriert seit:
    27 Juni 2004
    Beiträge:
    14
    Seltsam.

    Code:
    # bsdlabel ad0
    bsdlabel: /dev/ad0: no valid label found
    Die Platte wurde per sysinstall eingerichtet und dort werden die Partitionen richtig angezeigt. Was kann das sein?
  7. nice

    nice New Member

    Registriert seit:
    14 Mai 2006
    Beiträge:
    23
    ad0 kann kein bsdlabel enthalten. Nur slices haben label ad0s1 z.B. . Um die slices zu bestimmen oder herauszufinden must du fdisk verwenden.
    z.B.
    Code:
    fdisk /dev/ad0
    
  8. sirko

    sirko Sirko

    Registriert seit:
    27 Juni 2004
    Beiträge:
    14
    *kopfklatsch* Ja, logisch. Danke.

    Demnach würde ein Script etwa wie folgt aussehen:

    Code:
    #!/bin/sh
    
    dd if=/dev/zero of=/dev/da1 bs=1k count=1
    
    # Initialisieren der neuen Platte
    fdisk -BI ad2
    
    # Labeln
    bsdlabel -B -w -r ad2s1 auto
    
    # Disklabel von der Quell-Platte lesen
    bsdlabel ad0s1 > /tmp/bsdlabel.txt
    
    # Disklabel editieren
    vim /tmp/bsdlabel.txt
    
    # Editieren des Disklabels und Hinzufügen von Partitionen
    bsdlabel -R /tmp/bsdlabel.txt ad2s1
    rm /tmp/bsdlabel.txt
    
    # Diesen Part fuer jede Partition wiederholen
    #--------------------------------------------------
    [test -d /mnt/root/] || mkdir -p /mnt/root
    
    # Dateisystem erzeugen
    newfs /dev/ad2s1a
    
    # Anhängen der Partitionen
    mount /dev/ad2s1a /mnt/root/
    
    # Kopie mit cpdup von der Quelle
    cpdup -v / /mnt/root/
    #--------------------------------------------------
  9. nice

    nice New Member

    Registriert seit:
    14 Mai 2006
    Beiträge:
    23
    Schau dir mal partimage [1] an.
    Auch wenn der Support für UFS noch beta ist vieleicht hilft es dir dennoch. Klappt auch super über das Netzwerk.

    Gruß
    nice

    1 http://partimage.org/Main_Page
  10. MrFixit

    MrFixit aka uqs

    Registriert seit:
    28 Februar 2003
    Beiträge:
    2.024
    Ich kenne cpdup nicht im Detail, wuerde aber dump|restore den Vorzug geben.

    Auch funktioniert das so ja nur lokal. Baust du denn die Platten ständig um? Warum nicht eine Live-CD basteln und die Daten per SSH holen lassen?

    ACHTUNG: Du willst die ssh_host_keys auf dem neuen System löschen, so dass eigene erzeugt werden. Auch hostname+IP bedürfen wohl eines manuellen Eingriffs.

    Achja, wenn du nur ein standardisiertes Release auf mehreren Rechner installieren willst, dann schau die mal 'man release' an und baue deine eigene FreeBSD Release CD (mit automatischer Installation, etc.)
  11. sirko

    sirko Sirko

    Registriert seit:
    27 Juni 2004
    Beiträge:
    14
    Folgendes Script funktioniert nun schon für mich, könnte als Ausgangspunkt dienen. Ob die kopierte Platte auch bootfähig ist, weiß ich noch nicht, mal testen. Praktisch wäre, alle Partitionen gleich aus der fstab auszulesen und danach sowas wie ne Abfrage, wie gross die Partitionen auf der Zielplatte werden sollen.


    Code:
    #!/bin/sh
    #
    #TODO die Partitionen und Device-Namen aus der fstab auslesen
    #TODO bsdlabel.txt parsen und automatisch Default-
    #     Partitions-Groessen eintragen
    #--------------------------------------------------
    cp_partition()
    {
            # Parameter:
            # 1. Name der Ziel-Partition z.B. "ad2s1a"
            # 2. Mountpoint vom Quell-Dateisystem z.B. "/" oder "/usr"
    
            # Dateisystem erzeugen
            newfs /dev/$1
    
            # Anhängen der Partitionen
            [test -d /mnt$2] || mkdir -p /mnt$2
            mount /dev/$1 /mnt$2
    
            # Kopie mit cpdup von der Quelle
            cpdup -v $2 /mnt$2
    }
    #--------------------------------------------------
    dd if=/dev/zero of=/dev/da1 bs=1k count=1
    
    # Initialisieren der neuen Platte
    fdisk -BI ad2
    
    # Labeln
    bsdlabel -B -w -r ad2s1 auto
    
    # Disklabel von der Quell-Platte lesen
    bsdlabel ad0s1 > /tmp/bsdlabel.txt
    
    # Disklabel editieren
    vim /tmp/bsdlabel.txt
    
    # Editieren des Disklabels und Hinzufügen von Partitionen
    bsdlabel -R /tmp/bsdlabel.txt ad2s1
    rm /tmp/bsdlabel.txt
    
    # Diesen Part fuer jede Partition wiederholen
    #--------------------------------------------------
    cp_partition "ad2s1a" "/"
    cp_partition "ad2s1d" "/usr"
    cp_partition "ad2s1e" "/var"