From 772af74c802c253d99c86eb7f9b40ced9faf47a9 Mon Sep 17 00:00:00 2001 From: intrigeri Date: Thu, 22 Jan 2009 22:15:13 +0000 Subject: sys: new lvm option to backup LVM metadata of every detected volume group --- ChangeLog | 2 ++ examples/example.sys | 4 +++ handlers/sys.helper.in | 6 +++- handlers/sys.in | 75 +++++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 85 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index c5208b3..9ab2c9d 100644 --- 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 diff --git a/examples/example.sys b/examples/example.sys index a4bffc4..fe34646 100644 --- a/examples/example.sys +++ b/examples/example.sys @@ -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 | ... (default = all) diff --git a/handlers/sys.helper.in b/handlers/sys.helper.in index 48841e8..c5892a9 100644 --- a/handlers/sys.helper.in +++ b/handlers/sys.helper.in @@ -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 diff --git a/handlers/sys.in b/handlers/sys.in index de81435..b7e94b0 100755 --- a/handlers/sys.in +++ b/handlers/sys.in @@ -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 -- cgit v1.2.3