#! /bin/sh backup_dir="$1" # Pfad zum vol_id Programm angeben - wird mit udev geliefert. VOL_ID="/lib/udev/vol_id" # Partitionstabelle auslesen sfdisk -d > "$backup_dir/sfdisk.txt" # Vorhandene PVs, VGs und LVs auslesen pvdisplay -C --noheadings > "$backup_dir/pvdisplay.txt" vgdisplay -C --noheadings > "$backup_dir/vgdisplay.txt" lvdisplay -C --noheadings --units m > "$backup_dir/lvdisplay.txt" # Mountverzeichnis für root anlegen mkdir /tmp/backup.root.$$ # Root in das Mountverzeichnis einhängen mount -v -o bind / /tmp/backup.root.$$ # In das Mountverzeichnis wechseln pushd /tmp/backup.root.$$ > /dev/null 2>&1 # Root sichern find . -print0 | cpio -o0aB -H crc > "$backup_dir/root.cpio" # Das Mountverzeichnis verlassen popd > /dev/null 2>&1 # Das Mountverzeichnis aushängen und löschen umount /tmp/backup.root.$$ && rm -rfv /tmp/backup.root.$$ # Mountverzeichnis für boot anlegen mkdir /tmp/backup.boot.$$ # boot einhängen - richtig, falls noch nicht gemounted, per bind andernfalls if grep -q /boot /proc/mounts; then # /boot per -o bind einhängen, da es schon gemounted ist mount -v -o bind /boot /tmp/backup.boot.$$ else # /boot ist noch nicht gemounted - richtig einhängen # Dazu bestimmen, auf welchem Blockdevice es sich befindet mount -v -o ro `grep boot /etc/fstab | grep -v ^# | awk '{print $1}'` /tmp/backup.boot.$$ fi # Liste aller Mounts sichern, mit Angabe der Labels mount -l > "$backup_dir/mount.txt" # In das Mountverzeichnis wechseln pushd /tmp/backup.boot.$$ > /dev/null 2>&1 # /boot sichern find . -print0 | cpio -o0aB -H crc > "$backup_dir/boot.cpio" # Das Mountverzeichnis verlassen popd > /dev/null 2>&1 # Das Mountverzeichnis aushängen und löschen umount /tmp/backup.boot.$$ && rm -rfv /tmp/backup.boot.$$ # Alle LVs sichern lvdisplay -C --noheadings --units m | while read lv vg opt size; do # Sofern Swap auf diesem Device angelegt ist, überspringe # dieses Device. # Hierzu wird auf ein Tool von udev zurückgegriffen, sofern # vorhanden. unset ID_FS_TYPE if test -x "$VOL_ID"; then eval $("$VOL_ID" -t /dev/$vg/$lv) # Das vol_id Programm wurde gefunden - verwende es! if echo $ID_FS_TYPE | grep -qi swap; then # Es handelt sich um ein Swapdevice -> mit # dem nächsten Device weitermachen. continue fi fi # Snapshot LV anlegen lvcreate --snapshot --name Snap-$lv --size 512m /dev/$vg/$lv # Mountverzeichnis anlegen mkdir /tmp/snaps_Snap-$lv.$$ # Snapshot LV einhängen - XFS & Rest mit unterschiedlichen Optionen if [ "`egrep "${vg}.*${lv}" /proc/mounts | awk '{print $3}'`" = "xfs" ]; then opts=ro,nouuid else opts=ro fi # Snapshot LV einhängen # Sofern vol_id vorhanden ist, vol_id verwenden um den # Typ des Dateisystems zu bestimmen. Andernfalls auf die # Automatik des Kernels vertrauen. if [ -n "$ID_FS_TYPE" ]; then mount -v -o $opts -t "$ID_FS_TYPE" /dev/$vg/Snap-$lv /tmp/snaps_Snap-$lv.$$ else mount -v -o $opts /dev/$vg/Snap-$lv /tmp/snaps_Snap-$lv.$$ fi # In das Mountverzeichnis wechseln pushd /tmp/snaps_Snap-$lv.$$ > /dev/null 2>&1 # Das Dateisystem sichern find . -print0 | cpio -o0aB -H crc > "$backup_dir/${vg}_$lv.cpio" # Das Mountverzeichnis verlassen popd > /dev/null 2>&1 # Das Mountverzeichnis aushängen und löschen umount -v /dev/$vg/Snap-$lv && rm -rfv /tmp/snaps_Snap-$lv.$$ # Snapshot LV entfernen lvremove --force /dev/$vg/Snap-$lv done