c9c2254b37
Migrate XFS configuration files. Resolves: rhbz2160748
130 lines
7.1 KiB
Diff
130 lines
7.1 KiB
Diff
diff --git a/usr/share/rear/layout/prepare/GNU/Linux/131_include_filesystem_code.sh b/usr/share/rear/layout/prepare/GNU/Linux/131_include_filesystem_code.sh
|
|
index 172ac032..9cff63a0 100644
|
|
--- a/usr/share/rear/layout/prepare/GNU/Linux/131_include_filesystem_code.sh
|
|
+++ b/usr/share/rear/layout/prepare/GNU/Linux/131_include_filesystem_code.sh
|
|
@@ -143,9 +143,9 @@ function create_fs () {
|
|
# unless the user has explicitly specified XFS filesystem options:
|
|
local xfs_opts
|
|
local xfs_device_basename="$( basename $device )"
|
|
- local xfs_info_filename="$LAYOUT_XFS_OPT_DIR/$xfs_device_basename.xfs"
|
|
+ local xfs_info_filename="$LAYOUT_XFS_OPT_DIR_RESTORE/$xfs_device_basename.xfs"
|
|
# Only uppercase letters and digits are used to ensure mkfs_xfs_options_variable_name is a valid bash variable name
|
|
- # even in case of complicated device nodes e.g. things like /dev/mapper/SIBM_2810XIV_78033E7012F-part3
|
|
+ # even in case of complicated device nodes e.g. things like /dev/mapper/SIBM_2810XIV_78033E7012F-part3
|
|
# cf. current_orig_device_basename_alnum_uppercase in layout/prepare/default/300_map_disks.sh
|
|
local xfs_device_basename_alnum_uppercase="$( echo $xfs_device_basename | tr -d -c '[:alnum:]' | tr '[:lower:]' '[:upper:]' )"
|
|
# cf. predefined_input_variable_name in the function UserInput in lib/_input-output-functions.sh
|
|
diff --git a/usr/share/rear/layout/prepare/default/010_prepare_files.sh b/usr/share/rear/layout/prepare/default/010_prepare_files.sh
|
|
index 85964712..7a980e63 100644
|
|
--- a/usr/share/rear/layout/prepare/default/010_prepare_files.sh
|
|
+++ b/usr/share/rear/layout/prepare/default/010_prepare_files.sh
|
|
@@ -5,6 +5,7 @@ LAYOUT_DEPS="$VAR_DIR/layout/diskdeps.conf"
|
|
LAYOUT_TODO="$VAR_DIR/layout/disktodo.conf"
|
|
LAYOUT_CODE="$VAR_DIR/layout/diskrestore.sh"
|
|
LAYOUT_XFS_OPT_DIR="$VAR_DIR/layout/xfs"
|
|
+LAYOUT_XFS_OPT_DIR_RESTORE="$LAYOUT_XFS_OPT_DIR/restore"
|
|
|
|
FS_UUID_MAP="$VAR_DIR/layout/fs_uuid_mapping"
|
|
LUN_WWID_MAP="$VAR_DIR/layout/lun_wwid_mapping"
|
|
diff --git a/usr/share/rear/layout/prepare/default/319_rename_xfs_configs.sh b/usr/share/rear/layout/prepare/default/319_rename_xfs_configs.sh
|
|
new file mode 100644
|
|
index 00000000..406afa61
|
|
--- /dev/null
|
|
+++ b/usr/share/rear/layout/prepare/default/319_rename_xfs_configs.sh
|
|
@@ -0,0 +1,83 @@
|
|
+# Cleanup directory which hold XFS configuration file for `rear recover'.
|
|
+# This will avoid possible mess in LAYOUT_XFS_OPT_DIR_RESTORE if `rear recover'
|
|
+# would be launched multiple times, where user will choose different disk
|
|
+# mapping each time.
|
|
+# Removing and creating LAYOUT_XFS_OPT_DIR_RESTORE will ensure that ReaR will
|
|
+# have only current files available during current session.
|
|
+rm -rf "$LAYOUT_XFS_OPT_DIR_RESTORE"
|
|
+mkdir -p "$LAYOUT_XFS_OPT_DIR_RESTORE"
|
|
+
|
|
+local excluded_configs=()
|
|
+
|
|
+# Read $MAPPING_FILE (disk_mappings) to discover final disk mapping.
|
|
+# Once mapping is known, configuration files can be renamed.
|
|
+# (e.g. sds2.xfs to sdb2.xfs, ...)
|
|
+while read source target junk ; do
|
|
+ # Disks in MAPPING_FILE are listed with full device path. Since XFS config
|
|
+ # files are created in format e.g. sda2.xfs strip prefixed path to have
|
|
+ # only short device name available.
|
|
+ base_source=$(basename "$source")
|
|
+ base_target=$(basename "$target")
|
|
+
|
|
+ # Check if XFS configuration file for whole device (unpartitioned)
|
|
+ # is available (sda, sdb, ...). If so, rename and copy it to
|
|
+ # LAYOUT_XFS_OPT_DIR_RESTORE.
|
|
+ if [ -e "$LAYOUT_XFS_OPT_DIR/$base_source.xfs" ]; then
|
|
+ Log "Migrating XFS configuration file $base_source.xfs to $base_target.xfs"
|
|
+ cp "$v" "$LAYOUT_XFS_OPT_DIR/$base_source.xfs" \
|
|
+ "$LAYOUT_XFS_OPT_DIR_RESTORE/$base_target.xfs"
|
|
+
|
|
+ # Replace old device name in meta-data= option in XFS
|
|
+ # configuration file as well.
|
|
+ sed -i s#"meta-data=${source}\(\s\)"#"meta-data=${target}\1"# \
|
|
+ "$LAYOUT_XFS_OPT_DIR_RESTORE/$base_target.xfs"
|
|
+
|
|
+ # Mark XFS config file as processed to avoid copying it again later.
|
|
+ # More details on why are configs excluded can be found near the
|
|
+ # end of this script (near `tar' command).
|
|
+ excluded_configs+=("--exclude=$base_source.xfs")
|
|
+ fi
|
|
+
|
|
+ # Find corresponding partitions to source disk in LAYOUT_FILE
|
|
+ # and migrate/rename them too if necessary.
|
|
+ while read _ layout_device _ _ _ _ layout_partition; do
|
|
+ if [[ "$source" = "$layout_device" ]]; then
|
|
+ base_src_layout_partition=$(basename "$layout_partition")
|
|
+ base_dst_layout_partition=${base_src_layout_partition//$base_source/$base_target}
|
|
+ dst_layout_partition=${layout_partition//$base_source/$base_target}
|
|
+
|
|
+ if [ -e "$LAYOUT_XFS_OPT_DIR/$base_src_layout_partition.xfs" ]; then
|
|
+ Log "Migrating XFS configuration $base_src_layout_partition.xfs to $base_dst_layout_partition.xfs"
|
|
+ cp "$v" "$LAYOUT_XFS_OPT_DIR/$base_src_layout_partition.xfs" \
|
|
+ "$LAYOUT_XFS_OPT_DIR_RESTORE/$base_dst_layout_partition.xfs"
|
|
+
|
|
+ # Replace old device name in meta-data= option in XFS
|
|
+ # configuration file as well.
|
|
+ sed -i s#"meta-data=${layout_partition}\(\s\)"#"meta-data=${dst_layout_partition}\1"# \
|
|
+ "$LAYOUT_XFS_OPT_DIR_RESTORE/$base_dst_layout_partition.xfs"
|
|
+
|
|
+ # Mark XFS config file as processed to avoid copying it again later.
|
|
+ # More details on why are configs excluded can be found near the
|
|
+ # end of this script (near `tar' command).
|
|
+ excluded_configs+=("--exclude=$base_src_layout_partition.xfs")
|
|
+ fi
|
|
+ fi
|
|
+ done < <( grep -E "^part " "$LAYOUT_FILE" )
|
|
+done < <( grep -v '^#' "$MAPPING_FILE" )
|
|
+
|
|
+pushd "$LAYOUT_XFS_OPT_DIR" >/dev/null
|
|
+# Copy remaining files
|
|
+# We need to copy remaining files into LAYOUT_XFS_OPT_DIR_RESTORE which will
|
|
+# serve as base dictionary where ReaR will look for XFS config files.
|
|
+# It is necessary to copy only files that were not previously processed,
|
|
+# because in LAYOUT_XFS_OPT_DIR they are still listed with
|
|
+# original name and copy to LAYOUT_XFS_OPT_DIR_RESTORE could overwrite
|
|
+# XFS configs already migrated.
|
|
+# e.g. with following disk mapping situation:
|
|
+# /dev/sda2 => /dev/sdb2
|
|
+# /dev/sdb2 => /dev/sda2
|
|
+# Files in LAYOUT_XFS_OPT_DIR_RESTORE would be overwritten by XFS configs with
|
|
+# wrong names.
|
|
+# tar is used to take advantage of its exclude feature.
|
|
+tar cf - --exclude=restore "${excluded_configs[@]}" . | tar xfp - -C "$LAYOUT_XFS_OPT_DIR_RESTORE"
|
|
+popd >/dev/null
|
|
diff --git a/usr/share/rear/layout/save/GNU/Linux/100_create_layout_file.sh b/usr/share/rear/layout/save/GNU/Linux/100_create_layout_file.sh
|
|
index 7895e4ee..fc0fa8fc 100644
|
|
--- a/usr/share/rear/layout/save/GNU/Linux/100_create_layout_file.sh
|
|
+++ b/usr/share/rear/layout/save/GNU/Linux/100_create_layout_file.sh
|
|
@@ -10,6 +10,7 @@ mkdir -p $v $VAR_DIR/layout/config
|
|
# We need directory for XFS options only if XFS is in use:
|
|
if test "$( mount -t xfs )" ; then
|
|
LAYOUT_XFS_OPT_DIR="$VAR_DIR/layout/xfs"
|
|
+ rm -rf $LAYOUT_XFS_OPT_DIR
|
|
mkdir -p $v $LAYOUT_XFS_OPT_DIR
|
|
fi
|
|
|