sys: new lvm option to backup LVM metadata of every detected volume group
authorintrigeri <intrigeri@boum.org>
Thu, 22 Jan 2009 22:15:13 +0000 (22:15 +0000)
committerintrigeri <intrigeri@boum.org>
Thu, 22 Jan 2009 22:15:13 +0000 (22:15 +0000)
ChangeLog
examples/example.sys
handlers/sys.helper.in
handlers/sys.in

index c5208b3b60bfc70fadc0d7994a47133f3b8a07d2..9ab2c9dd0febe32727a923e31a3f82fd3a45121c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -21,6 +21,8 @@ version 0.9.7 -- UNRELEASED
        sys:
         . New luksheaders option (default=disabled) to backup the Luks header
           of every Luks device.
+        . New lvm option (default=disabled) to backup LVM metadata for every
+          detected volume group.
 
 version 0.9.6 -- July 21, 2008
     backupninja changes
index a4bffc455eb152c2aa89c044e307089cb40a84d9..fe3464679310a33c686ee408dfc2f36af460d351 100644 (file)
@@ -31,6 +31,8 @@
 #     and restore it later by running "dd if=luksheader.sda2.bin of=/dev/sda2"
 #     (MAKE SURE YOU PASS THE CORRECT DEVICE AS of= !!!)
 #
+# (6) LVM metadata for every detected volume group, if "lvm = yes"
+#
 
 # here are the defaults, commented out:
 
@@ -61,6 +63,8 @@
 # the others being written to the same file, and then overwritten by the next.
 # luksheadersfile = /var/backups/luksheader.__star__.bin
 
+# lvm = no
+
 # If vservers = yes in /etc/backupninja.conf then the following variables can
 # be used:
 # vsnames = all | <vserver1> <vserver2> ... (default = all)
index 48841e85ab3e38df5a016013ef10d9fb92fdb085..c5892a9b037cb930eb02b907d622bc6342fc8b02 100644 (file)
@@ -9,7 +9,8 @@ sys_wizard() {
        "partitions" "the partition table of all disks." on  \
        "sfdisk" "use sfdisk to get partition information." on \
        "hardware" "detailed hardware information" on \
-       "luksheaders" "Luks headers of all Luks partitions." off
+       "luksheaders" "Luks headers of all Luks partitions." off \
+       "lvm" "LVM metadata for all volume groups." off
    [ $? = 1 ] && return;    
    result="$REPLY"
    packages="packages = no"
@@ -17,6 +18,7 @@ sys_wizard() {
    sfdisk="dosfdisk = no"
    hardware="hardware = no"
    luksheaders="luksheaders = no"
+   lvm="lvm = no"
    for opt in $result; do
       case $opt in
         '"packages"') packages="packages = yes";;
@@ -24,6 +26,7 @@ sys_wizard() {
         '"sfdisk"') sfdisk="dosfdisk = yes";;
         '"hardware"') hardware="hardware = yes";;
         '"luksheaders"') luksheaders="luksheaders = yes";;
+        '"lvm"') lvm="lvm = yes";;
       esac
    done
    get_next_filename $configdirectory/10.sys
@@ -33,6 +36,7 @@ $partitions
 $sfdisk
 $hardware
 $luksheaders
+$lvm
 
 # packagesfile = /var/backups/dpkg-selections.txt
 # selectionsfile = /var/backups/debconfsel.txt
index de81435463d01e4b44e2bdb051aaee483fab59cb..b7e94b0f9411faa15136e079f3bd52fdd2c9f4ac 100755 (executable)
@@ -30,6 +30,8 @@
 #     and restore it later by running "dd if=luksheader.sda2.bin of=/dev/sda2"
 #     (MAKE SURE YOU PASS THE CORRECT DEVICE AS of= !!!)
 #
+# (6) LVM metadata for every detected volume group, if "lvm = yes"
+#
 
 if [ -f /etc/debian_version ]
 then
@@ -93,6 +95,10 @@ getconf DD `which dd`
 getconf luksheaders no
 getconf luksheadersfile $parentdir/luksheader.__star__.bin
 
+getconf VGS `which vgs`
+getconf VGCFGBACKUP `which vgcfgbackup`
+getconf lvm no
+
 getconf vsnames all
 
 # If vservers are configured, check that the ones listed in $vsnames are running.
@@ -121,6 +127,17 @@ if [ "$luksheaders" == "yes" ]; then
    fi
 fi
 
+if [ "$lvm" == "yes" ]; then
+   if [ ! -x "$VGS" ]; then
+      warning "can't find vgs, skipping backup of LVM metadata"
+      lvm="no"
+   fi
+   if [ ! -x "$VGCFGBACKUP" ]; then
+      warning "can't find vgcfgbackup, skipping backup of LVM metadata"
+      lvm="no"
+   fi
+fi
+
 ## PACKAGES ##############################
 
 #
@@ -534,7 +551,6 @@ if [ "$hardware" == "yes" ]; then
    fi
 fi
 
-
 ## PARTITIONS #############################
 
 # here we use sfdisk to dump a listing of all the partitions. 
@@ -604,3 +620,60 @@ if [ "$luksheaders" == "yes" ]; then
       fi
    done
 fi
+
+## LVM ####################################
+
+# returns 0 on success, 1 on error, 2 if not tried
+# outputs error message if error, reason if not tried
+function doLvmBackup () {
+   local lvmdir="$1"
+   if [ ! -d "$lvmdir" ]; then
+      if ! mkdir "$lvmdir"; then
+         echo "could not create $lvmdir"
+         return 2
+      else
+         info "successfully created $lvmdir"
+      fi
+   fi
+   if [ ! -w "$lvmdir" ]; then
+         echo "can not write to directory $lvmdir"
+         return 2
+   fi
+   debug "Let's try to gather the list of LVM volume groups"
+   debug "$VGS --options vg_name --noheadings | @SED@ 's/^[ ]*//' | @SED@ 's/[ ]*$//' | tr '\n' ' '"
+   vgs=`$VGS --options vg_name --noheadings | @SED@ 's/^[ ]*//' | @SED@ 's/[ ]*$//' | tr '\n' ' '`
+   debug "Let's try to backup LVM metadata for detected volume groups: $vgs"
+   debug "$VGCFGBACKUP --file \"${lvmdir}\"/\'%s\' $vgs"
+   output=`$VGCFGBACKUP --file "${lvmdir}"/'%s' $vgs`
+   exit_code=$?
+   debug $output
+   case $exit_code in
+      0)
+         info "LVM metadata was saved to $lvmdir for volume groups: $vgs"
+         return 0
+         ;;
+      *)
+         echo "LVM metadata could not be saved for at least one of these volume groups: $vgs"
+         return 1
+         ;;
+   esac
+}
+
+if [ "$lvm" == "yes" ]; then
+   output=`doLvmBackup "${parentdir}/lvm"`
+   exit_code=$?
+   case $exit_code in
+      0) # success. info message has already been displayed
+         true
+         ;;
+      1) # error
+         fatal "$output"
+         ;;
+      2) # could not even try
+         fatal "LVM metadata backup was not tried: $output"
+         ;;
+      *) # should never happen
+         fatal "Unhandled error ($exit_code) while trying to backup LVM metadata, please report a bug"
+         ;;
+   esac
+fi