weidner/archives/2011/12/04/

Das Betriebssystem auf die Reservepartition kopieren

Wenn ich das Betriebssystem auf meinen Rechner mit PXE-initrd installiert habe, dann ist da noch eine freie Partition, groß genug für das Betriebssystem, aber leer. Bei der Installation wurde nur der Platz freigehalten, füllen muss ich ihn noch. Da ich diese Partition als Redundanz für Notfälle angelegt habe, möchte ich dort im Notfall auch eine aktuelle Version des Betriebssystems, möglichst genauso wie auf der ersten Partition haben. Also fülle beziehungsweise aktualisiere ich diese Partition so spät wie möglich, am besten kurz vor dem Notfall. Das heißt kurz bevor ich etwas an der ersten Partition verändere. Und damit die Aktualisierung nur das nötigste umfasst, verwende ich rsync zum Abgleich der ersten mit der zweiten Partition.

# e2fsck /dev/hda3
# mkdir /tmp/mnt
# mount /dev/hda3 /tmp/mnt
# rsync --one-file-system --sparse --recursive --links --perms     \
        --times --group --owner --devices --specials --hard-links  \
        --acls --xattrs --executability --delete --force --verbose \
        / /tmp/mnt/
# umount /tmp/mnt

Wenn ich dann das System von der Reservepartition gestartet habe, möchte ich natürlich so schnell wie möglich die erste Partition in den Ausgangszustand versetzen. Dazu kann ich fast die gleichen Befehle verwenden, ich muss nur anstelle von /dev/hda3 im ersten und dritten Befehl /dev/hda2 verwenden.

Damit ich im Ernstfall, wenn ich wahrscheinlich unter Stress stehe, nicht noch entscheiden muss, von welcher Partition ich auf welche aktualisieren will, automatisiere ich mir den Vorgang. Eigentlich muss ich nur herausfinden, welche Partition die andere ist, auf die ich die Root-Partition klonen will. Das geht über einen kleinen Umweg:

# PARTITIONS="
/dev/hda2
/dev/hda3
"
# ROOTPARTITION=$(mount|awk '/^\/dev\/.* on \/ type/ { print $1}')
# OTHERPARTITION=$(echo "$PARTITIONS"|egrep -v "^(|$ROOTPARTITION)$")

# echo "other partition: $OTHERPARTITION"

Die Root-Partition bekomme ich mit mount und awk heraus. Für die andere Partition verwende ich egrep. Damit dieses aus der Liste genau die andere Partition auswählt, muss ich dafür sorgen, dass die Zeilenvorschübe mitkommen. Deshalb schiebe ich die Partitionsliste mit echo "$PARTITIONS" (man beachte die doppelten Anführungsstriche) in die Standardeingabe und filtere sowohl die Leerzeilen als auch die Zeile mit der Root-Partition heraus.

Nun kann ich alles in einem Script zusammenfassen, dass ich nach /root/bin/clone-root.sh kopiere und bei Bedarf genau so aufrufen kann. Dieses Script kopiert, mit so wenig Schreiboperationen wie möglich, die Root-Partition auf die Reserve-Partition.

Die Ausgabe des Scripts sieht dann in etwa so aus:

# /root/bin/clone-root.sh 
other partition: /dev/hda2
e2fsck 1.41.12 (17-May-2010)
/dev/hda2: clean, 6333/49152 files, 49510/196608 blocks
sending incremental file list
root/bin/clone-root.sh
tmp/

sent 125885 bytes  received 699 bytes  50633.60 bytes/sec
total size is 170954189  speedup is 1350.52
Posted 2011-12-04
Tags: