Effektiv Platten kopieren

sirko

Sirko
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/
#--------------------------------------------------
 
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 :)
 
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?
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:
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
 
Cheasy, Du bist ein Held. Vielen Dank!

Bleibt nur noch die Frage, wie ich die Platte bootable setzen kann.
 
Zuletzt bearbeitet:
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?
 
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
 
*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/
#--------------------------------------------------
 
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.)
 
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"
 
Zurück
Oben