aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog2
-rw-r--r--examples/example.sys4
-rw-r--r--handlers/sys.helper.in6
-rwxr-xr-xhandlers/sys.in75
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 | <vserver1> <vserver2> ... (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