#! /bin/sh backup_dir="$1" log_file="$backup_dir/lvm-backup-log.txt" # Pfad zum vol_id Programm angeben - wird mit udev geliefert. VOL_ID="/lib/udev/vol_id" echo `date`: "Starte Sicherung" >> $log_file # Partitionstabelle auslesen echo `date`: "Partitionstabelle:" >> $log_file sfdisk -d | tee -a $log_file > "$backup_dir/sfdisk.txt" echo `date`: "----------------------------------------------------------------------------- 1" >> $log_file # Vorhandene PVs, VGs und LVs auslesen echo `date`: "Physical Volumes (PVs):" >> $log_file pvdisplay -C --noheadings | tee -a $log_file > "$backup_dir/pvdisplay.txt" echo `date`: "----------------------------------------------------------------------------- 2" >> $log_file echo `date`: "Volume Groups (VGs):" >> $log_file vgdisplay -C --noheadings | tee -a $log_file > "$backup_dir/vgdisplay.txt" echo `date`: "----------------------------------------------------------------------------- 3" >> $log_file echo `date`: "Logical Volumes (LVs):" >> $log_file lvdisplay -C --noheadings --units m | tee -a $log_file > "$backup_dir/lvdisplay.txt" echo `date`: "----------------------------------------------------------------------------- 4" >> $log_file # Mountverzeichnis für root anlegen echo `date`: "Mounte / nach /tmp/backup.root.$$" >> $log_file mkdir -p /tmp/backup.root.$$ # Root in das Mountverzeichnis einhängen mount -v -o bind / /tmp/backup.root.$$ 2>&1 | tee -a $log_file # In das Mountverzeichnis wechseln echo `date`: "Erstelle Backup von / in Datei $backup_dir/root.cpio" >> $log_file pushd /tmp/backup.root.$$ > /dev/null 2>&1 # Root sichern find . -print0 | cpio -o0aB -H crc > "$backup_dir/root.cpio" 2>> $log_file # Das Mountverzeichnis verlassen popd > /dev/null 2>&1 # Das Mountverzeichnis aushängen und löschen umount /tmp/backup.root.$$ && rm -rfv /tmp/backup.root.$$ echo `date`: "----------------------------------------------------------------------------- 5" >> $log_file # Mountverzeichnis für boot anlegen echo `date`: "Mounte /boot nach /tmp/backup.boot.$$" >> $log_file mkdir -p /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 echo `date`: "/boot war schon gemounted, mache bind mount" >> $log_file mount -v -o bind /boot /tmp/backup.boot.$$ 2>&1 | tee -a $log_file else # /boot ist noch nicht gemounted - richtig einhängen # Dazu bestimmen, auf welchem Blockdevice es sich befindet echo `date`: "/boot war nicht gemounted, mounte von `grep boot /etc/fstab | grep -v ^# | awk '{print $1}'`" >> $log_file mount -v -o ro `grep boot /etc/fstab | grep -v ^# | awk '{print $1}'` /tmp/backup.boot.$$ 2>&1 | tee -a $log_file fi # In das Mountverzeichnis wechseln echo `date`: "Erstelle Backup von /boot in Datei $backup_dir/boot.cpio" >> $log_file pushd /tmp/backup.boot.$$ > /dev/null 2>&1 # /boot sichern find . -print0 | cpio -o0aB -H crc > "$backup_dir/boot.cpio" 2>> $log_file # Das Mountverzeichnis verlassen popd > /dev/null 2>&1 # Liste aller Mounts sichern, mit Angabe der Labels echo `date`: "Liste aller Mountpoints:" >> $log_file mount -l | tee -a $log_file > "$backup_dir/mount.txt" # Das Mountverzeichnis von /boot aushängen und löschen umount /tmp/backup.boot.$$ && rm -rfv /tmp/backup.boot.$$ echo `date`: "----------------------------------------------------------------------------- 6" >> $log_file # 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. echo `date`: "Erstelle Backup von /dev/$vg/$lv mit Snapshot Snap-$lv" >> $log_file unset ID_FS_TYPE if test -x "$VOL_ID"; then eval $("$VOL_ID" --export /dev/$vg/$lv) echo `date`: "VOL_ID ($VOL_ID) ausführbar, ID_FS_TYPE=$ID_FS_TYPE" >> $log_file # 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 2>&1 | tee -a $log_file # Mountverzeichnis anlegen mkdir -p /tmp/snaps_Snap-$lv.$$ echo `date`: "============================================================================= 1" >> $log_file # 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. # XFS & Rest müssen mit unterschiedlichen Optionen eingehängt # werden (bei XFS: mit nouuid). Standard: Nur "ro" mount_opts=ro if [ -n "$ID_FS_TYPE" ]; then # Ueberprüfen, ob es sich um XFS handelt test "$ID_FS_TYPE" = "xfs" && mount_opts=nouuid,ro echo `date`: "ID_FS_TYPE war auf \"$ID_FS_TYPE\" gesetzt, mounte mit mount_opts=$mount_opts. Befehl: mount -v -o $mount_opts -t $ID_FS_TYPE /dev/$vg/Snap-$lv /tmp/snaps_Snap-$lv.$$" >> $log_file mount -v -o $mount_opts -t "$ID_FS_TYPE" /dev/$vg/Snap-$lv /tmp/snaps_Snap-$lv.$$ 2>&1 | tee -a $log_file else # VOL_ID war nicht vorhanden, FS Type auf andere Art und # Weise bestimmen. test "`egrep "${vg}.*${lv}" /proc/mounts | awk '{print $3}'`" = "xfs" && mount_opts=nouuid,ro echo `date`: "ID_FS_TYPE war NICHT gesetzt. Mounte mit mount_opts=$mount_opts. Befehl: mount -v -o $mount_opts /dev/$vg/Snap-$lv /tmp/snaps_Snap-$lv.$$" >> $log_file mount -v -o $mount_opts /dev/$vg/Snap-$lv /tmp/snaps_Snap-$lv.$$ 2>&1 | tee -a $log_file fi echo `date`: "============================================================================= 2" >> $log_file # In das Mountverzeichnis wechseln echo `date`: "Erstelle Backup von /tmp/snaps_Snap-$lv.$$ in Datei $backup_dir/${vg}_$lv.cpio" >> $log_file pushd /tmp/snaps_Snap-$lv.$$ > /dev/null 2>&1 # Das Dateisystem sichern find . -print0 | cpio -o0aB -H crc > "$backup_dir/${vg}_$lv.cpio" 2>> $log_file # 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 echo `date`: "Entferne Snapshot Volume /dev/$vg/Snap-$lv" >> $log_file lvremove --force /dev/$vg/Snap-$lv 2>&1 | tee -a $log_file echo `date`: "-+=*-+=*-+=*-+=*-+=*-+=*-+=*-+=*-+=*-+=*-+=*-+=*-+=*-+=*-+=*-+=*-+=*-+=*-+=*- 3" >> $log_file echo >> $log_file done echo `date`: "Sicherung beendet." >> $log_file echo `date`: "################################################################################" >> $log_file