113 lines
4.5 KiB
Diff
113 lines
4.5 KiB
Diff
diff --git a/usr/share/rear/layout/prepare/GNU/Linux/110_include_lvm_code.sh b/usr/share/rear/layout/prepare/GNU/Linux/110_include_lvm_code.sh
|
|
index 7cfdfcf2..1be17ba8 100644
|
|
--- a/usr/share/rear/layout/prepare/GNU/Linux/110_include_lvm_code.sh
|
|
+++ b/usr/share/rear/layout/prepare/GNU/Linux/110_include_lvm_code.sh
|
|
@@ -68,9 +68,9 @@ create_lvmgrp() {
|
|
local vg=${vgrp#/dev/}
|
|
|
|
cat >> "$LAYOUT_CODE" <<EOF
|
|
-create_volume_group=1
|
|
-create_logical_volumes=1
|
|
-create_thin_volumes_only=0
|
|
+create_volume_group+=( "$vg" )
|
|
+create_logical_volumes+=( "$vg" )
|
|
+create_thin_volumes_only=( \$( RmInArray "$vg" "\${create_thin_volumes_only[@]}" ) )
|
|
|
|
EOF
|
|
|
|
@@ -83,7 +83,7 @@ EOF
|
|
# '--mirrorlog', etc.
|
|
# Also, we likely do not support every layout yet (e.g. 'cachepool').
|
|
|
|
- if ! is_true "$MIGRATION_MODE" ; then
|
|
+ if ! is_true "$MIGRATION_MODE" && lvmgrp_supports_vgcfgrestore "$vgrp" ; then
|
|
cat >> "$LAYOUT_CODE" <<EOF
|
|
LogPrint "Restoring LVM VG '$vg'"
|
|
if [ -e "$vgrp" ] ; then
|
|
@@ -97,9 +97,12 @@ if lvm vgcfgrestore -f "$VAR_DIR/layout/lvm/${vg}.cfg" $vg >&2 ; then
|
|
|
|
LogPrint "Sleeping 3 seconds to let udev or systemd-udevd create their devices..."
|
|
sleep 3 >&2
|
|
- create_volume_group=0
|
|
- create_logical_volumes=0
|
|
+ create_volume_group=( \$( RmInArray "$vg" "\${create_volume_group[@]}" ) )
|
|
+ create_logical_volumes=( \$( RmInArray "$vg" "\${create_logical_volumes[@]}" ) )
|
|
|
|
+EOF
|
|
+ if is_true "${FORCE_VGCFGRESTORE-no}"; then
|
|
+ cat >> "$LAYOUT_CODE" <<EOF
|
|
#
|
|
# It failed ... restore layout using 'vgcfgrestore --force', but then remove Thin volumes, they are broken
|
|
#
|
|
@@ -121,9 +124,12 @@ elif lvm vgcfgrestore --force -f "$VAR_DIR/layout/lvm/${vg}.cfg" $vg >&2 ; then
|
|
sleep 3 >&2
|
|
|
|
# All logical volumes have been created, except Thin volumes and pools
|
|
- create_volume_group=0
|
|
- create_thin_volumes_only=1
|
|
+ create_volume_group=( \$( RmInArray "$vg" "\${create_volume_group[@]}" ) )
|
|
+ create_thin_volumes_only+=( "$vg" )
|
|
|
|
+EOF
|
|
+ fi
|
|
+ cat >> "$LAYOUT_CODE" <<EOF
|
|
#
|
|
# It failed also ... restore using 'vgcreate/lvcreate' commands
|
|
#
|
|
@@ -138,7 +144,7 @@ EOF
|
|
local -a devices=($(awk "\$1 == \"lvmdev\" && \$2 == \"$vgrp\" { print \$3 }" "$LAYOUT_FILE"))
|
|
|
|
cat >> "$LAYOUT_CODE" <<EOF
|
|
-if [ \$create_volume_group -eq 1 ] ; then
|
|
+if IsInArray $vg "\${create_volume_group[@]}" ; then
|
|
LogPrint "Creating LVM VG '$vg'; Warning: some properties may not be preserved..."
|
|
if [ -e "$vgrp" ] ; then
|
|
rm -rf "$vgrp"
|
|
@@ -240,9 +246,9 @@ create_lvmvol() {
|
|
local warnraidline
|
|
|
|
if [ $is_thin -eq 0 ] ; then
|
|
- ifline="if [ \"\$create_logical_volumes\" -eq 1 ] && [ \"\$create_thin_volumes_only\" -eq 0 ] ; then"
|
|
+ ifline="if IsInArray $vg \"\${create_logical_volumes[@]}\" && ! \$IsInArray $vg \"\${create_thin_volumes_only[@]}\" ; then"
|
|
else
|
|
- ifline="if [ \"\$create_logical_volumes\" -eq 1 ] ; then"
|
|
+ ifline="if IsInArray $vg \"\${create_logical_volumes[@]}\" ; then"
|
|
fi
|
|
|
|
if [ $is_raidunknown -eq 1 ]; then
|
|
diff --git a/usr/share/rear/lib/layout-functions.sh b/usr/share/rear/lib/layout-functions.sh
|
|
index 54ddb50f..ae62d666 100644
|
|
--- a/usr/share/rear/lib/layout-functions.sh
|
|
+++ b/usr/share/rear/lib/layout-functions.sh
|
|
@@ -1308,4 +1308,30 @@ delete_dummy_partitions_and_resize_real_ones() {
|
|
last_partition_number=0
|
|
}
|
|
|
|
+# vgcfgrestore can properly restore only volume groups that do not use
|
|
+# any kernel metadata. All volume types except linear and striped use
|
|
+# kernel metadata.
|
|
+# Check whether a VG (given as /dev/<vgname> in the first argument)
|
|
+# doesn't contain any LVs that use kernel metadata.
|
|
+# If the function returns true, we can safely use vgcfgrestore to restore the VG.
|
|
+function lvmgrp_supports_vgcfgrestore() {
|
|
+ if is_true "${FORCE_VGCFGRESTORE-no}"; then
|
|
+ # If we are willing to use vgcfgrestore --force and then remove broken volumes,
|
|
+ # then everything can be considered supported. Don't do it by default though.
|
|
+ return 0
|
|
+ fi
|
|
+
|
|
+ local lvmvol vgrp lvname size layout kval
|
|
+
|
|
+ local supported_layouts=("linear" "striped")
|
|
+
|
|
+ while read lvmvol vgrp lvname size layout kval; do
|
|
+ [ "$vgrp" == "$1" ] || BugError "vgrp '$vgrp' != '$1'"
|
|
+ if ! IsInArray $layout "${supported_layouts[@]}"; then
|
|
+ LogPrint "Layout '$layout' of LV '$lvname' in VG '$vgrp' not supported by vgcfgrestore"
|
|
+ return 1
|
|
+ fi
|
|
+ done < <(grep "^lvmvol $1 " "$LAYOUT_FILE")
|
|
+}
|
|
+
|
|
# vim: set et ts=4 sw=4:
|