Compare commits
No commits in common. 'c9' and 'i10c-beta' have entirely different histories.
@ -1 +1 @@
|
||||
SOURCES/rear-2.6.tar.gz
|
||||
SOURCES/rear-2.7-clean.tar.gz
|
||||
|
@ -1 +1 @@
|
||||
13c23ad59254438ffcd0cde6400fd991cbfe194e SOURCES/rear-2.6.tar.gz
|
||||
b6bcabf45fc7855bfb23caf150c654e0d81d5beb SOURCES/rear-2.7-clean.tar.gz
|
||||
|
@ -1,47 +0,0 @@
|
||||
From df5e18b8d7c8359b48bc133bfa29734934d18160 Mon Sep 17 00:00:00 2001
|
||||
From: Johannes Meixner <jsmeix@suse.com>
|
||||
Date: Mon, 10 Aug 2020 16:20:38 +0200
|
||||
Subject: [PATCH] Merge pull request #2469 from
|
||||
rear/skip-kernel-builtin-modules-issue2414
|
||||
|
||||
In 400_copy_modules.sh skip copying kernel modules that are builtin modules.
|
||||
The new behaviour is that when modules are listed in modules.builtin
|
||||
and are also shown by modinfo then those modules are now skipped.
|
||||
Before for such modules the modules file(s) would have been included
|
||||
in the recovery system.
|
||||
See https://github.com/rear/rear/issues/2414
|
||||
---
|
||||
usr/share/rear/build/GNU/Linux/400_copy_modules.sh | 12 ++++++++++--
|
||||
1 file changed, 10 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/usr/share/rear/build/GNU/Linux/400_copy_modules.sh b/usr/share/rear/build/GNU/Linux/400_copy_modules.sh
|
||||
index d8d733d2..641b7f83 100644
|
||||
--- a/usr/share/rear/build/GNU/Linux/400_copy_modules.sh
|
||||
+++ b/usr/share/rear/build/GNU/Linux/400_copy_modules.sh
|
||||
@@ -133,8 +133,13 @@ for dummy in "once" ; do
|
||||
module=${module#.o}
|
||||
# Strip trailing ".ko" if there:
|
||||
module=${module#.ko}
|
||||
- # Continue with the next module if the current one does not exist:
|
||||
+ # Continue with the next module if the current one does not exist as a module file:
|
||||
modinfo $module 1>/dev/null || continue
|
||||
+ # Continue with the next module if the current one is a kernel builtin module
|
||||
+ # cf. https://github.com/rear/rear/issues/2414#issuecomment-668632798
|
||||
+ # Quoting the grep search value is mandatory here ($module might be empty or blank),
|
||||
+ # cf. "Beware of the emptiness" in https://github.com/rear/rear/wiki/Coding-Style
|
||||
+ grep -q "$( echo $module | tr '_-' '..' )" /lib/modules/$KERNEL_VERSION/modules.builtin && continue
|
||||
# Resolve module dependencies:
|
||||
# Get the module file plus the module files of other needed modules.
|
||||
# This is currently only a "best effort" attempt because
|
||||
@@ -166,7 +171,10 @@ done
|
||||
|
||||
# Remove those modules that are specified in the EXCLUDE_MODULES array:
|
||||
for exclude_module in "${EXCLUDE_MODULES[@]}" ; do
|
||||
- # Continue with the next module if the current one does not exist:
|
||||
+ # Continue with the next module only if the current one does not exist as a module file
|
||||
+ # but do not continue with the next module if the current one is a kernel builtin module
|
||||
+ # so when a module file exists that gets removed regardless if it is also a builtin module
|
||||
+ # cf. https://github.com/rear/rear/issues/2414#issuecomment-669115481
|
||||
modinfo $exclude_module 1>/dev/null || continue
|
||||
# In this case it is ignored when a module exists but 'modinfo -F filename' cannot show its filename
|
||||
# because then it is assumed that also no module file had been copied above:
|
@ -0,0 +1,3 @@
|
||||
rear-%-clean.tar.gz: rear-%.tar.gz
|
||||
set -o pipefail; gunzip -c $< | tar --delete "rear-"$*"/doc/rear-release-notes.txt" -f - | gzip -c - > $@.tmp
|
||||
mv $@.tmp $@
|
@ -1,351 +0,0 @@
|
||||
diff --git a/doc/user-guide/06-layout-configuration.adoc b/doc/user-guide/06-layout-configuration.adoc
|
||||
index f59384db..88ba0420 100644
|
||||
--- a/doc/user-guide/06-layout-configuration.adoc
|
||||
+++ b/doc/user-guide/06-layout-configuration.adoc
|
||||
@@ -630,7 +630,7 @@ lvmvol <volume_group> <name> <size(bytes)> <layout> [key:value ...]
|
||||
|
||||
=== LUKS Devices ===
|
||||
----------------------------------
|
||||
-crypt /dev/mapper/<name> <device> [cipher=<cipher>] [key_size=<key size>] [hash=<hash function>] [uuid=<uuid>] [keyfile=<keyfile>] [password=<password>]
|
||||
+crypt /dev/mapper/<name> <device> [type=<type>] [cipher=<cipher>] [key_size=<key size>] [hash=<hash function>] [uuid=<uuid>] [keyfile=<keyfile>] [password=<password>]
|
||||
----------------------------------
|
||||
|
||||
=== DRBD ===
|
||||
diff --git a/usr/share/rear/layout/prepare/GNU/Linux/160_include_luks_code.sh b/usr/share/rear/layout/prepare/GNU/Linux/160_include_luks_code.sh
|
||||
index 05279bc8..0c662f67 100644
|
||||
--- a/usr/share/rear/layout/prepare/GNU/Linux/160_include_luks_code.sh
|
||||
+++ b/usr/share/rear/layout/prepare/GNU/Linux/160_include_luks_code.sh
|
||||
@@ -1,35 +1,75 @@
|
||||
+
|
||||
# Code to recreate and/or open LUKS volumes.
|
||||
|
||||
create_crypt() {
|
||||
+ # See the create_device() function in lib/layout-functions.sh what "device type" means:
|
||||
+ local device_type="$1"
|
||||
+ if ! grep -q "^crypt $device_type " "$LAYOUT_FILE" ; then
|
||||
+ LogPrintError "Skip recreating LUKS volume $device_type (no 'crypt $device_type' entry in $LAYOUT_FILE)"
|
||||
+ # FIXME: The return code is ignored in the create_device() function in lib/layout-functions.sh:
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
local crypt target_device source_device options
|
||||
- read crypt target_device source_device options < <(grep "^crypt $1 " "$LAYOUT_FILE")
|
||||
+ local mapping_name option key value
|
||||
+ local cryptsetup_options="" keyfile="" password=""
|
||||
|
||||
- local target_name=${target_device#/dev/mapper/}
|
||||
+ read crypt target_device source_device options < <( grep "^crypt $device_type " "$LAYOUT_FILE" )
|
||||
+
|
||||
+ # Careful! One cannot 'test -b $source_device' here at the time when this code is run
|
||||
+ # because the source device is usually a disk partition block device like /dev/sda2
|
||||
+ # but disk partition block devices usually do not yet exist (in particular not on a new clean disk)
|
||||
+ # because partitions are actually created later when the diskrestore.sh script is run
|
||||
+ # but not here when this code is run which only generates the diskrestore.sh script:
|
||||
+ if ! test $source_device ; then
|
||||
+ LogPrintError "Skip recreating LUKS volume $device_type: No source device (see the 'crypt $device_type' entry in $LAYOUT_FILE)"
|
||||
+ # FIXME: The return code is ignored in the create_device() function in lib/layout-functions.sh:
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ mapping_name=${target_device#/dev/mapper/}
|
||||
+ if ! test $mapping_name ; then
|
||||
+ LogPrintError "Skip recreating LUKS volume $device_type on $source_device: No /dev/mapper/... mapping name (see the 'crypt $device_type' entry in $LAYOUT_FILE)"
|
||||
+ # FIXME: The return code is ignored in the create_device() function in lib/layout-functions.sh:
|
||||
+ return 1
|
||||
+ fi
|
||||
|
||||
- local cryptsetup_options="" keyfile="" password=""
|
||||
- local option key value
|
||||
for option in $options ; do
|
||||
- key=${option%=*}
|
||||
+ # $option is of the form keyword=value and
|
||||
+ # we assume keyword has no '=' character but value could be anything that may have a '=' character
|
||||
+ # so we split keyword=value at the leftmost '=' character so that
|
||||
+ # e.g. keyword=foo=bar gets split into key="keyword" and value="foo=bar":
|
||||
+ key=${option%%=*}
|
||||
value=${option#*=}
|
||||
-
|
||||
+ # The "cryptseup luksFormat" command does not require any of the type, cipher, key-size, hash, uuid option values
|
||||
+ # because if omitted a cryptseup default value is used so we treat those values as optional.
|
||||
+ # Using plain test to ensure the value is a single non empty and non blank word
|
||||
+ # without quoting because test " " would return zero exit code
|
||||
+ # cf. "Beware of the emptiness" in https://github.com/rear/rear/wiki/Coding-Style
|
||||
case "$key" in
|
||||
- cipher)
|
||||
- cryptsetup_options+=" --cipher $value"
|
||||
+ (type)
|
||||
+ test $value && cryptsetup_options+=" --type $value"
|
||||
+ ;;
|
||||
+ (cipher)
|
||||
+ test $value && cryptsetup_options+=" --cipher $value"
|
||||
+ ;;
|
||||
+ (key_size)
|
||||
+ test $value && cryptsetup_options+=" --key-size $value"
|
||||
;;
|
||||
- key_size)
|
||||
- cryptsetup_options+=" --key-size $value"
|
||||
+ (hash)
|
||||
+ test $value && cryptsetup_options+=" --hash $value"
|
||||
;;
|
||||
- hash)
|
||||
- cryptsetup_options+=" --hash $value"
|
||||
+ (uuid)
|
||||
+ test $value && cryptsetup_options+=" --uuid $value"
|
||||
;;
|
||||
- uuid)
|
||||
- cryptsetup_options+=" --uuid $value"
|
||||
+ (keyfile)
|
||||
+ test $value && keyfile=$value
|
||||
;;
|
||||
- keyfile)
|
||||
- keyfile=$value
|
||||
+ (password)
|
||||
+ test $value && password=$value
|
||||
;;
|
||||
- password)
|
||||
- password=$value
|
||||
+ (*)
|
||||
+ LogPrintError "Skipping unsupported LUKS cryptsetup option '$key' in 'crypt $target_device $source_device' entry in $LAYOUT_FILE"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
@@ -37,26 +77,25 @@ create_crypt() {
|
||||
cryptsetup_options+=" $LUKS_CRYPTSETUP_OPTIONS"
|
||||
|
||||
(
|
||||
- echo "Log \"Creating LUKS device $target_name on $source_device\""
|
||||
+ echo "LogPrint \"Creating LUKS volume $mapping_name on $source_device\""
|
||||
if [ -n "$keyfile" ] ; then
|
||||
# Assign a temporary keyfile at this stage so that original keyfiles do not leak onto the rescue medium.
|
||||
# The original keyfile will be restored from the backup and then re-assigned to the LUKS device in the
|
||||
# 'finalize' stage.
|
||||
# The scheme for generating a temporary keyfile path must be the same here and in the 'finalize' stage.
|
||||
- keyfile="${TMPDIR:-/tmp}/LUKS-keyfile-$target_name"
|
||||
+ keyfile="$TMP_DIR/LUKS-keyfile-$mapping_name"
|
||||
dd bs=512 count=4 if=/dev/urandom of="$keyfile"
|
||||
chmod u=rw,go=- "$keyfile"
|
||||
-
|
||||
echo "cryptsetup luksFormat --batch-mode $cryptsetup_options $source_device $keyfile"
|
||||
- echo "cryptsetup luksOpen --key-file $keyfile $source_device $target_name"
|
||||
+ echo "cryptsetup luksOpen --key-file $keyfile $source_device $mapping_name"
|
||||
elif [ -n "$password" ] ; then
|
||||
echo "echo \"$password\" | cryptsetup luksFormat --batch-mode $cryptsetup_options $source_device"
|
||||
- echo "echo \"$password\" | cryptsetup luksOpen $source_device $target_name"
|
||||
+ echo "echo \"$password\" | cryptsetup luksOpen $source_device $mapping_name"
|
||||
else
|
||||
- echo "LogPrint \"Please enter the password for LUKS device $target_name ($source_device):\""
|
||||
+ echo "LogUserOutput \"Set the password for LUKS volume $mapping_name (for 'cryptsetup luksFormat' on $source_device):\""
|
||||
echo "cryptsetup luksFormat --batch-mode $cryptsetup_options $source_device"
|
||||
- echo "LogPrint \"Please re-enter the password for LUKS device $target_name ($source_device):\""
|
||||
- echo "cryptsetup luksOpen $source_device $target_name"
|
||||
+ echo "LogUserOutput \"Enter the password for LUKS volume $mapping_name (for 'cryptsetup luksOpen' on $source_device):\""
|
||||
+ echo "cryptsetup luksOpen $source_device $mapping_name"
|
||||
fi
|
||||
echo ""
|
||||
) >> "$LAYOUT_CODE"
|
||||
@@ -64,38 +103,61 @@ create_crypt() {
|
||||
|
||||
# Function open_crypt() is meant to be used by the 'mountonly' workflow
|
||||
open_crypt() {
|
||||
+ # See the do_mount_device() function in lib/layout-functions.sh what "device type" means:
|
||||
+ local device_type="$1"
|
||||
+ if ! grep -q "^crypt $device_type " "$LAYOUT_FILE" ; then
|
||||
+ LogPrintError "Skip opening LUKS volume $device_type (no 'crypt $device_type' entry in $LAYOUT_FILE)"
|
||||
+ # FIXME: The return code is ignored in the do_mount_device() function in lib/layout-functions.sh:
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
local crypt target_device source_device options
|
||||
- read crypt target_device source_device options < <(grep "^crypt $1 " "$LAYOUT_FILE")
|
||||
+ local mapping_name option key value
|
||||
+ local cryptsetup_options="" keyfile="" password=""
|
||||
|
||||
- local target_name=${target_device#/dev/mapper/}
|
||||
+ read crypt target_device source_device options < <( grep "^crypt $device_type " "$LAYOUT_FILE" )
|
||||
+
|
||||
+ if ! test -b "$source_device" ; then
|
||||
+ LogPrintError "Skip opening LUKS volume $device_type on device '$source_device' that is no block device (see the 'crypt $device_type' entry in $LAYOUT_FILE)"
|
||||
+ # FIXME: The return code is ignored in the do_mount_device() function in lib/layout-functions.sh:
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ mapping_name=${target_device#/dev/mapper/}
|
||||
+ if ! test $mapping_name ; then
|
||||
+ LogPrintError "Skip opening LUKS volume $device_type on $source_device: No /dev/mapper/... mapping name (see the 'crypt $device_type' entry in $LAYOUT_FILE)"
|
||||
+ # FIXME: The return code is ignored in the do_mount_device() function in lib/layout-functions.sh:
|
||||
+ return 1
|
||||
+ fi
|
||||
|
||||
- local cryptsetup_options="" keyfile="" password=""
|
||||
- local option key value
|
||||
for option in $options ; do
|
||||
- key=${option%=*}
|
||||
+ # $option is of the form keyword=value and
|
||||
+ # we assume keyword has no '=' character but value could be anything that may have a '=' character
|
||||
+ # so we split keyword=value at the leftmost '=' character so that
|
||||
+ # e.g. keyword=foo=bar gets split into key="keyword" and value="foo=bar":
|
||||
+ key=${option%%=*}
|
||||
value=${option#*=}
|
||||
-
|
||||
case "$key" in
|
||||
- keyfile)
|
||||
- keyfile=$value
|
||||
+ (keyfile)
|
||||
+ test $value && keyfile=$value
|
||||
;;
|
||||
- password)
|
||||
- password=$value
|
||||
+ (password)
|
||||
+ test $value && password=$value
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
(
|
||||
- echo "Log \"Opening LUKS device $target_name on $source_device\""
|
||||
+ echo "LogPrint \"Opening LUKS volume $mapping_name on $source_device\""
|
||||
if [ -n "$keyfile" ] ; then
|
||||
# During a 'mountonly' workflow, the original keyfile is supposed to be
|
||||
# available at this point.
|
||||
- echo "cryptsetup luksOpen --key-file $keyfile $source_device $target_name"
|
||||
+ echo "cryptsetup luksOpen --key-file $keyfile $source_device $mapping_name"
|
||||
elif [ -n "$password" ] ; then
|
||||
- echo "echo \"$password\" | cryptsetup luksOpen $source_device $target_name"
|
||||
+ echo "echo \"$password\" | cryptsetup luksOpen $source_device $mapping_name"
|
||||
else
|
||||
- echo "LogPrint \"Please enter the password for LUKS device $target_name ($source_device):\""
|
||||
- echo "cryptsetup luksOpen $source_device $target_name"
|
||||
+ echo "LogUserOutput \"Enter the password for LUKS volume $mapping_name (for 'cryptsetup luksOpen' on $source_device):\""
|
||||
+ echo "cryptsetup luksOpen $source_device $mapping_name"
|
||||
fi
|
||||
echo ""
|
||||
) >> "$LAYOUT_CODE"
|
||||
diff --git a/usr/share/rear/layout/save/GNU/Linux/260_crypt_layout.sh b/usr/share/rear/layout/save/GNU/Linux/260_crypt_layout.sh
|
||||
index c1e1cfd5..afeabf6a 100644
|
||||
--- a/usr/share/rear/layout/save/GNU/Linux/260_crypt_layout.sh
|
||||
+++ b/usr/share/rear/layout/save/GNU/Linux/260_crypt_layout.sh
|
||||
@@ -9,6 +9,8 @@ Log "Saving Encrypted volumes."
|
||||
REQUIRED_PROGS+=( cryptsetup dmsetup )
|
||||
COPY_AS_IS+=( /usr/share/cracklib/\* /etc/security/pwquality.conf )
|
||||
|
||||
+local invalid_cryptsetup_option_value="no"
|
||||
+
|
||||
while read target_name junk ; do
|
||||
# find the target device we're mapping
|
||||
if ! [ -e /dev/mapper/$target_name ] ; then
|
||||
@@ -30,29 +32,96 @@ while read target_name junk ; do
|
||||
source_device="$(get_device_name ${slave##*/})"
|
||||
done
|
||||
|
||||
- if ! cryptsetup isLuks $source_device >/dev/null 2>&1; then
|
||||
+ if ! blkid -p -o export $source_device >$TMP_DIR/blkid.output ; then
|
||||
+ LogPrintError "Error: Cannot get attributes for $target_name ('blkid -p -o export $source_device' failed)"
|
||||
continue
|
||||
fi
|
||||
|
||||
- # gather crypt information
|
||||
- cipher=$(cryptsetup luksDump $source_device | grep "Cipher name" | sed -r 's/^.+:\s*(.+)$/\1/')
|
||||
- mode=$(cryptsetup luksDump $source_device | grep "Cipher mode" | cut -d: -f2- | awk '{printf("%s",$1)};')
|
||||
- key_size=$(cryptsetup luksDump $source_device | grep "MK bits" | sed -r 's/^.+:\s*(.+)$/\1/')
|
||||
- hash=$(cryptsetup luksDump $source_device | grep "Hash spec" | sed -r 's/^.+:\s*(.+)$/\1/')
|
||||
- uuid=$(cryptsetup luksDump $source_device | grep "UUID" | sed -r 's/^.+:\s*(.+)$/\1/')
|
||||
- keyfile_option=$([ -f /etc/crypttab ] && awk '$1 == "'"$target_name"'" && $3 != "none" && $3 != "-" && $3 != "" { print "keyfile=" $3; }' /etc/crypttab)
|
||||
+ if ! grep -q "TYPE=crypto_LUKS" $TMP_DIR/blkid.output ; then
|
||||
+ Log "Skipping $target_name (no 'TYPE=crypto_LUKS' in 'blkid -p -o export $source_device' output)"
|
||||
+ continue
|
||||
+ fi
|
||||
|
||||
- # LUKS version 2 is not yet suppported, see https://github.com/rear/rear/issues/2204
|
||||
- # When LUKS version 2 is used the above code fails at least to determine the hash value
|
||||
- # so we use an empty hash value as a simple test if gathering crypt information was successful:
|
||||
- test "$hash" || Error "No hash value for LUKS device '$target_name' at '$source_device' (only LUKS version 1 is supported)"
|
||||
+ # Detect LUKS version:
|
||||
+ # Remove all non-digits in particular to avoid leading or trailing spaces in the version string
|
||||
+ # cf. "Beware of the emptiness" in https://github.com/rear/rear/wiki/Coding-Style
|
||||
+ # that could happen if the blkid output contains "VERSION = 2" so that 'cut -d= -f2' results " 2".
|
||||
+ version=$( grep "VERSION" $TMP_DIR/blkid.output | cut -d= -f2 | tr -c -d '[:digit:]' )
|
||||
+ if ! test "$version" = "1" -o "$version" = "2" ; then
|
||||
+ LogPrintError "Error: Unsupported LUKS version for $target_name ('blkid -p -o export $source_device' shows 'VERSION=$version')"
|
||||
+ continue
|
||||
+ fi
|
||||
+ luks_type=luks$version
|
||||
|
||||
- echo "crypt /dev/mapper/$target_name $source_device cipher=$cipher-$mode key_size=$key_size hash=$hash uuid=$uuid $keyfile_option" >> $DISKLAYOUT_FILE
|
||||
-done < <( dmsetup ls --target crypt )
|
||||
+ # Gather crypt information:
|
||||
+ if ! cryptsetup luksDump $source_device >$TMP_DIR/cryptsetup.luksDump ; then
|
||||
+ LogPrintError "Error: Cannot get LUKS$version values for $target_name ('cryptsetup luksDump $source_device' failed)"
|
||||
+ continue
|
||||
+ fi
|
||||
+ uuid=$( grep "UUID" $TMP_DIR/cryptsetup.luksDump | sed -r 's/^.+:\s*(.+)$/\1/' )
|
||||
+ keyfile_option=$( [ -f /etc/crypttab ] && awk '$1 == "'"$target_name"'" && $3 != "none" && $3 != "-" && $3 != "" { print "keyfile=" $3; }' /etc/crypttab )
|
||||
+ if test $luks_type = "luks1" ; then
|
||||
+ cipher_name=$( grep "Cipher name" $TMP_DIR/cryptsetup.luksDump | sed -r 's/^.+:\s*(.+)$/\1/' )
|
||||
+ cipher_mode=$( grep "Cipher mode" $TMP_DIR/cryptsetup.luksDump | cut -d: -f2- | awk '{printf("%s",$1)};' )
|
||||
+ cipher=$cipher_name-$cipher_mode
|
||||
+ key_size=$( grep "MK bits" $TMP_DIR/cryptsetup.luksDump | sed -r 's/^.+:\s*(.+)$/\1/' )
|
||||
+ hash=$( grep "Hash spec" $TMP_DIR/cryptsetup.luksDump | sed -r 's/^.+:\s*(.+)$/\1/' )
|
||||
+ elif test $luks_type = "luks2" ; then
|
||||
+ cipher=$( grep "cipher:" $TMP_DIR/cryptsetup.luksDump | sed -r 's/^.+:\s*(.+)$/\1/' )
|
||||
+ # More than one keyslot may be defined - use key_size from the first slot.
|
||||
+ # Depending on the version the "cryptsetup luksDump" command outputs the key_size value
|
||||
+ # as a line like
|
||||
+ # Key: 512 bits
|
||||
+ # and/or as a line like
|
||||
+ # Cipher key: 512 bits
|
||||
+ # cf. https://github.com/rear/rear/pull/2504#issuecomment-718729198 and subsequent comments
|
||||
+ # so we grep for both lines but use only the first match from the first slot:
|
||||
+ key_size=$( egrep -m 1 "Key:|Cipher key:" $TMP_DIR/cryptsetup.luksDump | sed -r 's/^.+:\s*(.+) bits$/\1/' )
|
||||
+ hash=$( grep "Hash" $TMP_DIR/cryptsetup.luksDump | sed -r 's/^.+:\s*(.+)$/\1/' )
|
||||
+ fi
|
||||
|
||||
-# cryptsetup is required in the recovery system if disklayout.conf contains at least one 'crypt' entry
|
||||
-# see the create_crypt function in layout/prepare/GNU/Linux/160_include_luks_code.sh
|
||||
-# what program calls are written to diskrestore.sh
|
||||
-# cf. https://github.com/rear/rear/issues/1963
|
||||
-grep -q '^crypt ' $DISKLAYOUT_FILE && REQUIRED_PROGS+=( cryptsetup ) || true
|
||||
+ # Basic checks that the cipher key_size hash uuid values exist
|
||||
+ # cf. https://github.com/rear/rear/pull/2504#issuecomment-718729198
|
||||
+ # because some values are needed during "rear recover"
|
||||
+ # to set cryptsetup options in layout/prepare/GNU/Linux/160_include_luks_code.sh
|
||||
+ # and it seems cryptsetup fails when options with empty values are specified
|
||||
+ # cf. https://github.com/rear/rear/pull/2504#issuecomment-719479724
|
||||
+ # For example a LUKS1 crypt entry in disklayout.conf looks like
|
||||
+ # crypt /dev/mapper/luks1test /dev/sda7 type=luks1 cipher=aes-xts-plain64 key_size=256 hash=sha256 uuid=1b4198c9-d9b0-4c57-b9a3-3433e391e706
|
||||
+ # and a LUKS1 crypt entry in disklayout.conf looks like
|
||||
+ # crypt /dev/mapper/luks2test /dev/sda8 type=luks2 cipher=aes-xts-plain64 key_size=256 hash=sha256 uuid=3e874a28-7415-4f8c-9757-b3f28a96c4d2
|
||||
+ # Only the keyfile_option value is optional and the luks_type value is already tested above.
|
||||
+ # Using plain test to ensure a value is a single non empty and non blank word
|
||||
+ # without quoting because test " " would return zero exit code
|
||||
+ # cf. "Beware of the emptiness" in https://github.com/rear/rear/wiki/Coding-Style
|
||||
+ # Do not error out instantly here but only report errors here so the user can see all messages
|
||||
+ # and actually error out at the end of this script if there was one actually invalid value:
|
||||
+ if ! test $cipher ; then
|
||||
+ LogPrint "No 'cipher' value for LUKS$version volume $target_name in $source_device"
|
||||
+ fi
|
||||
+ if test $key_size ; then
|
||||
+ if ! is_positive_integer $key_size ; then
|
||||
+ LogPrintError "Error: 'key_size=$key_size' is no positive integer for LUKS$version volume $target_name in $source_device"
|
||||
+ invalid_cryptsetup_option_value="yes"
|
||||
+ fi
|
||||
+ else
|
||||
+ LogPrint "No 'key_size' value for LUKS$version volume $target_name in $source_device"
|
||||
+ fi
|
||||
+ if ! test $hash ; then
|
||||
+ LogPrint "No 'hash' value for LUKS$version volume $target_name in $source_device"
|
||||
+ fi
|
||||
+ if ! test $uuid ; then
|
||||
+ # Report a missig uuid value as an error to have the user informed
|
||||
+ # but do not error out here because things can be fixed manually during "rear recover"
|
||||
+ # cf. https://github.com/rear/rear/pull/2506#issuecomment-721757810
|
||||
+ # and https://github.com/rear/rear/pull/2506#issuecomment-722315498
|
||||
+ # and https://github.com/rear/rear/issues/2509
|
||||
+ LogPrintError "Error: No 'uuid' value for LUKS$version volume $target_name in $source_device (mounting it or booting the recreated system may fail)"
|
||||
+ fi
|
||||
+
|
||||
+ echo "crypt /dev/mapper/$target_name $source_device type=$luks_type cipher=$cipher key_size=$key_size hash=$hash uuid=$uuid $keyfile_option" >> $DISKLAYOUT_FILE
|
||||
+
|
||||
+done < <( dmsetup ls --target crypt )
|
||||
|
||||
+# Let this script return successfully when invalid_cryptsetup_option_value is not true:
|
||||
+is_true $invalid_cryptsetup_option_value && Error "Invalid or empty LUKS cryptsetup option value(s) in $DISKLAYOUT_FILE" || true
|
@ -1,693 +0,0 @@
|
||||
diff --git a/usr/share/rear/backup/NETFS/default/500_make_backup.sh b/usr/share/rear/backup/NETFS/default/500_make_backup.sh
|
||||
index 02c204c5..60c80b5f 100644
|
||||
--- a/usr/share/rear/backup/NETFS/default/500_make_backup.sh
|
||||
+++ b/usr/share/rear/backup/NETFS/default/500_make_backup.sh
|
||||
@@ -16,6 +16,8 @@ function set_tar_features () {
|
||||
FEATURE_TAR_IS_SET=1
|
||||
}
|
||||
|
||||
+local backup_prog_rc
|
||||
+
|
||||
local scheme=$( url_scheme $BACKUP_URL )
|
||||
local path=$( url_path $BACKUP_URL )
|
||||
local opath=$( backup_path $scheme $path )
|
||||
diff --git a/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh b/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh
|
||||
index c560ec94..1692ba4c 100644
|
||||
--- a/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh
|
||||
+++ b/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh
|
||||
@@ -1,5 +1,7 @@
|
||||
# Start SELinux if it was stopped - check presence of $TMP_DIR/selinux.mode
|
||||
|
||||
+local backup_prog_rc
|
||||
+
|
||||
[ -f $TMP_DIR/selinux.mode ] && {
|
||||
touch "${TMP_DIR}/selinux.autorelabel"
|
||||
cat $TMP_DIR/selinux.mode > $SELINUX_ENFORCE
|
||||
@@ -13,19 +15,19 @@
|
||||
ssh $RSYNC_USER@$RSYNC_HOST "chmod $v 755 ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" 2>/dev/null
|
||||
$BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" \
|
||||
"$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel" 2>/dev/null
|
||||
- _rc=$?
|
||||
- if [ $_rc -ne 0 ]; then
|
||||
- LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$_rc]}]"
|
||||
+ backup_prog_rc=$?
|
||||
+ if [ $backup_prog_rc -ne 0 ]; then
|
||||
+ LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]"
|
||||
#StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
|
||||
fi
|
||||
;;
|
||||
|
||||
(rsync)
|
||||
- $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" ${BACKUP_RSYNC_OPTIONS[@]} \
|
||||
+ $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" "${BACKUP_RSYNC_OPTIONS[@]}" \
|
||||
"${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel"
|
||||
- _rc=$?
|
||||
- if [ $_rc -ne 0 ]; then
|
||||
- LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$_rc]}]"
|
||||
+ backup_prog_rc=$?
|
||||
+ if [ $backup_prog_rc -ne 0 ]; then
|
||||
+ LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]"
|
||||
#StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
|
||||
fi
|
||||
;;
|
||||
diff --git a/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh b/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh
|
||||
index cae12e38..9a17d6bb 100644
|
||||
--- a/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh
|
||||
+++ b/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh
|
||||
@@ -1,3 +1,5 @@
|
||||
+local backup_prog_rc
|
||||
+
|
||||
[ -f $TMP_DIR/force.autorelabel ] && {
|
||||
|
||||
> "${TMP_DIR}/selinux.autorelabel"
|
||||
@@ -11,19 +13,19 @@
|
||||
ssh $RSYNC_USER@$RSYNC_HOST "chmod $v 755 ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" 2>/dev/null
|
||||
$BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" \
|
||||
"$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel" 2>/dev/null
|
||||
- _rc=$?
|
||||
- if [ $_rc -ne 0 ]; then
|
||||
- LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$_rc]}]"
|
||||
+ backup_prog_rc=$?
|
||||
+ if [ $backup_prog_rc -ne 0 ]; then
|
||||
+ LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]"
|
||||
#StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
|
||||
fi
|
||||
;;
|
||||
|
||||
(rsync)
|
||||
- $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" ${BACKUP_RSYNC_OPTIONS[@]} \
|
||||
+ $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" "${BACKUP_RSYNC_OPTIONS[@]}" \
|
||||
"${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel"
|
||||
- _rc=$?
|
||||
- if [ $_rc -ne 0 ]; then
|
||||
- LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$_rc]}]"
|
||||
+ backup_prog_rc=$?
|
||||
+ if [ $backup_prog_rc -ne 0 ]; then
|
||||
+ LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]"
|
||||
#StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
|
||||
fi
|
||||
;;
|
||||
@@ -35,8 +37,7 @@
|
||||
# probably using the BACKUP=NETFS workflow instead
|
||||
if [ -d "${opath}" ]; then
|
||||
if [ ! -f "${opath}/selinux.autorelabel" ]; then
|
||||
- > "${opath}/selinux.autorelabel"
|
||||
- StopIfError "Failed to create selinux.autorelabel on ${opath}"
|
||||
+ > "${opath}/selinux.autorelabel" || Error "Failed to create selinux.autorelabel on ${opath}"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
diff --git a/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh b/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh
|
||||
index 60330007..cedee9ce 100644
|
||||
--- a/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh
|
||||
+++ b/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh
|
||||
@@ -4,7 +4,7 @@
|
||||
# check for the --relative option in BACKUP_RSYNC_OPTIONS array
|
||||
# for the default values see the standard definition in conf/default.conf file
|
||||
|
||||
-if ! grep -q relative <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then
|
||||
+if ! grep -q relative <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then
|
||||
BACKUP_RSYNC_OPTIONS+=( --relative )
|
||||
Log "Added option '--relative' to the BACKUP_RSYNC_OPTIONS array during $WORKFLOW workflow"
|
||||
fi
|
||||
diff --git a/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh b/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh
|
||||
index 0d67d362..750a04ca 100644
|
||||
--- a/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh
|
||||
+++ b/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh
|
||||
@@ -2,6 +2,9 @@
|
||||
# This file is part of Relax-and-Recover, licensed under the GNU General
|
||||
# Public License. Refer to the included COPYING for full text of license.
|
||||
|
||||
+local backup_prog_rc
|
||||
+local backup_log_message
|
||||
+
|
||||
Log "Include list:"
|
||||
while read -r ; do
|
||||
Log " $REPLY"
|
||||
@@ -11,9 +14,9 @@ while read -r ; do
|
||||
Log " $REPLY"
|
||||
done < $TMP_DIR/backup-exclude.txt
|
||||
|
||||
-LogPrint "Creating $BACKUP_PROG archive on '${RSYNC_HOST}:${RSYNC_PATH}'"
|
||||
+LogPrint "Creating $BACKUP_PROG backup on '${RSYNC_HOST}:${RSYNC_PATH}'"
|
||||
|
||||
-ProgressStart "Running archive operation"
|
||||
+ProgressStart "Running backup operation"
|
||||
(
|
||||
case "$(basename $BACKUP_PROG)" in
|
||||
|
||||
@@ -37,7 +40,7 @@ ProgressStart "Running archive operation"
|
||||
;;
|
||||
|
||||
(*)
|
||||
- # no other backup programs foreseen then rsync so far
|
||||
+ # no other backup programs foreseen than rsync so far
|
||||
:
|
||||
;;
|
||||
|
||||
@@ -96,7 +99,7 @@ case "$(basename $BACKUP_PROG)" in
|
||||
;;
|
||||
esac
|
||||
|
||||
- ProgressInfo "Archived $((size/1024/1024)) MiB [avg $((size/1024/(SECONDS-starttime))) KiB/sec]"
|
||||
+ ProgressInfo "Backed up $((size/1024/1024)) MiB [avg $((size/1024/(SECONDS-starttime))) KiB/sec]"
|
||||
done
|
||||
;;
|
||||
|
||||
@@ -113,24 +116,23 @@ ProgressStop
|
||||
wait $BackupPID
|
||||
|
||||
transfertime="$((SECONDS-starttime))"
|
||||
-_rc="$(cat $TMP_DIR/retval)"
|
||||
+backup_prog_rc="$(cat $TMP_DIR/retval)"
|
||||
|
||||
sleep 1
|
||||
# everyone should see this warning, even if not verbose
|
||||
-test "$_rc" -gt 0 && VERBOSE=1 LogPrint "WARNING !
|
||||
-There was an error (${rsync_err_msg[$_rc]}) during archive creation.
|
||||
-Please check the archive and see '$RUNTIME_LOGFILE' for more information.
|
||||
+test "$backup_prog_rc" -gt 0 && Error "
|
||||
+There was an error (${rsync_err_msg[$backup_prog_rc]}) during backup creation.
|
||||
+Please check the destination and see '$RUNTIME_LOGFILE' for more information.
|
||||
|
||||
-Since errors are often related to files that cannot be saved by
|
||||
-$BACKUP_PROG, we will continue the $WORKFLOW process. However, you MUST
|
||||
-verify the backup yourself before trusting it !
|
||||
+If the error is related to files that cannot and should not be saved by
|
||||
+$BACKUP_PROG, they should be excluded from the backup.
|
||||
|
||||
"
|
||||
|
||||
-_message="$(tail -14 ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log)"
|
||||
-if [ $_rc -eq 0 -a "$_message" ] ; then
|
||||
- LogPrint "$_message in $transfertime seconds."
|
||||
+backup_log_message="$(tail -14 ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log)"
|
||||
+if [ $backup_prog_rc -eq 0 -a "$backup_log_message" ] ; then
|
||||
+ LogPrint "$backup_log_message in $transfertime seconds."
|
||||
elif [ "$size" ]; then
|
||||
- LogPrint "Archived $((size/1024/1024)) MiB in $((transfertime)) seconds [avg $((size/1024/transfertime)) KiB/sec]"
|
||||
+ LogPrint "Backed up $((size/1024/1024)) MiB in $((transfertime)) seconds [avg $((size/1024/transfertime)) KiB/sec]"
|
||||
fi
|
||||
|
||||
diff --git a/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh b/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh
|
||||
index 01801a4e..b90d459b 100644
|
||||
--- a/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh
|
||||
+++ b/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh
|
||||
@@ -1,6 +1,8 @@
|
||||
|
||||
# copy the backup.log & rear.log file to remote destination with timestamp added
|
||||
-Timestamp=$( date +%Y%m%d.%H%M )
|
||||
+local timestamp
|
||||
+
|
||||
+timestamp=$( date +%Y%m%d.%H%M )
|
||||
|
||||
# compress the log file first
|
||||
gzip "$TMP_DIR/$BACKUP_PROG_ARCHIVE.log" || Error "Failed to 'gzip $TMP_DIR/$BACKUP_PROG_ARCHIVE.log'"
|
||||
@@ -10,15 +12,15 @@ case $RSYNC_PROTO in
|
||||
# FIXME: Add an explanatory comment why "2>/dev/null" is useful here
|
||||
# or remove it according to https://github.com/rear/rear/issues/1395
|
||||
$BACKUP_PROG -a "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log.gz" \
|
||||
- "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${Timestamp}.log.gz" 2>/dev/null
|
||||
+ "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${timestamp}.log.gz" 2>/dev/null
|
||||
|
||||
- $BACKUP_PROG -a "$RUNTIME_LOGFILE" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/rear-${Timestamp}.log" 2>/dev/null
|
||||
+ $BACKUP_PROG -a "$RUNTIME_LOGFILE" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/rear-${timestamp}.log" 2>/dev/null
|
||||
;;
|
||||
(rsync)
|
||||
- $BACKUP_PROG -a "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log.gz" ${BACKUP_RSYNC_OPTIONS[@]} \
|
||||
- "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${Timestamp}.log.gz"
|
||||
+ $BACKUP_PROG -a "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log.gz" "${BACKUP_RSYNC_OPTIONS[@]}" \
|
||||
+ "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${timestamp}.log.gz"
|
||||
|
||||
- $BACKUP_PROG -a "$RUNTIME_LOGFILE" ${BACKUP_RSYNC_OPTIONS[@]} "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}//rear-${Timestamp}.log"
|
||||
+ $BACKUP_PROG -a "$RUNTIME_LOGFILE" "${BACKUP_RSYNC_OPTIONS[@]}" "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}//rear-${timestamp}.log"
|
||||
;;
|
||||
esac
|
||||
|
||||
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
|
||||
index 455aa3ce..0c230f38 100644
|
||||
--- a/usr/share/rear/conf/default.conf
|
||||
+++ b/usr/share/rear/conf/default.conf
|
||||
@@ -1106,7 +1106,8 @@ BACKUP_ONLY_EXCLUDE="no"
|
||||
MANUAL_INCLUDE=NO
|
||||
# Disable SELinux policy during backup with NETFS or RSYNC (default yes)
|
||||
BACKUP_SELINUX_DISABLE=1
|
||||
-# Enable integrity check of the backup archive (only with BACKUP=NETFS and BACKUP_PROG=tar)
|
||||
+# Enable integrity check of the backup archive (full check only with BACKUP=NETFS and BACKUP_PROG=tar,
|
||||
+# with BACKUP=rsync or BACKUP_PROG=rsync it only checks whether rsync completed the restore successfully)
|
||||
BACKUP_INTEGRITY_CHECK=
|
||||
# Define BACKUP_TYPE.
|
||||
# By default BACKUP_TYPE is empty which means "rear mkbackup" will create a full backup.
|
||||
diff --git a/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh b/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh
|
||||
index 32ac391d..519febf5 100644
|
||||
--- a/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh
|
||||
+++ b/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh
|
||||
@@ -2,21 +2,19 @@
|
||||
# RSYNC_PREFIX=$HOSTNAME as set in default.conf
|
||||
|
||||
# create temporary local work-spaces to collect files (we already make the remote backup dir with the correct mode!!)
|
||||
-mkdir -p $v -m0750 "${TMP_DIR}/rsync/${RSYNC_PREFIX}" >&2
|
||||
-StopIfError "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}'"
|
||||
-mkdir -p $v -m0755 "${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup" >&2
|
||||
-StopIfError "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup'"
|
||||
+mkdir -p $v -m0750 "${TMP_DIR}/rsync/${RSYNC_PREFIX}" >&2 || Error "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}'"
|
||||
+mkdir -p $v -m0755 "${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup" >&2 || Error "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup'"
|
||||
|
||||
case $RSYNC_PROTO in
|
||||
|
||||
(ssh)
|
||||
- $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}" >/dev/null 2>&1
|
||||
- StopIfError "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}"
|
||||
+ $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}" >/dev/null 2>&1 \
|
||||
+ || Error "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}"
|
||||
;;
|
||||
|
||||
(rsync)
|
||||
- $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" ${BACKUP_RSYNC_OPTIONS[@]} "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/" >/dev/null
|
||||
- StopIfError "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}"
|
||||
+ $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${BACKUP_RSYNC_OPTIONS[@]}" "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/" >/dev/null \
|
||||
+ || Error "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}"
|
||||
;;
|
||||
|
||||
esac
|
||||
diff --git a/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh b/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh
|
||||
index c7b430d8..96b62da1 100644
|
||||
--- a/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh
|
||||
+++ b/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh
|
||||
@@ -5,19 +5,19 @@ LogPrint "Copying resulting files to $OUTPUT_URL location"
|
||||
|
||||
# if called as mkbackuponly then we just don't have any result files.
|
||||
if test "$RESULT_FILES" ; then
|
||||
- Log "Copying files '${RESULT_FILES[@]}' to $OUTPUT_URL location"
|
||||
- cp $v "${RESULT_FILES[@]}" "${TMP_DIR}/rsync/${RSYNC_PREFIX}/"
|
||||
- StopIfError "Could not copy files to local rsync location"
|
||||
+ Log "Copying files '${RESULT_FILES[*]}' to $OUTPUT_URL location"
|
||||
+ cp $v "${RESULT_FILES[@]}" "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" \
|
||||
+ || Error "Could not copy files to local rsync location"
|
||||
fi
|
||||
|
||||
-echo "$VERSION_INFO" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/VERSION"
|
||||
-StopIfError "Could not create VERSION file on local rsync location"
|
||||
+echo "$VERSION_INFO" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/VERSION" \
|
||||
+ || Error "Could not create VERSION file on local rsync location"
|
||||
|
||||
-cp $v $(get_template "RESULT_usage_$OUTPUT.txt") "${TMP_DIR}/rsync/${RSYNC_PREFIX}/README"
|
||||
-StopIfError "Could not copy usage file to local rsync location"
|
||||
+cp $v $(get_template "RESULT_usage_$OUTPUT.txt") "${TMP_DIR}/rsync/${RSYNC_PREFIX}/README" \
|
||||
+ || Error "Could not copy usage file to local rsync location"
|
||||
|
||||
-cat "$RUNTIME_LOGFILE" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/rear.log"
|
||||
-StopIfError "Could not copy $RUNTIME_LOGFILE to local rsync location"
|
||||
+cat "$RUNTIME_LOGFILE" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/rear.log" \
|
||||
+ || Error "Could not copy $RUNTIME_LOGFILE to local rsync location"
|
||||
|
||||
case $RSYNC_PROTO in
|
||||
|
||||
@@ -25,20 +25,20 @@ case $RSYNC_PROTO in
|
||||
Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ ${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/"
|
||||
# FIXME: Add an explanatory comment why "2>/dev/null" is useful here
|
||||
# or remove it according to https://github.com/rear/rear/issues/1395
|
||||
- $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null
|
||||
- StopIfError "Could not copy '${RESULT_FILES[@]}' to $OUTPUT_URL location"
|
||||
+ $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null \
|
||||
+ || Error "Could not copy '${RESULT_FILES[*]}' to $OUTPUT_URL location"
|
||||
;;
|
||||
|
||||
(rsync)
|
||||
- Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ ${BACKUP_RSYNC_OPTIONS[@]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/"
|
||||
+ Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ ${BACKUP_RSYNC_OPTIONS[*]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/"
|
||||
# FIXME: Add an explanatory comment why "2>/dev/null" is useful here
|
||||
# or remove it according to https://github.com/rear/rear/issues/1395
|
||||
- $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" ${BACKUP_RSYNC_OPTIONS[@]} "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null
|
||||
- StopIfError "Could not copy '${RESULT_FILES[@]}' to $OUTPUT_URL location"
|
||||
+ $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "${BACKUP_RSYNC_OPTIONS[@]}" "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null \
|
||||
+ || Error "Could not copy '${RESULT_FILES[*]}' to $OUTPUT_URL location"
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
# cleanup the temporary space (need it for the log file during backup)
|
||||
-rm -rf "${TMP_DIR}/rsync/${RSYNC_PREFIX}/"
|
||||
-LogIfError "Could not cleanup temoprary rsync space: ${TMP_DIR}/rsync/${RSYNC_PREFIX}/"
|
||||
+rm -rf "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" \
|
||||
+ || Log "Could not cleanup temporary rsync space: ${TMP_DIR}/rsync/${RSYNC_PREFIX}/"
|
||||
diff --git a/usr/share/rear/prep/NETFS/default/400_automatic_exclude_recreate.sh b/usr/share/rear/prep/NETFS/default/400_automatic_exclude_recreate.sh
|
||||
index fadf9d72..3c719c44 100644
|
||||
--- a/usr/share/rear/prep/NETFS/default/400_automatic_exclude_recreate.sh
|
||||
+++ b/usr/share/rear/prep/NETFS/default/400_automatic_exclude_recreate.sh
|
||||
@@ -31,7 +31,7 @@ case $scheme in
|
||||
backup_directory_mountpoint=$( df -P "$backup_directory" | tail -1 | awk '{print $6}' )
|
||||
test "/" = "$backup_directory_mountpoint" && Error "URL '$BACKUP_URL' has the backup directory '$backup_directory' in the '/' filesystem which is forbidden."
|
||||
# When the mountpoint of the backup directory is not yet excluded add its mountpoint to the EXCLUDE_RECREATE array:
|
||||
- if ! grep -q "$backup_directory_mountpoint" <<< $( echo ${EXCLUDE_RECREATE[@]} ) ; then
|
||||
+ if ! grep -q "$backup_directory_mountpoint" <<< "${EXCLUDE_RECREATE[*]}" ; then
|
||||
EXCLUDE_RECREATE+=( "fs:$backup_directory_mountpoint" )
|
||||
fi
|
||||
;;
|
||||
diff --git a/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh b/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh
|
||||
index ac26edfa..eb7df29e 100644
|
||||
--- a/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh
|
||||
+++ b/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh
|
||||
@@ -33,7 +33,7 @@ case $(basename $BACKUP_PROG) in
|
||||
touch $TMP_DIR/force.autorelabel # after reboot the restored system do a forced SELinux relabeling
|
||||
else
|
||||
# if --xattrs is already set; no need to do it again
|
||||
- if ! grep -q xattrs <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then
|
||||
+ if ! grep -q xattrs <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then
|
||||
BACKUP_RSYNC_OPTIONS+=( --xattrs )
|
||||
fi
|
||||
RSYNC_SELINUX=1 # variable used in recover mode (means using xattr and not disable SELinux)
|
||||
diff --git a/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh b/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh
|
||||
index b8535352..c964a148 100644
|
||||
--- a/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh
|
||||
+++ b/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh
|
||||
@@ -33,22 +33,20 @@ RSYNC_PORT=873 # default port (of rsync server)
|
||||
RSYNC_PATH=
|
||||
|
||||
|
||||
-echo $BACKUP_URL | egrep -q '(::)' # new style '::' means rsync protocol
|
||||
-if [[ $? -eq 0 ]]; then
|
||||
+if egrep -q '(::)' <<< $BACKUP_URL ; then # new style '::' means rsync protocol
|
||||
RSYNC_PROTO=rsync
|
||||
else
|
||||
RSYNC_PROTO=ssh
|
||||
fi
|
||||
|
||||
-echo $host | grep -q '@'
|
||||
-if [[ $? -eq 0 ]]; then
|
||||
+if grep -q '@' <<< $host ; then
|
||||
RSYNC_USER="${host%%@*}" # grab user name
|
||||
else
|
||||
RSYNC_USER=root
|
||||
fi
|
||||
|
||||
# remove USER@ if present (we don't need it anymore)
|
||||
-tmp2="${host#*@}"
|
||||
+local tmp2="${host#*@}"
|
||||
|
||||
case "$RSYNC_PROTO" in
|
||||
|
||||
@@ -56,8 +54,7 @@ case "$RSYNC_PROTO" in
|
||||
# tmp2=witsbebelnx02::backup or tmp2=witsbebelnx02::
|
||||
RSYNC_HOST="${tmp2%%::*}"
|
||||
# path=/gdhaese1@witsbebelnx02::backup or path=/backup
|
||||
- echo $path | grep -q '::'
|
||||
- if [[ $? -eq 0 ]]; then
|
||||
+ if grep -q '::' <<< $path ; then
|
||||
RSYNC_PATH="${path##*::}"
|
||||
else
|
||||
RSYNC_PATH="${path##*/}"
|
||||
@@ -79,8 +76,7 @@ esac
|
||||
|
||||
# check if host is reachable
|
||||
if test "$PING" ; then
|
||||
- ping -c 2 "$RSYNC_HOST" >/dev/null
|
||||
- StopIfError "Backup host [$RSYNC_HOST] not reachable."
|
||||
+ ping -c 2 "$RSYNC_HOST" >/dev/null || Error "Backup host [$RSYNC_HOST] not reachable."
|
||||
else
|
||||
Log "Skipping ping test"
|
||||
fi
|
||||
@@ -89,15 +85,15 @@ fi
|
||||
case "$RSYNC_PROTO" in
|
||||
|
||||
(rsync)
|
||||
- Log "Test: $BACKUP_PROG ${BACKUP_RSYNC_OPTIONS[@]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/"
|
||||
- $BACKUP_PROG ${BACKUP_RSYNC_OPTIONS[@]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/ >/dev/null
|
||||
- StopIfError "Rsync daemon not running on $RSYNC_HOST"
|
||||
+ Log "Test: $BACKUP_PROG ${BACKUP_RSYNC_OPTIONS[*]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/"
|
||||
+ $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/ >/dev/null \
|
||||
+ || Error "Rsync daemon not running on $RSYNC_HOST"
|
||||
;;
|
||||
|
||||
(ssh)
|
||||
Log "Test: ssh ${RSYNC_USER}@${RSYNC_HOST} /bin/true"
|
||||
- ssh ${RSYNC_USER}@${RSYNC_HOST} /bin/true >/dev/null 2>&1
|
||||
- StopIfError "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]"
|
||||
+ ssh ${RSYNC_USER}@${RSYNC_HOST} /bin/true >/dev/null 2>&1 \
|
||||
+ || Error "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]"
|
||||
;;
|
||||
|
||||
esac
|
||||
diff --git a/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh b/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh
|
||||
index 446dd736..e9103531 100644
|
||||
--- a/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh
|
||||
+++ b/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh
|
||||
@@ -2,15 +2,17 @@
|
||||
# This file is part of Relax-and-Recover, licensed under the GNU General
|
||||
# Public License. Refer to the included COPYING for full text of license.
|
||||
# try to grab the rsync protocol version of rsync on the remote server
|
||||
+
|
||||
+local remote_mountpoint
|
||||
+
|
||||
if [ -z "$RSYNC_PROTOCOL_VERSION" ]; then
|
||||
|
||||
case $RSYNC_PROTO in
|
||||
|
||||
(ssh)
|
||||
- ssh ${RSYNC_USER}@${RSYNC_HOST} rsync --version >"$TMP_DIR/rsync_protocol" 2>&1
|
||||
- StopIfError "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]"
|
||||
- grep -q "protocol version" "$TMP_DIR/rsync_protocol"
|
||||
- if [ $? -eq 0 ]; then
|
||||
+ ssh ${RSYNC_USER}@${RSYNC_HOST} rsync --version >"$TMP_DIR/rsync_protocol" 2>&1 \
|
||||
+ || Error "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]"
|
||||
+ if grep -q "protocol version" "$TMP_DIR/rsync_protocol" ; then
|
||||
RSYNC_PROTOCOL_VERSION=$(grep 'protocol version' "$TMP_DIR/rsync_protocol" | awk '{print $6}')
|
||||
else
|
||||
RSYNC_PROTOCOL_VERSION=29 # being conservative (old rsync version < 3.0)
|
||||
@@ -30,25 +32,21 @@ else
|
||||
|
||||
fi
|
||||
|
||||
-if [ "${RSYNC_USER}" != "root" ]; then
|
||||
+if [ "${RSYNC_USER}" != "root" -a $RSYNC_PROTO = "ssh" ]; then
|
||||
if [ $RSYNC_PROTOCOL_VERSION -gt 29 ]; then
|
||||
if grep -q "no xattrs" "$TMP_DIR/rsync_protocol"; then
|
||||
# no xattrs available in remote rsync, so --fake-super is not possible
|
||||
Error "rsync --fake-super not possible on system ($RSYNC_HOST) (no xattrs compiled in rsync)"
|
||||
else
|
||||
# when using --fake-super we must have user_xattr mount options on the remote mntpt
|
||||
- _mntpt=$(ssh ${RSYNC_USER}@${RSYNC_HOST} 'cd ${RSYNC_PATH}; df -P .' 2>/dev/null | tail -1 | awk '{print $6}')
|
||||
- ssh ${RSYNC_USER}@${RSYNC_HOST} "cd ${RSYNC_PATH} && touch .is_xattr_supported && setfattr -n user.comment -v 'File created by ReaR to test if this filesystems supports extended attributes.' .is_xattr_supported && getfattr -n user.comment .is_xattr_supported 1>/dev/null; find .is_xattr_supported -empty -delete"
|
||||
- StopIfError "Remote file system $_mntpt does not have user_xattr mount option set!"
|
||||
- #BACKUP_RSYNC_OPTIONS+=( --xattrs --rsync-path="""rsync --fake-super""" )
|
||||
+ remote_mountpoint=$(ssh ${RSYNC_USER}@${RSYNC_HOST} 'cd ${RSYNC_PATH}; df -P .' 2>/dev/null | tail -1 | awk '{print $6}')
|
||||
+ ssh ${RSYNC_USER}@${RSYNC_HOST} "cd ${RSYNC_PATH} && touch .is_xattr_supported && setfattr -n user.comment -v 'File created by ReaR to test if this filesystems supports extended attributes.' .is_xattr_supported && getfattr -n user.comment .is_xattr_supported 1>/dev/null; find .is_xattr_supported -empty -delete" \
|
||||
+ || Error "Remote file system $remote_mountpoint does not have user_xattr mount option set!"
|
||||
+ #BACKUP_RSYNC_OPTIONS+=( --xattrs --rsync-path="rsync --fake-super" )
|
||||
# see issue #366 for explanation of removing --xattrs
|
||||
- BACKUP_RSYNC_OPTIONS+=( --rsync-path="""rsync --fake-super""" )
|
||||
+ BACKUP_RSYNC_OPTIONS+=( --rsync-path="rsync --fake-super" )
|
||||
fi
|
||||
else
|
||||
- if [ ${BACKUP_RSYNC_OPTIONS[@]/--fake-super/} != ${BACKUP_RSUNC_OPTIONS[@]} ]; then
|
||||
- Error "rsync --fake-super not possible on system ($RSYNC_HOST) (please upgrade rsync to 3.x)"
|
||||
- else
|
||||
- Log "Warning: rsync --fake-super not possible on system ($RSYNC_HOST) (please upgrade rsync to 3.x)"
|
||||
- fi
|
||||
+ Error "rsync --fake-super not possible on system ($RSYNC_HOST) (please upgrade rsync to 3.x)"
|
||||
fi
|
||||
fi
|
||||
diff --git a/usr/share/rear/restore/DUPLICITY/default/400_restore_duplicity.sh b/usr/share/rear/restore/DUPLICITY/default/400_restore_duplicity.sh
|
||||
index 0a9c9648..220ccc57 100644
|
||||
--- a/usr/share/rear/restore/DUPLICITY/default/400_restore_duplicity.sh
|
||||
+++ b/usr/share/rear/restore/DUPLICITY/default/400_restore_duplicity.sh
|
||||
@@ -5,6 +5,8 @@
|
||||
# Restore from remote backup via DUPLICIY over rsync
|
||||
|
||||
if [ "$BACKUP_PROG" = "duplicity" ]; then
|
||||
+ local backup_prog_rc
|
||||
+ local restore_log_message
|
||||
|
||||
LogPrint "========================================================================"
|
||||
LogPrint "Restoring backup with $BACKUP_PROG from '$BACKUP_DUPLICITY_URL'"
|
||||
@@ -49,7 +51,8 @@ if [ "$BACKUP_PROG" = "duplicity" ]; then
|
||||
LogPrint "with CMD: $DUPLICITY_PROG -v 5 $GPG_KEY --force --tempdir=$DUPLICITY_TEMPDIR $BACKUP_DUPLICITY_URL/$HOSTNAME/ $TARGET_FS_ROOT"
|
||||
$DUPLICITY_PROG -v 5 $GPG_KEY --force --tempdir="$DUPLICITY_TEMPDIR" $BACKUP_DUPLICITY_URL/$HOSTNAME/ $TARGET_FS_ROOT 0<&6 | tee $TMP_DIR/duplicity-restore.log
|
||||
fi
|
||||
- _rc=$?
|
||||
+ # FIXME: this collects the exit code from "tee", not from $DUPLICITY_PROG
|
||||
+ backup_prog_rc=$?
|
||||
|
||||
transfertime="$((SECONDS-$starttime))"
|
||||
sleep 1
|
||||
@@ -65,20 +68,20 @@ if [ "$BACKUP_PROG" = "duplicity" ]; then
|
||||
LogPrint "========================================================================"
|
||||
|
||||
|
||||
- if [ "$_rc" -gt 0 ]; then
|
||||
+ if [ "$backup_prog_rc" -gt 0 ]; then
|
||||
LogPrint "WARNING !
|
||||
There was an error while restoring the archive.
|
||||
Please check '$RUNTIME_LOGFILE' and $TMP_DIR/duplicity-restore.log for more information.
|
||||
You should also manually check the restored system to see whether it is complete.
|
||||
"
|
||||
|
||||
- _message="$(tail -14 ${TMP_DIR}/duplicity-restore.log)"
|
||||
+ restore_log_message="$(tail -14 ${TMP_DIR}/duplicity-restore.log)"
|
||||
|
||||
LogPrint "Last 14 Lines of ${TMP_DIR}/duplicity-restore.log:"
|
||||
- LogPrint "$_message"
|
||||
+ LogPrint "$restore_log_message"
|
||||
fi
|
||||
|
||||
- if [ $_rc -eq 0 ] ; then
|
||||
+ if [ $backup_prog_rc -eq 0 ] ; then
|
||||
LogPrint "Restore completed in $transfertime seconds."
|
||||
fi
|
||||
|
||||
diff --git a/usr/share/rear/restore/RBME/default/400_restore_backup.sh b/usr/share/rear/restore/RBME/default/400_restore_backup.sh
|
||||
index 28a3c354..3e97e16b 100644
|
||||
--- a/usr/share/rear/restore/RBME/default/400_restore_backup.sh
|
||||
+++ b/usr/share/rear/restore/RBME/default/400_restore_backup.sh
|
||||
@@ -2,6 +2,8 @@ if [[ -z "$RBME_BACKUP" ]] ; then
|
||||
Error "No RBME backup selected (BACKUP_URL?). Aborting."
|
||||
fi
|
||||
|
||||
+local backup_prog_rc
|
||||
+
|
||||
scheme=$(url_scheme "$BACKUP_URL")
|
||||
|
||||
LogPrint "Restoring from backup $RBME_BACKUP."
|
||||
@@ -43,11 +45,11 @@ transfertime="$((SECONDS-starttime))"
|
||||
# harvest return code from background job. The kill -0 $BackupPID loop above should
|
||||
# have made sure that this wait won't do any real "waiting" :-)
|
||||
wait $BackupPID
|
||||
-_rc=$?
|
||||
+backup_prog_rc=$?
|
||||
|
||||
sleep 1
|
||||
-test "$_rc" -gt 0 && LogPrint "WARNING !
|
||||
-There was an error (${rsync_err_msg[$_rc]}) while restoring the archive.
|
||||
+test "$backup_prog_rc" -gt 0 && LogPrint "WARNING !
|
||||
+There was an error (${rsync_err_msg[$backup_prog_rc]}) while restoring the archive.
|
||||
Please check '$RUNTIME_LOGFILE' for more information. You should also
|
||||
manually check the restored system to see whether it is complete.
|
||||
"
|
||||
diff --git a/usr/share/rear/restore/RSYNC/default/200_remove_relative_rsync_option.sh b/usr/share/rear/restore/RSYNC/default/200_remove_relative_rsync_option.sh
|
||||
index 53915322..a792f195 100644
|
||||
--- a/usr/share/rear/restore/RSYNC/default/200_remove_relative_rsync_option.sh
|
||||
+++ b/usr/share/rear/restore/RSYNC/default/200_remove_relative_rsync_option.sh
|
||||
@@ -4,11 +4,11 @@
|
||||
# without the --relative option ; my feeling says it is better to remove it from array BACKUP_RSYNC_OPTIONS
|
||||
# If I'm wrong please let us know (use issue mentioned above to comment)
|
||||
|
||||
-if grep -q relative <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then
|
||||
+if grep -q -- "--relative" <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then
|
||||
BACKUP_RSYNC_OPTIONS=( $( RmInArray "--relative" "${BACKUP_RSYNC_OPTIONS[@]}" ) )
|
||||
Log "Removed option '--relative' from the BACKUP_RSYNC_OPTIONS array during $WORKFLOW workflow"
|
||||
fi
|
||||
-if grep -q "-R" <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then
|
||||
+if grep -q -- "-R" <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then
|
||||
BACKUP_RSYNC_OPTIONS=( $( RmInArray "-R" "${BACKUP_RSYNC_OPTIONS[@]}" ) )
|
||||
Log "Removed option '-R' from the BACKUP_RSYNC_OPTIONS array during $WORKFLOW workflow"
|
||||
fi
|
||||
diff --git a/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh b/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh
|
||||
index 2a0bf15e..993088be 100644
|
||||
--- a/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh
|
||||
+++ b/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh
|
||||
@@ -4,10 +4,10 @@ get_size() {
|
||||
echo $( stat --format '%s' "$TARGET_FS_ROOT/$1" )
|
||||
}
|
||||
|
||||
-mkdir -p "${TMP_DIR}/rsync/${NETFS_PREFIX}"
|
||||
-StopIfError "Could not mkdir '$TMP_DIR/rsync/${NETFS_PREFIX}'"
|
||||
+local backup_prog_rc
|
||||
+local restore_log_message
|
||||
|
||||
-LogPrint "Restoring $BACKUP_PROG archive from '${RSYNC_HOST}:${RSYNC_PATH}'"
|
||||
+LogPrint "Restoring $BACKUP_PROG backup from '${RSYNC_HOST}:${RSYNC_PATH}'"
|
||||
|
||||
ProgressStart "Restore operation"
|
||||
(
|
||||
@@ -33,9 +33,10 @@ ProgressStart "Restore operation"
|
||||
;;
|
||||
|
||||
(*)
|
||||
- # no other backup programs foreseen then rsync so far
|
||||
+ # no other backup programs foreseen than rsync so far
|
||||
:
|
||||
;;
|
||||
+
|
||||
esac
|
||||
echo $? >$TMP_DIR/retval
|
||||
) >"${TMP_DIR}/${BACKUP_PROG_ARCHIVE}-restore.log" &
|
||||
@@ -65,6 +66,7 @@ case "$(basename $BACKUP_PROG)" in
|
||||
ProgressStep
|
||||
done
|
||||
;;
|
||||
+
|
||||
esac
|
||||
ProgressStop
|
||||
|
||||
@@ -72,20 +74,28 @@ transfertime="$((SECONDS-starttime))"
|
||||
|
||||
# harvest return code from background job. The kill -0 $BackupPID loop above should
|
||||
# have made sure that this wait won't do any real "waiting" :-)
|
||||
-wait $BackupPID
|
||||
-_rc=$?
|
||||
+wait $BackupPID || LogPrintError "Restore job returned a nonzero exit code $?"
|
||||
+# harvest the actual return code of rsync. Finishing the pipeline with an error code above is actually unlikely,
|
||||
+# because rsync is not the last command in it. But error returns from rsync are common and must be handled.
|
||||
+backup_prog_rc="$(cat $TMP_DIR/retval)"
|
||||
|
||||
sleep 1
|
||||
-test "$_rc" -gt 0 && LogPrint "WARNING !
|
||||
-There was an error (${rsync_err_msg[$_rc]}) while restoring the archive.
|
||||
+if test "$backup_prog_rc" -gt 0 ; then
|
||||
+ # TODO: Shouldn't we tell the user to check ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}-restore.log as well?
|
||||
+ LogPrintError "WARNING !
|
||||
+There was an error (${rsync_err_msg[$backup_prog_rc]}) while restoring the backup.
|
||||
Please check '$RUNTIME_LOGFILE' for more information. You should also
|
||||
manually check the restored system to see whether it is complete.
|
||||
"
|
||||
+ is_true "$BACKUP_INTEGRITY_CHECK" && Error "Integrity check failed, restore aborted because BACKUP_INTEGRITY_CHECK is enabled"
|
||||
+fi
|
||||
|
||||
-_message="$(tail -14 ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}-restore.log)"
|
||||
+restore_log_message="$(tail -14 ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}-restore.log)"
|
||||
|
||||
-if [ $_rc -eq 0 -a "$_message" ] ; then
|
||||
- LogPrint "$_message in $transfertime seconds."
|
||||
+if [ $backup_prog_rc -eq 0 -a "$restore_log_message" ] ; then
|
||||
+ LogPrint "$restore_log_message in $transfertime seconds."
|
||||
elif [ "$size" ]; then
|
||||
LogPrint "Restored $((size/1024/1024)) MiB in $((transfertime)) seconds [avg $((size/1024/transfertime)) KiB/sec]"
|
||||
fi
|
||||
+
|
||||
+return $backup_prog_rc
|
||||
diff --git a/usr/share/rear/verify/RSYNC/GNU/Linux/600_check_rsync_xattr.sh b/usr/share/rear/verify/RSYNC/GNU/Linux/600_check_rsync_xattr.sh
|
||||
index 3622884a..890161f1 100644
|
||||
--- a/usr/share/rear/verify/RSYNC/GNU/Linux/600_check_rsync_xattr.sh
|
||||
+++ b/usr/share/rear/verify/RSYNC/GNU/Linux/600_check_rsync_xattr.sh
|
||||
@@ -3,8 +3,8 @@
|
||||
[[ $RSYNC_SELINUX ]] && {
|
||||
|
||||
# if --xattrs is already set; no need to do it again
|
||||
- if ! grep -q xattrs <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then
|
||||
- RSYNC_OPTIONS=( "${BACKUP_RSYNC_OPTIONS[@]}" --xattrs )
|
||||
+ if ! grep -q xattrs <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then
|
||||
+ BACKUP_RSYNC_OPTIONS+=( --xattrs )
|
||||
fi
|
||||
|
||||
}
|
||||
diff --git a/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh b/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh
|
||||
index 47ed9e02..b2fb72f5 100644
|
||||
--- a/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh
|
||||
+++ b/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh
|
||||
@@ -3,12 +3,12 @@
|
||||
case $RSYNC_PROTO in
|
||||
|
||||
(ssh)
|
||||
- ssh ${RSYNC_USER}@${RSYNC_HOST} "ls -ld ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1
|
||||
- StopIfError "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]"
|
||||
+ ssh ${RSYNC_USER}@${RSYNC_HOST} "ls -ld ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1 \
|
||||
+ || Error "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]"
|
||||
;;
|
||||
|
||||
(rsync)
|
||||
- $BACKUP_PROG "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1
|
||||
- StopIfError "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]"
|
||||
+ $BACKUP_PROG "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1 \
|
||||
+ || Error "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]"
|
||||
;;
|
||||
esac
|
@ -1,274 +0,0 @@
|
||||
diff --git a/usr/share/rear/finalize/Linux-i386/670_run_efibootmgr.sh b/usr/share/rear/finalize/Linux-i386/670_run_efibootmgr.sh
|
||||
old mode 100644
|
||||
new mode 100755
|
||||
index cc646359..33d87767
|
||||
--- a/usr/share/rear/finalize/Linux-i386/670_run_efibootmgr.sh
|
||||
+++ b/usr/share/rear/finalize/Linux-i386/670_run_efibootmgr.sh
|
||||
@@ -8,6 +8,10 @@ is_true $USING_UEFI_BOOTLOADER || return 0
|
||||
# (cf. finalize/Linux-i386/610_EFISTUB_run_efibootmgr.sh):
|
||||
is_true $EFI_STUB && return
|
||||
|
||||
+LogPrint "Creating EFI Boot Manager entries..."
|
||||
+
|
||||
+local esp_mountpoint esp_mountpoint_inside boot_efi_parts boot_efi_dev
|
||||
+
|
||||
# When UEFI_BOOTLOADER is not a regular file in the restored target system
|
||||
# (cf. how esp_mountpoint is set below) it means BIOS is used
|
||||
# (cf. rescue/default/850_save_sysfs_uefi_vars.sh)
|
||||
@@ -15,64 +19,80 @@ is_true $EFI_STUB && return
|
||||
# because when UEFI_BOOTLOADER is empty the test below evaluates to
|
||||
# test -f /mnt/local/
|
||||
# which also returns false because /mnt/local/ is a directory
|
||||
-# (cf. https://github.com/rear/rear/pull/2051/files#r258826856):
|
||||
-test -f "$TARGET_FS_ROOT/$UEFI_BOOTLOADER" || return 0
|
||||
+# (cf. https://github.com/rear/rear/pull/2051/files#r258826856)
|
||||
+# but using BIOS conflicts with USING_UEFI_BOOTLOADER is true
|
||||
+# i.e. we should create EFI Boot Manager entries but we cannot:
|
||||
+if ! test -f "$TARGET_FS_ROOT/$UEFI_BOOTLOADER" ; then
|
||||
+ LogPrintError "Failed to create EFI Boot Manager entries (UEFI bootloader '$UEFI_BOOTLOADER' not found under target $TARGET_FS_ROOT)"
|
||||
+ return 1
|
||||
+fi
|
||||
|
||||
# Determine where the EFI System Partition (ESP) is mounted in the currently running recovery system:
|
||||
-esp_mountpoint=$( df -P "$TARGET_FS_ROOT/$UEFI_BOOTLOADER" | tail -1 | awk '{print $6}' )
|
||||
-# Use TARGET_FS_ROOT/boot/efi as fallback ESP mountpoint:
|
||||
-test "$esp_mountpoint" || esp_mountpoint="$TARGET_FS_ROOT/boot/efi"
|
||||
+esp_mountpoint=$( filesystem_name "$TARGET_FS_ROOT/$UEFI_BOOTLOADER" )
|
||||
+# Use TARGET_FS_ROOT/boot/efi as fallback ESP mountpoint (filesystem_name returns "/"
|
||||
+# if mountpoint not found otherwise):
|
||||
+if [ "$esp_mountpoint" = "/" ] ; then
|
||||
+ esp_mountpoint="$TARGET_FS_ROOT/boot/efi"
|
||||
+ LogPrint "Mountpoint of $TARGET_FS_ROOT/$UEFI_BOOTLOADER not found, trying $esp_mountpoint"
|
||||
+fi
|
||||
|
||||
# Skip if there is no esp_mountpoint directory (e.g. the fallback ESP mountpoint may not exist).
|
||||
# Double quotes are mandatory here because 'test -d' without any (possibly empty) argument results true:
|
||||
-test -d "$esp_mountpoint" || return 0
|
||||
-
|
||||
-BootEfiDev="$( mount | grep "$esp_mountpoint" | awk '{print $1}' )"
|
||||
-# /dev/sda1 or /dev/mapper/vol34_part2 or /dev/mapper/mpath99p4
|
||||
-Dev=$( get_device_name $BootEfiDev )
|
||||
-# 1 (must anyway be a low nr <9)
|
||||
-ParNr=$( get_partition_number $Dev )
|
||||
-# /dev/sda or /dev/mapper/vol34_part or /dev/mapper/mpath99p or /dev/mmcblk0p
|
||||
-Disk=$( echo ${Dev%$ParNr} )
|
||||
-
|
||||
-# Strip trailing partition remainders like '_part' or '-part' or 'p'
|
||||
-# if we have 'mapper' in disk device name:
|
||||
-if [[ ${Dev/mapper//} != $Dev ]] ; then
|
||||
- # we only expect mpath_partX or mpathpX or mpath-partX
|
||||
- case $Disk in
|
||||
- (*p) Disk=${Disk%p} ;;
|
||||
- (*-part) Disk=${Disk%-part} ;;
|
||||
- (*_part) Disk=${Disk%_part} ;;
|
||||
- (*) Log "Unsupported kpartx partition delimiter for $Dev"
|
||||
- esac
|
||||
+if ! test -d "$esp_mountpoint" ; then
|
||||
+ LogPrintError "Failed to create EFI Boot Manager entries (no ESP mountpoint directory $esp_mountpoint)"
|
||||
+ return 1
|
||||
fi
|
||||
|
||||
-# For eMMC devices the trailing 'p' in the Disk value
|
||||
-# (as in /dev/mmcblk0p that is derived from /dev/mmcblk0p1)
|
||||
-# needs to be stripped (to get /dev/mmcblk0), otherwise the
|
||||
-# efibootmgr call fails because of a wrong disk device name.
|
||||
-# See also https://github.com/rear/rear/issues/2103
|
||||
-if [[ $Disk = *'/mmcblk'+([0-9])p ]] ; then
|
||||
- Disk=${Disk%p}
|
||||
-fi
|
||||
+# Mount point inside the target system,
|
||||
+# accounting for possible trailing slashes in TARGET_FS_ROOT
|
||||
+esp_mountpoint_inside="${esp_mountpoint#${TARGET_FS_ROOT%%*(/)}}"
|
||||
|
||||
-# For NVMe devices the trailing 'p' in the Disk value
|
||||
-# (as in /dev/nvme0n1p that is derived from /dev/nvme0n1p1)
|
||||
-# needs to be stripped (to get /dev/nvme0n1), otherwise the
|
||||
-# efibootmgr call fails because of a wrong disk device name.
|
||||
-# See also https://github.com/rear/rear/issues/1564
|
||||
-if [[ $Disk = *'/nvme'+([0-9])n+([0-9])p ]] ; then
|
||||
- Disk=${Disk%p}
|
||||
+boot_efi_parts=$( find_partition "fs:$esp_mountpoint_inside" fs )
|
||||
+if ! test "$boot_efi_parts" ; then
|
||||
+ LogPrint "Unable to find ESP $esp_mountpoint_inside in layout"
|
||||
+ LogPrint "Trying to determine device currently mounted at $esp_mountpoint as fallback"
|
||||
+ boot_efi_dev="$( mount | grep "$esp_mountpoint" | awk '{print $1}' )"
|
||||
+ if ! test "$boot_efi_dev" ; then
|
||||
+ LogPrintError "Cannot create EFI Boot Manager entry (unable to find ESP $esp_mountpoint among mounted devices)"
|
||||
+ return 1
|
||||
+ fi
|
||||
+ if test $(get_component_type "$boot_efi_dev") = part ; then
|
||||
+ boot_efi_parts="$boot_efi_dev"
|
||||
+ else
|
||||
+ boot_efi_parts=$( find_partition "$boot_efi_dev" )
|
||||
+ fi
|
||||
+ if ! test "$boot_efi_parts" ; then
|
||||
+ LogPrintError "Cannot create EFI Boot Manager entry (unable to find partition for $boot_efi_dev)"
|
||||
+ return 1
|
||||
+ fi
|
||||
+ LogPrint "Using fallback EFI boot partition(s) $boot_efi_parts (unable to find ESP $esp_mountpoint_inside in layout)"
|
||||
fi
|
||||
|
||||
+local bootloader partition_block_device partition_number disk efipart
|
||||
+
|
||||
# EFI\fedora\shim.efi
|
||||
-BootLoader=$( echo $UEFI_BOOTLOADER | cut -d"/" -f4- | sed -e 's;/;\\;g' )
|
||||
-LogPrint "Creating EFI Boot Manager entry '$OS_VENDOR $OS_VERSION' for '$BootLoader' (UEFI_BOOTLOADER='$UEFI_BOOTLOADER')"
|
||||
-Log efibootmgr --create --gpt --disk ${Disk} --part ${ParNr} --write-signature --label \"${OS_VENDOR} ${OS_VERSION}\" --loader \"\\${BootLoader}\"
|
||||
-if efibootmgr --create --gpt --disk ${Disk} --part ${ParNr} --write-signature --label "${OS_VENDOR} ${OS_VERSION}" --loader "\\${BootLoader}" ; then
|
||||
- # ok, boot loader has been set-up - tell rear we are done using following var.
|
||||
- NOBOOTLOADER=''
|
||||
- return
|
||||
-fi
|
||||
+bootloader=$( echo $UEFI_BOOTLOADER | cut -d"/" -f4- | sed -e 's;/;\\;g' )
|
||||
+
|
||||
+for efipart in $boot_efi_parts ; do
|
||||
+ # /dev/sda1 or /dev/mapper/vol34_part2 or /dev/mapper/mpath99p4
|
||||
+ partition_block_device=$( get_device_name $efipart )
|
||||
+ # 1 or 2 or 4 for the examples above
|
||||
+ partition_number=$( get_partition_number $partition_block_device )
|
||||
+ if ! disk=$( get_device_from_partition $partition_block_device $partition_number ) ; then
|
||||
+ LogPrintError "Cannot create EFI Boot Manager entry for ESP $partition_block_device (unable to find the underlying disk)"
|
||||
+ # do not error out - we may be able to locate other disks if there are more of them
|
||||
+ continue
|
||||
+ fi
|
||||
+ LogPrint "Creating EFI Boot Manager entry '$OS_VENDOR $OS_VERSION' for '$bootloader' (UEFI_BOOTLOADER='$UEFI_BOOTLOADER') "
|
||||
+ Log efibootmgr --create --gpt --disk $disk --part $partition_number --write-signature --label \"${OS_VENDOR} ${OS_VERSION}\" --loader \"\\${bootloader}\"
|
||||
+ if efibootmgr --create --gpt --disk $disk --part $partition_number --write-signature --label "${OS_VENDOR} ${OS_VERSION}" --loader "\\${bootloader}" ; then
|
||||
+ # ok, boot loader has been set-up - continue with other disks (ESP can be on RAID)
|
||||
+ NOBOOTLOADER=''
|
||||
+ else
|
||||
+ LogPrintError "efibootmgr failed to create EFI Boot Manager entry on $disk partition $partition_number (ESP $partition_block_device )"
|
||||
+ fi
|
||||
+done
|
||||
|
||||
-LogPrintError "efibootmgr failed to create EFI Boot Manager entry for '$BootLoader' (UEFI_BOOTLOADER='$UEFI_BOOTLOADER')"
|
||||
+is_true $NOBOOTLOADER || return 0
|
||||
+LogPrintError "efibootmgr failed to create EFI Boot Manager entry for '$bootloader' (UEFI_BOOTLOADER='$UEFI_BOOTLOADER')"
|
||||
+return 1
|
||||
diff --git a/usr/share/rear/lib/layout-functions.sh b/usr/share/rear/lib/layout-functions.sh
|
||||
index 54ddb50f..cdd81a14 100644
|
||||
--- a/usr/share/rear/lib/layout-functions.sh
|
||||
+++ b/usr/share/rear/lib/layout-functions.sh
|
||||
@@ -302,12 +302,20 @@ get_child_components() {
|
||||
done
|
||||
}
|
||||
|
||||
-# Return all ancestors of component $1 [ of type $2 ]
|
||||
+# Return all ancestors of component $1 [ of type $2 [ skipping types $3 during resolution ] ]
|
||||
get_parent_components() {
|
||||
- declare -a ancestors devlist
|
||||
- declare current child parent
|
||||
+ declare -a ancestors devlist ignoretypes
|
||||
+ declare current child parent parenttype
|
||||
|
||||
devlist=( "$1" )
|
||||
+ if [[ "$3" ]] ; then
|
||||
+ # third argument should, if present, be a space-separated list
|
||||
+ # of types to ignore when walking up the dependency tree.
|
||||
+ # Convert it to array
|
||||
+ ignoretypes=( $3 )
|
||||
+ else
|
||||
+ ignoretypes=()
|
||||
+ fi
|
||||
while (( ${#devlist[@]} )) ; do
|
||||
current=${devlist[0]}
|
||||
|
||||
@@ -318,6 +326,13 @@ get_parent_components() {
|
||||
if IsInArray "$parent" "${ancestors[@]}" ; then
|
||||
continue
|
||||
fi
|
||||
+ ### ...test if parent is of a correct type if requested...
|
||||
+ if [[ ${#ignoretypes[@]} -gt 0 ]] ; then
|
||||
+ parenttype=$(get_component_type "$parent")
|
||||
+ if IsInArray "$parenttype" "${ignoretypes[@]}" ; then
|
||||
+ continue
|
||||
+ fi
|
||||
+ fi
|
||||
### ...and add them to the list
|
||||
devlist+=( "$parent" )
|
||||
ancestors+=( "$parent" )
|
||||
@@ -345,22 +360,24 @@ get_parent_components() {
|
||||
}
|
||||
|
||||
# find_devices <other>
|
||||
+# ${2+"$2"} in the following functions ensures that $2 gets passed down quoted if present
|
||||
+# and ignored if not present
|
||||
# Find the disk device(s) component $1 resides on.
|
||||
find_disk() {
|
||||
- get_parent_components "$1" "disk"
|
||||
+ get_parent_components "$1" "disk" ${2+"$2"}
|
||||
}
|
||||
|
||||
find_multipath() {
|
||||
- get_parent_components "$1" "multipath"
|
||||
+ get_parent_components "$1" "multipath" ${2+"$2"}
|
||||
}
|
||||
|
||||
find_disk_and_multipath() {
|
||||
- find_disk "$1"
|
||||
- is_true "$AUTOEXCLUDE_MULTIPATH" || find_multipath "$1"
|
||||
+ find_disk "$1" ${2+"$2"}
|
||||
+ is_true "$AUTOEXCLUDE_MULTIPATH" || find_multipath "$1" ${2+"$2"}
|
||||
}
|
||||
|
||||
find_partition() {
|
||||
- get_parent_components "$1" "part"
|
||||
+ get_parent_components "$1" "part" ${2+"$2"}
|
||||
}
|
||||
|
||||
# The get_partition_number function
|
||||
@@ -413,6 +430,54 @@ get_partition_number() {
|
||||
echo $partition_number
|
||||
}
|
||||
|
||||
+# Extract the underlying device name from the full partition device name.
|
||||
+# Underlying device may be a disk, a multipath device or other devices that can be partitioned.
|
||||
+# Should we use the information in $LAYOUT_DEPS, like get_parent_component does,
|
||||
+# instead of string munging?
|
||||
+function get_device_from_partition() {
|
||||
+ local partition_block_device
|
||||
+ local device
|
||||
+ local partition_number
|
||||
+
|
||||
+ partition_block_device=$1
|
||||
+ test -b "$partition_block_device" || BugError "get_device_from_partition called with '$partition_block_device' that is no block device"
|
||||
+ partition_number=${2-$(get_partition_number $partition_block_device )}
|
||||
+ # /dev/sda or /dev/mapper/vol34_part or /dev/mapper/mpath99p or /dev/mmcblk0p
|
||||
+ device=${partition_block_device%$partition_number}
|
||||
+
|
||||
+ # Strip trailing partition remainders like '_part' or '-part' or 'p'
|
||||
+ # if we have 'mapper' in disk device name:
|
||||
+ if [[ ${partition_block_device/mapper//} != $partition_block_device ]] ; then
|
||||
+ # we only expect mpath_partX or mpathpX or mpath-partX
|
||||
+ case $device in
|
||||
+ (*p) device=${device%p} ;;
|
||||
+ (*-part) device=${device%-part} ;;
|
||||
+ (*_part) device=${device%_part} ;;
|
||||
+ (*) Log "Unsupported kpartx partition delimiter for $partition_block_device"
|
||||
+ esac
|
||||
+ fi
|
||||
+
|
||||
+ # For eMMC devices the trailing 'p' in the $device value
|
||||
+ # (as in /dev/mmcblk0p that is derived from /dev/mmcblk0p1)
|
||||
+ # needs to be stripped (to get /dev/mmcblk0), otherwise the
|
||||
+ # efibootmgr call fails because of a wrong disk device name.
|
||||
+ # See also https://github.com/rear/rear/issues/2103
|
||||
+ if [[ $device = *'/mmcblk'+([0-9])p ]] ; then
|
||||
+ device=${device%p}
|
||||
+ fi
|
||||
+
|
||||
+ # For NVMe devices the trailing 'p' in the $device value
|
||||
+ # (as in /dev/nvme0n1p that is derived from /dev/nvme0n1p1)
|
||||
+ # needs to be stripped (to get /dev/nvme0n1), otherwise the
|
||||
+ # efibootmgr call fails because of a wrong disk device name.
|
||||
+ # See also https://github.com/rear/rear/issues/1564
|
||||
+ if [[ $device = *'/nvme'+([0-9])n+([0-9])p ]] ; then
|
||||
+ device=${device%p}
|
||||
+ fi
|
||||
+
|
||||
+ test -b "$device" && echo $device
|
||||
+}
|
||||
+
|
||||
# Returns partition start block or 'unknown'
|
||||
# sda/sda1 or
|
||||
# dm-XX
|
File diff suppressed because it is too large
Load Diff
@ -1,68 +0,0 @@
|
||||
diff --git a/usr/share/rear/conf/Linux-ppc64.conf b/usr/share/rear/conf/Linux-ppc64.conf
|
||||
index 7e20ddc7..d7774062 100644
|
||||
--- a/usr/share/rear/conf/Linux-ppc64.conf
|
||||
+++ b/usr/share/rear/conf/Linux-ppc64.conf
|
||||
@@ -1,18 +1,26 @@
|
||||
-REQUIRED_PROGS+=( sfdisk )
|
||||
+REQUIRED_PROGS+=( sfdisk ofpathname )
|
||||
|
||||
PROGS+=(
|
||||
mkofboot
|
||||
ofpath
|
||||
ybin
|
||||
yabootconfig
|
||||
-bootlist
|
||||
pseries_platform
|
||||
nvram
|
||||
-ofpathname
|
||||
bc
|
||||
agetty
|
||||
)
|
||||
|
||||
+if grep -q "emulated by qemu" /proc/cpuinfo ; then
|
||||
+ # Qemu/KVM virtual machines don't need bootlist - don't complain if
|
||||
+ # it is missing
|
||||
+ PROGS+=( bootlist )
|
||||
+else
|
||||
+ # PowerVM environment, we need to run bootlist, otherwise
|
||||
+ # we can't make the system bpotable. Be strict about requiring it
|
||||
+ REQUIRED_PROGS+=( bootlist )
|
||||
+fi
|
||||
+
|
||||
COPY_AS_IS+=(
|
||||
/usr/lib/yaboot/yaboot
|
||||
/usr/lib/yaboot/ofboot
|
||||
diff --git a/usr/share/rear/conf/Linux-ppc64le.conf b/usr/share/rear/conf/Linux-ppc64le.conf
|
||||
index d00154a2..df8066ea 100644
|
||||
--- a/usr/share/rear/conf/Linux-ppc64le.conf
|
||||
+++ b/usr/share/rear/conf/Linux-ppc64le.conf
|
||||
@@ -1,10 +1,8 @@
|
||||
REQUIRED_PROGS+=( sfdisk )
|
||||
|
||||
PROGS+=(
|
||||
-bootlist
|
||||
pseries_platform
|
||||
nvram
|
||||
-ofpathname
|
||||
bc
|
||||
agetty
|
||||
)
|
||||
@@ -17,4 +15,18 @@ agetty
|
||||
if [[ $(awk '/platform/ {print $NF}' < /proc/cpuinfo) != PowerNV ]] ; then
|
||||
# No firmware files when ppc64le Linux is not run in BareMetal Mode (PowerNV):
|
||||
test "${FIRMWARE_FILES[*]}" || FIRMWARE_FILES=( 'no' )
|
||||
+ # grub2-install for powerpc-ieee1275 calls ofpathname, so without it,
|
||||
+ # the rescue system can't make the recovered system bootable
|
||||
+ REQUIRED_PROGS+=( ofpathname )
|
||||
+ if grep -q "emulated by qemu" /proc/cpuinfo ; then
|
||||
+ # Qemu/KVM virtual machines don't need bootlist - don't complain if
|
||||
+ # it is missing
|
||||
+ PROGS+=( bootlist )
|
||||
+ else
|
||||
+ # PowerVM environment, we need to run bootlist, otherwise
|
||||
+ # we can't make the system bpotable. Be strict about requiring it
|
||||
+ REQUIRED_PROGS+=( bootlist )
|
||||
+ fi
|
||||
+else
|
||||
+ PROGS+=( ofpathname bootlist )
|
||||
fi
|
@ -1,34 +0,0 @@
|
||||
From 4233fe30b315737ac8c4d857e2b04e021c2e2886 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Cahyna <pcahyna@redhat.com>
|
||||
Date: Mon, 16 Aug 2021 10:10:38 +0300
|
||||
Subject: [PATCH] Revert the main part of PR #2299
|
||||
|
||||
multipath -l is very slow with many multipath devices. As it will be
|
||||
called for every multipath device, it leads to quadratic time complexity
|
||||
in the number of multipath devices. For thousands of devices, ReaR can
|
||||
take hours to scan and exclude them. We therefore have to comment
|
||||
multipath -l out, as it is a huge performance regression, and find
|
||||
another solution to bug #2298.
|
||||
---
|
||||
usr/share/rear/lib/layout-functions.sh | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/usr/share/rear/lib/layout-functions.sh b/usr/share/rear/lib/layout-functions.sh
|
||||
index cdd81a14..8c8be74b 100644
|
||||
--- a/usr/share/rear/lib/layout-functions.sh
|
||||
+++ b/usr/share/rear/lib/layout-functions.sh
|
||||
@@ -771,7 +771,10 @@ function is_multipath_path {
|
||||
# so that no "multipath -l" output could clutter the log (the "multipath -l" output is irrelevant here)
|
||||
# in contrast to e.g. test "$( multipath -l )" that would falsely succeed with blank output
|
||||
# and the output would appear in the log in 'set -x' debugscript mode:
|
||||
- multipath -l | grep -q '[[:alnum:]]' || return 1
|
||||
+ #
|
||||
+ # Unfortunately, multipat -l is quite slow with many multipath devices
|
||||
+ # and becomes a performance bottleneck, so we must comment it out for now.
|
||||
+ #multipath -l | grep -q '[[:alnum:]]' || return 1
|
||||
# Check if a block device should be a path in a multipath device:
|
||||
multipath -c /dev/$1 &>/dev/null
|
||||
}
|
||||
--
|
||||
2.26.3
|
||||
|
@ -1,56 +0,0 @@
|
||||
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
|
||||
index 0c230f38..f231bf3d 100644
|
||||
--- a/usr/share/rear/conf/default.conf
|
||||
+++ b/usr/share/rear/conf/default.conf
|
||||
@@ -2707,6 +2707,15 @@ WARN_MISSING_VOL_ID=1
|
||||
USE_CFG2HTML=
|
||||
# The SKIP_CFG2HTML variable is no longer supported since ReaR 1.18
|
||||
|
||||
+# IP addresses that are present on the system but must be excluded when
|
||||
+# building the network configuration used in recovery mode; this is typically
|
||||
+# used when floating IP addresses are used on the system
|
||||
+EXCLUDE_IP_ADDRESSES=()
|
||||
+
|
||||
+# Network interfaces that are present on the system but must be excluded when
|
||||
+# building the network configuration used in recovery mode
|
||||
+EXCLUDE_NETWORK_INTERFACES=()
|
||||
+
|
||||
# Simplify bonding setups by configuring always the first active device of a
|
||||
# bond, except when mode is 4 (IEEE 802.3ad policy)
|
||||
SIMPLIFY_BONDING=no
|
||||
diff --git a/usr/share/rear/rescue/GNU/Linux/310_network_devices.sh b/usr/share/rear/rescue/GNU/Linux/310_network_devices.sh
|
||||
index f806bfbf..2385f5b6 100644
|
||||
--- a/usr/share/rear/rescue/GNU/Linux/310_network_devices.sh
|
||||
+++ b/usr/share/rear/rescue/GNU/Linux/310_network_devices.sh
|
||||
@@ -355,6 +355,11 @@ function is_interface_up () {
|
||||
local network_interface=$1
|
||||
local sysfspath=/sys/class/net/$network_interface
|
||||
|
||||
+ if IsInArray "$network_interface" "${EXCLUDE_NETWORK_INTERFACES[@]}"; then
|
||||
+ LogPrint "Excluding '$network_interface' per EXCLUDE_NETWORK_INTERFACES directive."
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
local state=$( cat $sysfspath/operstate )
|
||||
if [ "$state" = "down" ] ; then
|
||||
return 1
|
||||
@@ -403,11 +408,19 @@ function ipaddr_setup () {
|
||||
if [ -n "$ipaddrs" ] ; then
|
||||
# If some IP is found for the network interface, then use them
|
||||
for ipaddr in $ipaddrs ; do
|
||||
+ if IsInArray "${ipaddr%%/*}" "${EXCLUDE_IP_ADDRESSES[@]}"; then
|
||||
+ LogPrint "Excluding IP address '$ipaddr' per EXCLUDE_IP_ADDRESSES directive even through it's defined in mapping file '$CONFIG_DIR/mappings/ip_addresses'."
|
||||
+ continue
|
||||
+ fi
|
||||
echo "ip addr add $ipaddr dev $mapped_as"
|
||||
done
|
||||
else
|
||||
# Otherwise, collect IP addresses for the network interface on the system
|
||||
for ipaddr in $( ip a show dev $network_interface scope global | grep "inet.*\ " | tr -s " " | cut -d " " -f 3 ) ; do
|
||||
+ if IsInArray "${ipaddr%%/*}" "${EXCLUDE_IP_ADDRESSES[@]}"; then
|
||||
+ LogPrint "Excluding IP address '$ipaddr' per EXCLUDE_IP_ADDRESSES directive."
|
||||
+ continue
|
||||
+ fi
|
||||
echo "ip addr add $ipaddr dev $mapped_as"
|
||||
done
|
||||
fi
|
@ -1,78 +0,0 @@
|
||||
diff --git a/usr/share/rear/layout/save/GNU/Linux/220_lvm_layout.sh b/usr/share/rear/layout/save/GNU/Linux/220_lvm_layout.sh
|
||||
index 35be1721..d3c9ae86 100644
|
||||
--- a/usr/share/rear/layout/save/GNU/Linux/220_lvm_layout.sh
|
||||
+++ b/usr/share/rear/layout/save/GNU/Linux/220_lvm_layout.sh
|
||||
@@ -103,12 +103,7 @@ local lvs_exit_code
|
||||
pdev=$( get_device_name $pdev )
|
||||
|
||||
# Output lvmdev entry to DISKLAYOUT_FILE:
|
||||
- # With the above example the output is:
|
||||
- # lvmdev /dev/system /dev/sda1 7wwpcO-KmNN-qsTE-7sp7-JBJS-vBdC-Zyt1W7 41940992
|
||||
- echo "lvmdev /dev/$vgrp $pdev $uuid $size"
|
||||
-
|
||||
- # After the 'lvmdev' line was written to disklayout.conf so that the user can inspect it
|
||||
- # check that the required positional parameters in the 'lvmdev' line are non-empty
|
||||
+ # Check that the required positional parameters in the 'lvmdev' line are non-empty
|
||||
# because an empty positional parameter would result an invalid 'lvmdev' line
|
||||
# which would cause invalid parameters are 'read' as input during "rear recover"
|
||||
# cf. "Verifying ... 'lvm...' entries" in layout/save/default/950_verify_disklayout_file.sh
|
||||
@@ -117,13 +112,24 @@ local lvs_exit_code
|
||||
# so that this also checks that the variables do not contain blanks or more than one word
|
||||
# because blanks (actually $IFS characters) are used as field separators in disklayout.conf
|
||||
# which means the positional parameter values must be exactly one non-empty word.
|
||||
- # Two separated simple 'test $vgrp && test $pdev' commands are used here because
|
||||
- # 'test $vgrp -a $pdev' does not work when $vgrp is empty or only blanks
|
||||
- # because '-a' has two different meanings: "EXPR1 -a EXPR2" and "-a FILE" (see "help test")
|
||||
- # so that when $vgrp is empty 'test $vgrp -a $pdev' tests if file $pdev exists
|
||||
- # which is usually true because $pdev is usually a partition device node (e.g. /dev/sda1)
|
||||
- # so that when $vgrp is empty 'test $vgrp -a $pdev' would falsely succeed:
|
||||
- test $vgrp && test $pdev || Error "LVM 'lvmdev' entry in $DISKLAYOUT_FILE where volume_group or device is empty or more than one word"
|
||||
+ test $pdev || Error "Cannot make 'lvmdev' entry in disklayout.conf (PV device '$pdev' empty or more than one word)"
|
||||
+ if ! test $vgrp ; then
|
||||
+ # Valid $pdev but invalid $vgrp (empty or more than one word):
|
||||
+ # When $vgrp is empty it means it is a PV that is not part of a VG so the PV exists but it is not used.
|
||||
+ # PVs that are not part of a VG are documented as comment in disklayout.conf but they are not recreated
|
||||
+ # because they were not used on the original system so there is no need to recreate them by "rear recover"
|
||||
+ # (the user can manually recreate them later in his recreated system when needed)
|
||||
+ # cf. https://github.com/rear/rear/issues/2596
|
||||
+ DebugPrint "Skipping PV $pdev that is not part of a valid VG (VG '$vgrp' empty or more than one word)"
|
||||
+ echo "# Skipping PV $pdev that is not part of a valid VG (VG '$vgrp' empty or more than one word):"
|
||||
+ contains_visible_char "$vgrp" || vgrp='<missing_VG>'
|
||||
+ echo "# lvmdev /dev/$vgrp $pdev $uuid $size"
|
||||
+ # Continue with the next line in the output of "lvm pvdisplay -c"
|
||||
+ continue
|
||||
+ fi
|
||||
+ # With the above example the output is:
|
||||
+ # lvmdev /dev/system /dev/sda1 7wwpcO-KmNN-qsTE-7sp7-JBJS-vBdC-Zyt1W7 41940992
|
||||
+ echo "lvmdev /dev/$vgrp $pdev $uuid $size"
|
||||
|
||||
done
|
||||
# Check the exit code of "lvm pvdisplay -c"
|
||||
@@ -161,8 +167,15 @@ local lvs_exit_code
|
||||
# lvmgrp /dev/system 4096 5119 20967424
|
||||
echo "lvmgrp /dev/$vgrp $extentsize $nrextents $size"
|
||||
|
||||
- # Check that the required positional parameters in the 'lvmgrp' line are non-empty
|
||||
- # cf. the code above to "check that the required positional parameters in the 'lvmdev' line are non-empty":
|
||||
+ # Check that the required positional parameters in the 'lvmgrp' line are non-empty.
|
||||
+ # The tested variables are intentionally not quoted here, cf. the code above to
|
||||
+ # "check that the required positional parameters in the 'lvmdev' line are non-empty".
|
||||
+ # Two separated simple 'test $vgrp && test $extentsize' commands are used here because
|
||||
+ # 'test $vgrp -a $extentsize' does not work when $vgrp is empty or only blanks
|
||||
+ # because '-a' has two different meanings: "EXPR1 -a EXPR2" and "-a FILE" (see "help test")
|
||||
+ # so with empty $vgrp it becomes 'test -a $extentsize' that tests if a file $extentsize exists
|
||||
+ # which is unlikely to be true but it is not impossible that a file $extentsize exists
|
||||
+ # so when $vgrp is empty (or blanks) 'test $vgrp -a $extentsize' might falsely succeed:
|
||||
test $vgrp && test $extentsize || Error "LVM 'lvmgrp' entry in $DISKLAYOUT_FILE where volume_group or extentsize is empty or more than one word"
|
||||
|
||||
done
|
||||
@@ -305,7 +318,8 @@ local lvs_exit_code
|
||||
fi
|
||||
already_processed_lvs+=( "$vg/$lv" )
|
||||
# Check that the required positional parameters in the 'lvmvol' line are non-empty
|
||||
- # cf. the code above to "check that the required positional parameters in the 'lvmdev' line are non-empty":
|
||||
+ # cf. the code above to "check that the required positional parameters in the 'lvmdev' line are non-empty"
|
||||
+ # and the code above to "check that the required positional parameters in the 'lvmgrp' line are non-empty":
|
||||
test $vg && test $lv && test $size && test $layout || Error "LVM 'lvmvol' entry in $DISKLAYOUT_FILE where volume_group or name or size or layout is empty or more than one word"
|
||||
fi
|
||||
|
@ -1,25 +0,0 @@
|
||||
diff --git a/usr/share/rear/layout/save/default/335_remove_excluded_multipath_vgs.sh b/usr/share/rear/layout/save/default/335_remove_excluded_multipath_vgs.sh
|
||||
index 040e9eec..e731c994 100644
|
||||
--- a/usr/share/rear/layout/save/default/335_remove_excluded_multipath_vgs.sh
|
||||
+++ b/usr/share/rear/layout/save/default/335_remove_excluded_multipath_vgs.sh
|
||||
@@ -19,9 +19,9 @@ while read lvmdev name mpdev junk ; do
|
||||
# Remember, multipath devices from a volume group that is "excluded" should be 'commented out'
|
||||
device=$(echo $mpdev | cut -c1-45)
|
||||
while read LINE ; do
|
||||
- # Now we need to comment all lines that contain "$devices" in the LAYOUT_FILE
|
||||
+ # Now we need to comment all lines that contain "$device" in the LAYOUT_FILE
|
||||
sed -i "s|^$LINE|\#$LINE|" "$LAYOUT_FILE"
|
||||
- done < <(grep "$device" $LAYOUT_FILE | grep -v "^#")
|
||||
+ done < <(grep " $device " $LAYOUT_FILE | grep -v "^#")
|
||||
Log "Excluding multipath device $device"
|
||||
done < <(grep "^#lvmdev" $LAYOUT_FILE)
|
||||
|
||||
@@ -31,7 +31,7 @@ done < <(grep "^#lvmdev" $LAYOUT_FILE)
|
||||
while read LINE ; do
|
||||
# multipath /dev/mapper/360060e8007e2e3000030e2e300002065 /dev/sdae,/dev/sdat,/dev/sdbi,/dev/sdp
|
||||
device=$(echo $LINE | awk '{print $2}' | cut -c1-45)
|
||||
- num=$(grep "$device" $LAYOUT_FILE | grep -v "^#" | wc -l)
|
||||
+ num=$(grep " $device " $LAYOUT_FILE | grep -v "^#" | wc -l)
|
||||
if [ $num -lt 2 ] ; then
|
||||
# If the $device is only seen once (in a uncommented line) then the multipath is not in use
|
||||
sed -i "s|^$LINE|\#$LINE|" "$LAYOUT_FILE"
|
@ -1,171 +0,0 @@
|
||||
commit 3d1bcf1b50ca8201a3805bc7cab6ca69c14951a1
|
||||
Author: pcahyna <pcahyna@users.noreply.github.com>
|
||||
Date: Thu May 5 12:11:55 2022 +0200
|
||||
|
||||
Merge pull request #2795 from pcahyna/recover-check-sums
|
||||
|
||||
Verify file hashes at the end of recover after file restore from backup
|
||||
|
||||
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
|
||||
index f231bf3d..881a0af0 100644
|
||||
--- a/usr/share/rear/conf/default.conf
|
||||
+++ b/usr/share/rear/conf/default.conf
|
||||
@@ -313,8 +313,30 @@ CDROM_SIZE=20
|
||||
# which exits with non-zero exit code when the disk layout or those files changed
|
||||
# (cf. https://github.com/rear/rear/issues/1134) but the checklayout workflow
|
||||
# does not automatically recreate the rescue/recovery system.
|
||||
+# Files matching FILES_TO_PATCH_PATTERNS are added to this list automatically.
|
||||
CHECK_CONFIG_FILES=( '/etc/drbd/' '/etc/drbd.conf' '/etc/lvm/lvm.conf' '/etc/multipath.conf' '/etc/rear/' '/etc/udev/udev.conf' )
|
||||
|
||||
+# FILES_TO_PATCH_PATTERNS is a space-separated list of shell glob patterns.
|
||||
+# Files that match are eligible for a final migration of UUIDs and other
|
||||
+# identifiers after recovery (if the layout recreation process has led
|
||||
+# to a change of an UUID or a device name and a corresponding change needs
|
||||
+# to be performed on restored configuration files ).
|
||||
+# See finalize/GNU/Linux/280_migrate_uuid_tags.sh
|
||||
+# The [] around the first letter make sure that shopt -s nullglob removes this file from the list if it does not exist
|
||||
+
|
||||
+FILES_TO_PATCH_PATTERNS="[b]oot/{grub.conf,menu.lst,device.map} [e]tc/grub.* \
|
||||
+ [b]oot/grub/{grub.conf,grub.cfg,menu.lst,device.map} \
|
||||
+ [b]oot/grub2/{grub.conf,grub.cfg,menu.lst,device.map} \
|
||||
+ [e]tc/sysconfig/grub [e]tc/sysconfig/bootloader \
|
||||
+ [e]tc/lilo.conf [e]tc/elilo.conf \
|
||||
+ [e]tc/yaboot.conf \
|
||||
+ [e]tc/mtab [e]tc/fstab \
|
||||
+ [e]tc/mtools.conf \
|
||||
+ [e]tc/smartd.conf [e]tc/sysconfig/smartmontools \
|
||||
+ [e]tc/sysconfig/rawdevices \
|
||||
+ [e]tc/security/pam_mount.conf.xml \
|
||||
+ [b]oot/efi/*/*/grub.cfg"
|
||||
+
|
||||
##
|
||||
# Relax-and-Recover recovery system update during "rear recover"
|
||||
#
|
||||
diff --git a/usr/share/rear/finalize/GNU/Linux/250_migrate_disk_devices_layout.sh b/usr/share/rear/finalize/GNU/Linux/250_migrate_disk_devices_layout.sh
|
||||
index 1a91a0e3..e869e5e9 100644
|
||||
--- a/usr/share/rear/finalize/GNU/Linux/250_migrate_disk_devices_layout.sh
|
||||
+++ b/usr/share/rear/finalize/GNU/Linux/250_migrate_disk_devices_layout.sh
|
||||
@@ -29,19 +29,9 @@ LogPrint "The original restored files get saved in $save_original_file_dir (in $
|
||||
|
||||
local symlink_target=""
|
||||
local restored_file=""
|
||||
-# the funny [] around the first letter make sure that shopt -s nullglob removes this file from the list if it does not exist
|
||||
-# the files without a [] are mandatory, like fstab FIXME: but below there is [e]tc/fstab not etc/fstab - why?
|
||||
-
|
||||
-for restored_file in [b]oot/{grub.conf,menu.lst,device.map} [e]tc/grub.* [b]oot/grub/{grub.conf,menu.lst,device.map} \
|
||||
- [b]oot/grub2/{grub.conf,grub.cfg,menu.lst,device.map} \
|
||||
- [e]tc/sysconfig/grub [e]tc/sysconfig/bootloader \
|
||||
- [e]tc/lilo.conf \
|
||||
- [e]tc/yaboot.conf \
|
||||
- [e]tc/mtab [e]tc/fstab \
|
||||
- [e]tc/mtools.conf \
|
||||
- [e]tc/smartd.conf [e]tc/sysconfig/smartmontools \
|
||||
- [e]tc/sysconfig/rawdevices \
|
||||
- [e]tc/security/pam_mount.conf.xml [b]oot/efi/*/*/grub.cfg
|
||||
+# The variable expansion is deliberately not quoted in order to perform
|
||||
+# pathname expansion on the variable value.
|
||||
+for restored_file in $FILES_TO_PATCH_PATTERNS
|
||||
do
|
||||
# Silently skip directories and file not found:
|
||||
test -f "$restored_file" || continue
|
||||
diff --git a/usr/share/rear/finalize/GNU/Linux/280_migrate_uuid_tags.sh b/usr/share/rear/finalize/GNU/Linux/280_migrate_uuid_tags.sh
|
||||
index 074689a1..d994ce8e 100644
|
||||
--- a/usr/share/rear/finalize/GNU/Linux/280_migrate_uuid_tags.sh
|
||||
+++ b/usr/share/rear/finalize/GNU/Linux/280_migrate_uuid_tags.sh
|
||||
@@ -23,18 +23,9 @@ LogPrint "Migrating filesystem UUIDs in certain restored files in $TARGET_FS_ROO
|
||||
|
||||
local symlink_target=""
|
||||
local restored_file=""
|
||||
-# the funny [] around the first letter make sure that shopt -s nullglob removes this file from the list if it does not exist
|
||||
-# the files without a [] are mandatory, like fstab FIXME: but below there is [e]tc/fstab not etc/fstab - why?
|
||||
-for restored_file in [b]oot/{grub.conf,menu.lst,device.map} [e]tc/grub.* \
|
||||
- [b]oot/grub/{grub.conf,grub.cfg,menu.lst,device.map} \
|
||||
- [b]oot/grub2/{grub.conf,grub.cfg,menu.lst,device.map} \
|
||||
- [e]tc/sysconfig/grub [e]tc/sysconfig/bootloader \
|
||||
- [e]tc/lilo.conf [e]tc/elilo.conf \
|
||||
- [e]tc/mtab [e]tc/fstab \
|
||||
- [e]tc/mtools.conf \
|
||||
- [e]tc/smartd.conf [e]tc/sysconfig/smartmontools \
|
||||
- [e]tc/sysconfig/rawdevices \
|
||||
- [e]tc/security/pam_mount.conf.xml [b]oot/efi/*/*/grub.cfg
|
||||
+# The variable expansion is deliberately not quoted in order to perform
|
||||
+# pathname expansion on the variable value.
|
||||
+for restored_file in $FILES_TO_PATCH_PATTERNS
|
||||
do
|
||||
# Silently skip directories and file not found:
|
||||
test -f "$restored_file" || continue
|
||||
diff --git a/usr/share/rear/finalize/default/060_compare_files.sh b/usr/share/rear/finalize/default/060_compare_files.sh
|
||||
new file mode 100644
|
||||
index 00000000..6947fda9
|
||||
--- /dev/null
|
||||
+++ b/usr/share/rear/finalize/default/060_compare_files.sh
|
||||
@@ -0,0 +1,6 @@
|
||||
+if [ -e $VAR_DIR/layout/config/files.md5sum ] ; then
|
||||
+ if ! chroot $TARGET_FS_ROOT md5sum -c --quiet < $VAR_DIR/layout/config/files.md5sum 1>> >( tee -a "$RUNTIME_LOGFILE" 1>&7 ) 2>> >( tee -a "$RUNTIME_LOGFILE" 1>&8 ) ; then
|
||||
+ LogPrintError "Error: Restored files do not match the recreated system in $TARGET_FS_ROOT"
|
||||
+ return 1
|
||||
+ fi
|
||||
+fi
|
||||
diff --git a/usr/share/rear/layout/save/default/490_check_files_to_patch.sh b/usr/share/rear/layout/save/default/490_check_files_to_patch.sh
|
||||
new file mode 100644
|
||||
index 00000000..ee717063
|
||||
--- /dev/null
|
||||
+++ b/usr/share/rear/layout/save/default/490_check_files_to_patch.sh
|
||||
@@ -0,0 +1,43 @@
|
||||
+# FILES_TO_PATCH_PATTERNS is a space-separated list of shell glob patterns.
|
||||
+# Files that match are eligible for a final migration of UUIDs and other
|
||||
+# identifiers after recovery (if the layout recreation process has led
|
||||
+# to a change of an UUID or a device name and a corresponding change needs
|
||||
+# to be performed on restored configuration files ).
|
||||
+# See finalize/GNU/Linux/280_migrate_uuid_tags.sh
|
||||
+# We should add all such files to CHECK_CONFIG_FILES - if they change,
|
||||
+# we risk inconsistencies between the restored files and recreated layout,
|
||||
+# or failures of UUID migration.
|
||||
+
|
||||
+local file final_file symlink_target
|
||||
+
|
||||
+# The patterns are relative to /, change directory there
|
||||
+# so that the shell finds the files during pathname expansion
|
||||
+pushd / >/dev/null
|
||||
+# The variable expansion is deliberately not quoted in order to perform
|
||||
+# pathname expansion on the variable value.
|
||||
+for file in $FILES_TO_PATCH_PATTERNS ; do
|
||||
+ final_file="/$file"
|
||||
+ IsInArray "$final_file" "${CHECK_CONFIG_FILES[@]}" && continue
|
||||
+ # Symlink handling (partially from 280_migrate_uuid_tags.sh):
|
||||
+ # avoid dead symlinks, and symlinks to files on dynamic filesystems
|
||||
+ # ( /proc etc.) - they are expected to change and validating
|
||||
+ # their checksums has no sense
|
||||
+ if test -L "$final_file" ; then
|
||||
+ if symlink_target="$( readlink -e "$final_file" )" ; then
|
||||
+ # If the symlink target contains /proc/ /sys/ /dev/ or /run/ we skip it because then
|
||||
+ # the symlink target is considered to not be a restored file that needs to be patched
|
||||
+ # and thus we don't need to generate and check its hash, either
|
||||
+ # cf. https://github.com/rear/rear/pull/2047#issuecomment-464846777
|
||||
+ if echo $symlink_target | egrep -q '/proc/|/sys/|/dev/|/run/' ; then
|
||||
+ Log "Skip adding symlink $final_file target $symlink_target on /proc/ /sys/ /dev/ or /run/ to CHECK_CONFIG_FILES"
|
||||
+ continue
|
||||
+ fi
|
||||
+ Debug "Adding symlink $final_file with target $symlink_target to CHECK_CONFIG_FILES"
|
||||
+ else
|
||||
+ LogPrint "Skip adding dead symlink $final_file to CHECK_CONFIG_FILES"
|
||||
+ continue
|
||||
+ fi
|
||||
+ fi
|
||||
+ CHECK_CONFIG_FILES+=( "$final_file" )
|
||||
+done
|
||||
+popd >/dev/null
|
||||
diff --git a/usr/share/rear/layout/save/default/600_snapshot_files.sh b/usr/share/rear/layout/save/default/600_snapshot_files.sh
|
||||
index 0ebf197c..3ac6b07e 100644
|
||||
--- a/usr/share/rear/layout/save/default/600_snapshot_files.sh
|
||||
+++ b/usr/share/rear/layout/save/default/600_snapshot_files.sh
|
||||
@@ -3,7 +3,8 @@ if [ "$WORKFLOW" = "checklayout" ] ; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
-config_files=()
|
||||
+local obj
|
||||
+local config_files=()
|
||||
for obj in "${CHECK_CONFIG_FILES[@]}" ; do
|
||||
if [ -d "$obj" ] ; then
|
||||
config_files+=( $( find "$obj" -type f ) )
|
@ -1,58 +0,0 @@
|
||||
commit 389e5026df575ad98695191044257cf2b33d565b
|
||||
Author: pcahyna <pcahyna@users.noreply.github.com>
|
||||
Date: Mon Jul 4 15:48:43 2022 +0200
|
||||
|
||||
Merge pull request #2825 from lzaoral/replace-mkinitrd-with-dracut
|
||||
|
||||
Replace `mkinitrd` with `dracut` on Fedora and RHEL
|
||||
|
||||
diff --git a/usr/share/rear/finalize/Fedora/i386/550_rebuild_initramfs.sh b/usr/share/rear/finalize/Fedora/i386/550_rebuild_initramfs.sh
|
||||
index 3476b77f..f296e624 100644
|
||||
--- a/usr/share/rear/finalize/Fedora/i386/550_rebuild_initramfs.sh
|
||||
+++ b/usr/share/rear/finalize/Fedora/i386/550_rebuild_initramfs.sh
|
||||
@@ -61,7 +61,7 @@ NEW_INITRD_MODULES=( $(tr " " "\n" <<< "${NEW_INITRD_MODULES[*]}" | sort | uniq
|
||||
Log "New INITRD_MODULES='${OLD_INITRD_MODULES[@]} ${NEW_INITRD_MODULES[@]}'"
|
||||
INITRD_MODULES="${OLD_INITRD_MODULES[@]} ${NEW_INITRD_MODULES[@]}"
|
||||
|
||||
-WITH_INITRD_MODULES=$( printf '%s\n' ${INITRD_MODULES[@]} | awk '{printf "--with=%s ", $1}' )
|
||||
+WITH_INITRD_MODULES=$( printf '%s\n' ${INITRD_MODULES[@]} | awk '{printf "--add-drivers=%s ", $1}' )
|
||||
|
||||
# Recreate any initrd or initramfs image under $TARGET_FS_ROOT/boot/ with new drivers
|
||||
# Images ignored:
|
||||
@@ -76,19 +76,19 @@ for INITRD_IMG in $( ls $TARGET_FS_ROOT/boot/initramfs-*.img $TARGET_FS_ROOT/boo
|
||||
# Do not use KERNEL_VERSION here because that is readonly in the rear main script:
|
||||
kernel_version=$( basename $( echo $INITRD_IMG ) | cut -f2- -d"-" | sed s/"\.img"// )
|
||||
INITRD=$( echo $INITRD_IMG | egrep -o "/boot/.*" )
|
||||
- LogPrint "Running mkinitrd..."
|
||||
- # Run mkinitrd directly in chroot without a login shell in between (see https://github.com/rear/rear/issues/862).
|
||||
- # We need the mkinitrd binary in the chroot environment i.e. the mkinitrd binary in the recreated system.
|
||||
- # Normally we would use a login shell like: chroot $TARGET_FS_ROOT /bin/bash --login -c 'type -P mkinitrd'
|
||||
+ LogPrint "Running dracut..."
|
||||
+ # Run dracut directly in chroot without a login shell in between (see https://github.com/rear/rear/issues/862).
|
||||
+ # We need the dracut binary in the chroot environment i.e. the dracut binary in the recreated system.
|
||||
+ # Normally we would use a login shell like: chroot $TARGET_FS_ROOT /bin/bash --login -c 'type -P dracut'
|
||||
# because otherwise there is no useful PATH (PATH is only /bin) so that 'type -P' won't find it
|
||||
# but we cannot use a login shell because that contradicts https://github.com/rear/rear/issues/862
|
||||
# so that we use a plain (non-login) shell and set a (hopefully) reasonable PATH:
|
||||
- local mkinitrd_binary=$( chroot $TARGET_FS_ROOT /bin/bash -c 'PATH=/sbin:/usr/sbin:/usr/bin:/bin type -P mkinitrd' )
|
||||
- # If there is no mkinitrd in the chroot environment plain 'chroot $TARGET_FS_ROOT' will hang up endlessly
|
||||
+ local dracut_binary=$( chroot $TARGET_FS_ROOT /bin/bash -c 'PATH=/sbin:/usr/sbin:/usr/bin:/bin type -P dracut' )
|
||||
+ # If there is no dracut in the chroot environment plain 'chroot $TARGET_FS_ROOT' will hang up endlessly
|
||||
# and then "rear recover" cannot be aborted with the usual [Ctrl]+[C] keys.
|
||||
# Use plain $var because when var contains only blanks test "$var" results true because test " " results true:
|
||||
- if test $mkinitrd_binary ; then
|
||||
- if chroot $TARGET_FS_ROOT $mkinitrd_binary -v -f ${WITH_INITRD_MODULES[@]} $INITRD $kernel_version >&2 ; then
|
||||
+ if test $dracut_binary ; then
|
||||
+ if chroot $TARGET_FS_ROOT $dracut_binary -v -f ${WITH_INITRD_MODULES[@]} $INITRD $kernel_version >&2 ; then
|
||||
LogPrint "Updated initrd with new drivers for kernel $kernel_version."
|
||||
else
|
||||
LogPrint "WARNING:
|
||||
@@ -99,7 +99,7 @@ and decide yourself, whether the system will boot or not.
|
||||
fi
|
||||
else
|
||||
LogPrint "WARNING:
|
||||
-Cannot create initrd (found no mkinitrd in the recreated system).
|
||||
+Cannot create initrd (found no dracut in the recreated system).
|
||||
Check the recreated system (mounted at $TARGET_FS_ROOT)
|
||||
and decide yourself, whether the system will boot or not.
|
||||
"
|
@ -1,130 +0,0 @@
|
||||
commit b06d059108db9b0c46cba29cc174f60e129164f1
|
||||
Author: Johannes Meixner <jsmeix@suse.com>
|
||||
Date: Tue Mar 9 14:40:59 2021 +0100
|
||||
|
||||
Merge pull request #2580 from rear/jsmeix-load-nvram-module
|
||||
|
||||
In etc/scripts/system-setup.d/41-load-special-modules.sh
|
||||
load the nvram kernel module if possible to make /dev/nvram appear
|
||||
because /dev/nvram should be there when installing GRUB,
|
||||
see https://github.com/rear/rear/issues/2554
|
||||
and include the nvram kernel module in the recovery system
|
||||
because nvram could be a module in particular on POWER architecture
|
||||
see https://github.com/rear/rear/issues/2554#issuecomment-764720180
|
||||
|
||||
diff --git a/usr/share/rear/build/GNU/Linux/400_copy_modules.sh b/usr/share/rear/build/GNU/Linux/400_copy_modules.sh
|
||||
index d8d733d2..a0ca9084 100644
|
||||
--- a/usr/share/rear/build/GNU/Linux/400_copy_modules.sh
|
||||
+++ b/usr/share/rear/build/GNU/Linux/400_copy_modules.sh
|
||||
@@ -116,8 +116,12 @@ for dummy in "once" ; do
|
||||
# As a way out of this dilemma we add the below listed modules no longer via conf/GNU/Linux.conf
|
||||
# but here after the user config files were sourced so that now the user can specify
|
||||
# MODULES=( 'moduleX' 'moduleY' ) in etc/rear/local.conf to get additional kernel modules
|
||||
- # included in the recovery system in addition to the ones via an empty MODULES=() setting:
|
||||
- MODULES+=( vfat
|
||||
+ # included in the recovery system in addition to the ones via an empty MODULES=() setting.
|
||||
+ # nvram could be a module in particular on POWER architecture,
|
||||
+ # cf. https://github.com/rear/rear/issues/2554#issuecomment-764720180
|
||||
+ # and https://github.com/rear/rear/pull/2580#issuecomment-791344794
|
||||
+ MODULES+=( nvram
|
||||
+ vfat
|
||||
nls_iso8859_1 nls_utf8 nls_cp437
|
||||
af_packet
|
||||
unix
|
||||
diff --git a/usr/share/rear/finalize/Linux-ppc64le/660_install_grub2.sh b/usr/share/rear/finalize/Linux-ppc64le/660_install_grub2.sh
|
||||
index 4c2698f3..0cb3ee41 100644
|
||||
--- a/usr/share/rear/finalize/Linux-ppc64le/660_install_grub2.sh
|
||||
+++ b/usr/share/rear/finalize/Linux-ppc64le/660_install_grub2.sh
|
||||
@@ -104,9 +104,39 @@ fi
|
||||
# Do not update nvram when system is running in PowerNV mode (BareMetal).
|
||||
# grub2-install will fail if not run with the --no-nvram option on a PowerNV system,
|
||||
# see https://github.com/rear/rear/pull/1742
|
||||
-grub2_install_option=""
|
||||
+grub2_no_nvram_option=""
|
||||
if [[ $(awk '/platform/ {print $NF}' < /proc/cpuinfo) == PowerNV ]] ; then
|
||||
- grub2_install_option="--no-nvram"
|
||||
+ grub2_no_nvram_option="--no-nvram"
|
||||
+fi
|
||||
+# Also do not update nvram when no character device node /dev/nvram exists.
|
||||
+# On POWER architecture the nvram kernel driver could be also built as a kernel module
|
||||
+# that gets loaded via etc/scripts/system-setup.d/41-load-special-modules.sh
|
||||
+# but whether or not the nvram kernel driver will then create /dev/nvram
|
||||
+# depends on whether or not the hardware platform supports nvram.
|
||||
+# I <jsmeix@suse.de> asked on a SUSE internal mailing list
|
||||
+# and got the following reply (excerpts):
|
||||
+# ----------------------------------------------------------------
|
||||
+# > I would like to know when /dev/nvram exists and when not.
|
||||
+# > I assume /dev/nvram gets created as other device nodes
|
||||
+# > by the kernel (probably together with udev).
|
||||
+# > I would like to know under what conditions /dev/nvram
|
||||
+# > gets created and when it is not created.
|
||||
+# > It seems on PPC /dev/nvram usually exist but sometimes not.
|
||||
+# In case of powerpc, it gets created by nvram driver
|
||||
+# (nvram_module_init) whenever the powerpc platform driver
|
||||
+# has ppc_md.nvram_size greater than zero in it's machine
|
||||
+# description structure.
|
||||
+# How exactly ppc_md.nvram_size gets gets populated by platform
|
||||
+# code depends on the platform, e.g. on most modern systems
|
||||
+# it gets populated from 'nvram' device tree node
|
||||
+# (and only if such node has #bytes > 0).
|
||||
+# ----------------------------------------------------------------
|
||||
+# So /dev/nvram may not exist regardless that the nvram kernel driver is there
|
||||
+# and then grub2-install must be called with the '--no-nvram' option
|
||||
+# because otherwise installing the bootloader fails
|
||||
+# cf. https://github.com/rear/rear/issues/2554
|
||||
+if ! test -c /dev/nvram ; then
|
||||
+ grub2_no_nvram_option="--no-nvram"
|
||||
fi
|
||||
|
||||
# When GRUB2_INSTALL_DEVICES is specified by the user
|
||||
@@ -134,7 +164,7 @@ if test "$GRUB2_INSTALL_DEVICES" ; then
|
||||
else
|
||||
LogPrint "Installing GRUB2 on $grub2_install_device (specified in GRUB2_INSTALL_DEVICES)"
|
||||
fi
|
||||
- if ! chroot $TARGET_FS_ROOT /bin/bash --login -c "$grub_name-install $grub2_install_option $grub2_install_device" ; then
|
||||
+ if ! chroot $TARGET_FS_ROOT /bin/bash --login -c "$grub_name-install $grub2_no_nvram_option $grub2_install_device" ; then
|
||||
LogPrintError "Failed to install GRUB2 on $grub2_install_device"
|
||||
grub2_install_failed="yes"
|
||||
fi
|
||||
@@ -170,7 +200,7 @@ for part in $part_list ; do
|
||||
LogPrint "Found PPC PReP boot partition $part - installing GRUB2 there"
|
||||
# Erase the first 512 bytes of the PPC PReP boot partition:
|
||||
dd if=/dev/zero of=$part
|
||||
- if chroot $TARGET_FS_ROOT /bin/bash --login -c "$grub_name-install $grub2_install_option $part" ; then
|
||||
+ if chroot $TARGET_FS_ROOT /bin/bash --login -c "$grub_name-install $grub2_no_nvram_option $part" ; then
|
||||
# In contrast to the above behaviour when GRUB2_INSTALL_DEVICES is specified
|
||||
# consider it here as a successful bootloader installation when GRUB2
|
||||
# got installed on at least one PPC PReP boot partition:
|
||||
diff --git a/usr/share/rear/skel/default/etc/scripts/system-setup.d/41-load-special-modules.sh b/usr/share/rear/skel/default/etc/scripts/system-setup.d/41-load-special-modules.sh
|
||||
index 9b0b3b8a..2e1d1912 100644
|
||||
--- a/usr/share/rear/skel/default/etc/scripts/system-setup.d/41-load-special-modules.sh
|
||||
+++ b/usr/share/rear/skel/default/etc/scripts/system-setup.d/41-load-special-modules.sh
|
||||
@@ -1,6 +1,24 @@
|
||||
-# some things are special
|
||||
+# Special cases of kernel module loading.
|
||||
|
||||
-# XEN PV does not autoload some modules
|
||||
-if [ -d /proc/xen ] ; then
|
||||
- modprobe xenblk
|
||||
+# XEN PV does not autoload some modules:
|
||||
+test -d /proc/xen && modprobe xenblk
|
||||
+
|
||||
+# On POWER architecture the nvram kernel driver may be no longer built into the kernel
|
||||
+# but nowadays it could be also built as a kernel module that needs to be loaded
|
||||
+# cf. https://github.com/rear/rear/issues/2554#issuecomment-764720180
|
||||
+# because normally grub2-install gets called without the '--no-nvram' option
|
||||
+# e.g. see finalize/Linux-ppc64le/620_install_grub2.sh
|
||||
+# which is how grub2-install should be called when the hardware supports nvram.
|
||||
+# Nothing to do when the character device node /dev/nvram exists
|
||||
+# because then the nvram kernel driver is already there:
|
||||
+if ! test -c /dev/nvram ; then
|
||||
+ # Nothing can be done when there is no nvram kernel module.
|
||||
+ # Suppress the possible 'modprobe -n nvram' error message like
|
||||
+ # "modprobe: FATAL: Module nvram not found in directory /lib/modules/..."
|
||||
+ # to avoid a possible "FATAL" false alarm message that would appear
|
||||
+ # on the user's terminal during recovery system startup
|
||||
+ # cf. https://github.com/rear/rear/pull/2537#issuecomment-741825046
|
||||
+ # but when there is a nvram kernel module show possible 'modprobe nvram'
|
||||
+ # (error) messages on the user's terminal during recovery system startup:
|
||||
+ modprobe -n nvram 2>/dev/null && modprobe nvram
|
||||
fi
|
@ -1,37 +0,0 @@
|
||||
commit 2922b77e950537799fdadf5b3ebf6a05d97f6f2f
|
||||
Author: pcahyna <pcahyna@users.noreply.github.com>
|
||||
Date: Mon Jun 20 17:42:58 2022 +0200
|
||||
|
||||
Merge pull request #2822 from pcahyna/fix-vim-symlink
|
||||
|
||||
Fix vi in the rescue system on Fedora and RHEL 9
|
||||
|
||||
diff --git a/usr/share/rear/build/GNU/Linux/005_create_symlinks.sh b/usr/share/rear/build/GNU/Linux/005_create_symlinks.sh
|
||||
index df75e07d..55f25bef 100644
|
||||
--- a/usr/share/rear/build/GNU/Linux/005_create_symlinks.sh
|
||||
+++ b/usr/share/rear/build/GNU/Linux/005_create_symlinks.sh
|
||||
@@ -8,7 +8,6 @@
|
||||
ln -sf $v bin/init $ROOTFS_DIR/init >&2
|
||||
ln -sf $v bin $ROOTFS_DIR/sbin >&2
|
||||
ln -sf $v bash $ROOTFS_DIR/bin/sh >&2
|
||||
-ln -sf $v vi $ROOTFS_DIR/bin/vim >&2
|
||||
ln -sf $v true $ROOTFS_DIR/bin/pam_console_apply >&2 # RH/Fedora with udev needs this
|
||||
ln -sf $v ../bin $ROOTFS_DIR/usr/bin >&2
|
||||
ln -sf $v ../bin $ROOTFS_DIR/usr/sbin >&2
|
||||
diff --git a/usr/share/rear/conf/GNU/Linux.conf b/usr/share/rear/conf/GNU/Linux.conf
|
||||
index 89aedd4c..0c97594a 100644
|
||||
--- a/usr/share/rear/conf/GNU/Linux.conf
|
||||
+++ b/usr/share/rear/conf/GNU/Linux.conf
|
||||
@@ -206,6 +206,12 @@ LIBS+=(
|
||||
)
|
||||
|
||||
COPY_AS_IS+=( /dev /etc/inputr[c] /etc/protocols /etc/services /etc/rpc /etc/termcap /etc/terminfo /lib*/terminfo /usr/share/terminfo /etc/netconfig /etc/mke2fs.conf /etc/*-release /etc/localtime /etc/magic /usr/share/misc/magic /etc/dracut.conf /etc/dracut.conf.d /usr/lib/dracut /sbin/modprobe.ksplice-orig /etc/sysctl.conf /etc/sysctl.d /etc/e2fsck.conf )
|
||||
+
|
||||
+# Needed by vi on Fedora and derived distributions
|
||||
+# where vi is a shell script that executes /usr/libexec/vi
|
||||
+# see https://github.com/rear/rear/pull/2822
|
||||
+COPY_AS_IS+=( /usr/libexec/vi )
|
||||
+
|
||||
# Required by curl with https:
|
||||
# There are stored the distribution provided certificates
|
||||
# installed from packages, nothing confidential.
|
@ -1,21 +1,60 @@
|
||||
commit 40ec3bf072a51229e81bfbfa7cedb8a7c7902dbd
|
||||
Author: Johannes Meixner <jsmeix@suse.com>
|
||||
Date: Fri Jun 24 15:11:27 2022 +0200
|
||||
commit bca0e7a92af16cb7fb82ef04401cdb3286068081
|
||||
Merge: d2d2300b f36bfe9b
|
||||
Author: pcahyna <pcahyna@users.noreply.github.com>
|
||||
Date: Thu Jul 28 12:11:04 2022 +0200
|
||||
|
||||
Merge pull request #2827 from rear/jsmeix-fail-safe-yes-pipe-lvcreate
|
||||
Merge pull request #2839 from pcahyna/lvm-y
|
||||
|
||||
and commit b3fd58fc871e00bd713a0cb081de54d746ffffb3 from pull request #2839
|
||||
Pass -y to lvcreate instead of piping the output of yes
|
||||
|
||||
diff --git a/usr/share/rear/conf/GNU/Linux.conf b/usr/share/rear/conf/GNU/Linux.conf
|
||||
index 82007719..7e47b912 100644
|
||||
--- a/usr/share/rear/conf/GNU/Linux.conf
|
||||
+++ b/usr/share/rear/conf/GNU/Linux.conf
|
||||
@@ -5,7 +5,7 @@ ip
|
||||
less
|
||||
parted
|
||||
readlink
|
||||
-# For noninteractive confirmation in lvm commands during layout recreation
|
||||
+# For noninteractive confirmation in commands
|
||||
yes
|
||||
)
|
||||
|
||||
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 1be17ba8..d34ab335 100644
|
||||
index 0bd863ac..6089cc09 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
|
||||
@@ -263,7 +263,7 @@ $ifline
|
||||
@@ -287,28 +287,16 @@ create_lvmvol() {
|
||||
# so e.g. 'lvcreate -L 123456b -n LV VG' becomes 'lvcreate -l 100%FREE -n LV VG'
|
||||
fallbacklvopts="$( sed -e 's/-L [0-9b]*/-l 100%FREE/' <<< "$lvopts" )"
|
||||
|
||||
LogPrint "Creating LVM volume '$vg/$lvname'; Warning: some properties may not be preserved..."
|
||||
- # In SLES11 "man lvcreate" does not show '-y' or '--yes'
|
||||
- # so we cannot use "lvm lvcreate -y ..."
|
||||
- # see https://github.com/rear/rear/issues/2820#issuecomment-1161934013
|
||||
- # instead we input as many 'y' as asked for by "lvm lvcreate"
|
||||
- # see https://github.com/rear/rear/issues/513
|
||||
- # and https://github.com/rear/rear/issues/2820
|
||||
- # plus be safe against possible 'set -o pipefail' non-zero exit code of 'yes' via '( yes || true ) | ...'
|
||||
- # see https://github.com/rear/rear/issues/2820#issuecomment-1162804476
|
||||
- # because 'yes' may get terminated by SIGPIPE when plain 'yes | ...' is used
|
||||
- # see https://github.com/rear/rear/issues/2820#issuecomment-1162772415
|
||||
- # and suppress needless "yes: standard output: Broken pipe" stderr messages
|
||||
- # that appear at least with newer 'yes' in coreutils-8.32 in openSUSE Leap 15.3
|
||||
cat >> "$LAYOUT_CODE" <<EOF
|
||||
$ifline
|
||||
LogPrint "Creating LVM volume '$vg/$lvname' (some properties may not be preserved)"
|
||||
$warnraidline
|
||||
- lvm lvcreate $lvopts $vg <<<y
|
||||
+ lvm lvcreate -y $lvopts $vg
|
||||
|
||||
fi
|
||||
EOF
|
||||
- if ! ( yes 2>/dev/null || true ) | lvm lvcreate $lvopts $vg ; then
|
||||
- LogPrintError "Failed to create LVM volume '$vg/$lvname' with lvcreate $lvopts $vg"
|
||||
- if ( yes 2>/dev/null || true ) | lvm lvcreate $fallbacklvopts $vg ; then
|
||||
- LogPrintError "Created LVM volume '$vg/$lvname' using fallback options lvcreate $fallbacklvopts $vg"
|
||||
+ if ! lvm lvcreate -y $lvopts $vg ; then
|
||||
+ LogPrintError "Failed to create LVM volume '$vg/$lvname' with lvcreate -y $lvopts $vg"
|
||||
+ if lvm lvcreate -y $fallbacklvopts $vg ; then
|
||||
+ LogPrintError "Created LVM volume '$vg/$lvname' using fallback options lvcreate -y $fallbacklvopts $vg"
|
||||
else
|
||||
- LogPrintError "Also failed to create LVM volume '$vg/$lvname' with lvcreate $fallbacklvopts $vg"
|
||||
+ LogPrintError "Also failed to create LVM volume '$vg/$lvname' with lvcreate -y $fallbacklvopts $vg"
|
||||
# Explicit 'false' is needed to let the whole 'if then else fi' command exit with non zero exit state
|
||||
# to let diskrestore.sh abort here as usual when a command fails (diskrestore.sh runs with 'set -e'):
|
||||
false
|
||||
|
@ -1,37 +0,0 @@
|
||||
commit 1447530f502305ed08149d9b2a56a51fb91af875
|
||||
Author: Johannes Meixner <jsmeix@suse.com>
|
||||
Date: Wed May 25 13:51:14 2022 +0200
|
||||
|
||||
Merge pull request #2808 from rear/jsmeix-exclude-watchdog
|
||||
|
||||
Exclude dev/watchdog* from the ReaR recovery system:
|
||||
In default.conf add dev/watchdog* to COPY_AS_IS_EXCLUDE
|
||||
because watchdog functionality is not wanted in the recovery system
|
||||
because we do not want any automated reboot functionality
|
||||
while disaster recovery happens via "rear recover",
|
||||
see https://github.com/rear/rear/pull/2808
|
||||
Furthermore having a copy of dev/watchdog*
|
||||
during "rear mkrescue" in ReaR's build area
|
||||
may even trigger a system crash that is caused by a
|
||||
buggy TrendMicro ds_am module touching dev/watchdog
|
||||
in ReaR's build area (/var/tmp/rear.XXX/rootfs),
|
||||
see https://github.com/rear/rear/issues/2798
|
||||
|
||||
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
|
||||
index 881a0af0..cb14da8b 100644
|
||||
--- a/usr/share/rear/conf/default.conf
|
||||
+++ b/usr/share/rear/conf/default.conf
|
||||
@@ -1414,7 +1414,12 @@ COPY_AS_IS=( $SHARE_DIR $VAR_DIR )
|
||||
# We let them being recreated by device mapper in the recovery system during the recovery process.
|
||||
# Copying them into the recovery system would let "rear recover" avoid the migration process.
|
||||
# See https://github.com/rear/rear/pull/1393 for details.
|
||||
-COPY_AS_IS_EXCLUDE=( $VAR_DIR/output/\* dev/.udev dev/shm dev/shm/\* dev/oracleasm dev/mapper )
|
||||
+# /dev/watchdog /dev/watchdog\* functionality is not wanted in the ReaR rescue/recovery system
|
||||
+# because we do not want any automated reboot while disaster recovery happens via "rear recover".
|
||||
+# Furthermore having dev/watchdog* during "rear mkrescue" may even trigger a system "crash" that is
|
||||
+# caused by TrendMicro ds_am module touching dev/watchdog in ReaR's build area (/var/tmp/rear.XXX/rootfs).
|
||||
+# See https://github.com/rear/rear/issues/2798
|
||||
+COPY_AS_IS_EXCLUDE=( $VAR_DIR/output/\* dev/.udev dev/shm dev/shm/\* dev/oracleasm dev/mapper dev/watchdog\* )
|
||||
# Array of user names that are trusted owners of files where RequiredSharedObjects calls ldd (cf. COPY_AS_IS)
|
||||
# and where a ldd test is run inside the recovery system that tests all binaries for 'not found' libraries.
|
||||
# The default is 'root' plus those standard system users that have a 'bin' or 'sbin' or 'root' home directory
|
@ -1,105 +0,0 @@
|
||||
commit 552dd6bfb20fdb3dc712b5243656d147392c27c3
|
||||
Author: Johannes Meixner <jsmeix@suse.com>
|
||||
Date: Thu Jun 2 15:25:52 2022 +0200
|
||||
|
||||
Merge pull request #2811 from rear/jsmeix-RECOVERY_COMMANDS
|
||||
|
||||
Add PRE_RECOVERY_COMMANDS and POST_RECOVERY_COMMANDS
|
||||
as alternative to PRE_RECOVERY_SCRIPT and POST_RECOVERY_SCRIPT
|
||||
see the description in default.conf how to use them and how they work.
|
||||
See https://github.com/rear/rear/pull/2811 and see also
|
||||
https://github.com/rear/rear/pull/2735 therein in particular
|
||||
https://github.com/rear/rear/pull/2735#issuecomment-1134686196
|
||||
Additionally use LogPrint to show the user the executed commands,
|
||||
see https://github.com/rear/rear/pull/2789
|
||||
|
||||
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
|
||||
index cb14da8b..b14525da 100644
|
||||
--- a/usr/share/rear/conf/default.conf
|
||||
+++ b/usr/share/rear/conf/default.conf
|
||||
@@ -3117,14 +3117,37 @@ ELILO_BIN=
|
||||
################ ---- custom scripts
|
||||
#
|
||||
# NOTE: The scripts can be defined as an array to better handly spaces in parameters.
|
||||
-# The scripts are called like this: eval "${PRE_RECOVERY_SCRIPT[@]}"
|
||||
+# The scripts are called like this:
|
||||
+# eval "${PRE_RECOVERY_SCRIPT[@]}"
|
||||
+#
|
||||
+# Alternatively, commands can be executed by using the corresponding
|
||||
+# PRE_RECOVERY_COMMANDS and POST_RECOVERY_COMMANDS array variables
|
||||
+# which evaluate like this:
|
||||
+# for command in "${PRE_RECOVERY_COMMANDS[@]}" ; do
|
||||
+# eval "$command"
|
||||
+# done
|
||||
+#
|
||||
+# Using PRE_RECOVERY_COMMANDS and POST_RECOVERY_COMMANDS
|
||||
+# is simpler when multiple commands should be executed.
|
||||
+# For example,
|
||||
+# PRE_RECOVERY_SCRIPT=( 'echo Hello' ';' 'sleep 3' )
|
||||
+# can be rewritten as
|
||||
+# PRE_RECOVERY_COMMANDS=( 'echo Hello' 'sleep 3' )
|
||||
+# or
|
||||
+# PRE_RECOVERY_COMMANDS=( 'echo Hello' )
|
||||
+# PRE_RECOVERY_COMMANDS+=( 'sleep 3' )
|
||||
+
|
||||
+# Those get called at the very beginning of "rear recover".
|
||||
+# The PRE_RECOVERY_COMMANDS are called directly before the PRE_RECOVERY_SCRIPT.
|
||||
+# Nothing was recreated and you have only the plain ReaR rescue/recovery system:
|
||||
+PRE_RECOVERY_COMMANDS=()
|
||||
+PRE_RECOVERY_SCRIPT=
|
||||
|
||||
-# Call this after Relax-and-Recover did everything in the recover workflow.
|
||||
-# Use $TARGET_FS_ROOT (by default '/mnt/local') to refer to the recovered system.
|
||||
+# Those get called at the very end of "rear recover".
|
||||
+# The POST_RECOVERY_COMMANDS are called directly after the POST_RECOVERY_SCRIPT.
|
||||
+# Use $TARGET_FS_ROOT (by default '/mnt/local') to access the recreated target system.
|
||||
POST_RECOVERY_SCRIPT=
|
||||
-
|
||||
-# Call this before Relax-and-Recover starts to do anything in the recover workflow. You have the rescue system but nothing else
|
||||
-PRE_RECOVERY_SCRIPT=
|
||||
+POST_RECOVERY_COMMANDS=()
|
||||
|
||||
# PRE/POST Backup scripts will provide the ability to run certain tasks before and after a ReaR backup.
|
||||
# for example:
|
||||
diff --git a/usr/share/rear/setup/default/010_pre_recovery_script.sh b/usr/share/rear/setup/default/010_pre_recovery_script.sh
|
||||
index 005107cc..8b4e4a36 100644
|
||||
--- a/usr/share/rear/setup/default/010_pre_recovery_script.sh
|
||||
+++ b/usr/share/rear/setup/default/010_pre_recovery_script.sh
|
||||
@@ -1,4 +1,14 @@
|
||||
+
|
||||
+# The PRE_RECOVERY_COMMANDS are called directly before the PRE_RECOVERY_SCRIPT
|
||||
+# so PRE_RECOVERY_COMMANDS can also be used to prepare things for the PRE_RECOVERY_SCRIPT:
|
||||
+
|
||||
+local command
|
||||
+for command in "${PRE_RECOVERY_COMMANDS[@]}" ; do
|
||||
+ LogPrint "Running PRE_RECOVERY_COMMANDS '$command'"
|
||||
+ eval "$command"
|
||||
+done
|
||||
+
|
||||
if test "$PRE_RECOVERY_SCRIPT" ; then
|
||||
- Log "Running PRE_RECOVERY_SCRIPT '${PRE_RECOVERY_SCRIPT[@]}'"
|
||||
- eval "${PRE_RECOVERY_SCRIPT[@]}"
|
||||
+ LogPrint "Running PRE_RECOVERY_SCRIPT '${PRE_RECOVERY_SCRIPT[@]}'"
|
||||
+ eval "${PRE_RECOVERY_SCRIPT[@]}"
|
||||
fi
|
||||
diff --git a/usr/share/rear/wrapup/default/500_post_recovery_script.sh b/usr/share/rear/wrapup/default/500_post_recovery_script.sh
|
||||
index 77751800..866c9368 100644
|
||||
--- a/usr/share/rear/wrapup/default/500_post_recovery_script.sh
|
||||
+++ b/usr/share/rear/wrapup/default/500_post_recovery_script.sh
|
||||
@@ -1,4 +1,14 @@
|
||||
+
|
||||
+# The POST_RECOVERY_COMMANDS are called directly after the POST_RECOVERY_SCRIPT
|
||||
+# so POST_RECOVERY_COMMANDS can also be used to clean up things after the POST_RECOVERY_SCRIPT:
|
||||
+
|
||||
if test "$POST_RECOVERY_SCRIPT" ; then
|
||||
- Log "Running POST_RECOVERY_SCRIPT '${POST_RECOVERY_SCRIPT[@]}'"
|
||||
- eval "${POST_RECOVERY_SCRIPT[@]}"
|
||||
+ LogPrint "Running POST_RECOVERY_SCRIPT '${POST_RECOVERY_SCRIPT[@]}'"
|
||||
+ eval "${POST_RECOVERY_SCRIPT[@]}"
|
||||
fi
|
||||
+
|
||||
+local command
|
||||
+for command in "${POST_RECOVERY_COMMANDS[@]}" ; do
|
||||
+ LogPrint "Running POST_RECOVERY_COMMANDS '$command'"
|
||||
+ eval "$command"
|
||||
+done
|
@ -1,18 +0,0 @@
|
||||
diff --git a/usr/share/rear/prep/GNU/Linux/220_include_lvm_tools.sh b/usr/share/rear/prep/GNU/Linux/220_include_lvm_tools.sh
|
||||
index 4b73fb05..c7704032 100644
|
||||
--- a/usr/share/rear/prep/GNU/Linux/220_include_lvm_tools.sh
|
||||
+++ b/usr/share/rear/prep/GNU/Linux/220_include_lvm_tools.sh
|
||||
@@ -8,6 +8,13 @@ PROGS+=( lvm dmsetup dmeventd fsadm )
|
||||
|
||||
COPY_AS_IS+=( /etc/lvm )
|
||||
|
||||
+# Workaround for a LVM segfault when creating a PV with an UUID already present
|
||||
+# in the device file: omit the device file from the rescue system
|
||||
+# https://bugzilla.redhat.com/show_bug.cgi?id=2117937
|
||||
+# proper fix:
|
||||
+# https://sourceware.org/git/?p=lvm2.git;a=commit;h=8c3cfc75c72696ae8b620555fcc4f815b0c1d6b6
|
||||
+COPY_AS_IS_EXCLUDE+=( /etc/lvm/devices )
|
||||
+
|
||||
if lvs --noheadings -o thin_count | grep -q -v "^\s*$" ; then
|
||||
# There are Thin Pools on the system, include required binaries
|
||||
PROGS+=( thin_check )
|
@ -1,129 +0,0 @@
|
||||
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
|
||||
|
@ -0,0 +1,587 @@
|
||||
commit 88f11d19d748fff3f36357ef1471ee75fbfacabb
|
||||
Merge: bca0e7a9 4b4efc58
|
||||
Author: Johannes Meixner <jsmeix@suse.com>
|
||||
Date: Wed Aug 3 15:04:20 2022 +0200
|
||||
|
||||
Merge pull request #2844 from rear/jsmeix-overhauled-290_kernel_cmdline
|
||||
|
||||
Overhauled rescue/GNU/Linux/290_kernel_cmdline.sh
|
||||
in particular to make it possible to add several already existing
|
||||
kernel options by this script with same kernel option keyword
|
||||
for example when /proc/cmdline contains
|
||||
... console=ttyS0,9600 ... console=tty0 ...
|
||||
then via COPY_KERNEL_PARAMETERS+=( console )
|
||||
cf. https://github.com/rear/rear/pull/2749#issuecomment-1197843273
|
||||
|
||||
Cherry-picked-by: Lukáš Zaoral <lzaoral@redhat.com>
|
||||
|
||||
diff --git a/usr/share/rear/rescue/GNU/Linux/290_kernel_cmdline.sh b/usr/share/rear/rescue/GNU/Linux/290_kernel_cmdline.sh
|
||||
index 0e11204b..eb6c45de 100644
|
||||
--- a/usr/share/rear/rescue/GNU/Linux/290_kernel_cmdline.sh
|
||||
+++ b/usr/share/rear/rescue/GNU/Linux/290_kernel_cmdline.sh
|
||||
@@ -1,8 +1,15 @@
|
||||
-# purpose of the script is to detect some important KERNEL CMDLINE options on the current system
|
||||
-# we should also use in rescue mode (automatically update KERNEL_CMDLINE array variable).
|
||||
+# Purpose of the script is to get the COPY_KERNEL_PARAMETERS on the current system
|
||||
+# to be used in the rescue/recovery system via automated update of KERNEL_CMDLINE.
|
||||
|
||||
-# Scanning current kernel cmdline to look for important option ($COPY_KERNEL_PARAMETERS) to include in KERNEL_CMDLINE
|
||||
-for current_kernel_option in $( cat /proc/cmdline ); do
|
||||
+# Also protect the rescue/recovery system by removing net.ifnames=0 from KERNEL_CMDLINE
|
||||
+# if net.ifnames=0 is in KERNEL_CMDLINE but persistent network interface naming is used:
|
||||
+local persistent_naming='no'
|
||||
+is_persistent_ethernet_name $( ip route | awk '$2 == "dev" && $8 == "src" { print $3 }' | sort -u | head -n1 ) && persistent_naming='yes'
|
||||
+
|
||||
+# Scan current kernel cmdline for options in COPY_KERNEL_PARAMETERS to be included in KERNEL_CMDLINE:
|
||||
+local current_kernel_option
|
||||
+local new_kernel_options_to_add=()
|
||||
+for current_kernel_option in $( cat /proc/cmdline ) ; do
|
||||
# Get the current kernel option name (part before leftmost "=") and
|
||||
# add the whole option (with value) to new_kernel_options_to_add array
|
||||
# if the option name is part of COPY_KERNEL_PARAMETERS array:
|
||||
@@ -11,41 +18,45 @@ for current_kernel_option in $( cat /proc/cmdline ); do
|
||||
fi
|
||||
done
|
||||
|
||||
-# Verify if the kernel option we want to add to KERNEL_CMDLINE are not already set/force by the user in the rear configuration.
|
||||
-# If yes, the parameter set in the configuration file have the priority and superseed the current kernel option.
|
||||
+# Check if the kernel options we want to add to KERNEL_CMDLINE are already set by the user in KERNEL_CMDLINE.
|
||||
+# If yes, the user setting has priority and superseds the kernel option from the current system.
|
||||
+# For the check use the existing KERNEL_CMDLINE when this script is started
|
||||
+# and not the modified KERNEL_CMDLINE with already added kernel options
|
||||
+# to make it possible to add several kernel options by this script
|
||||
+# with same kernel option keyword like console=ttyS0,9600 console=tty0
|
||||
+# see https://github.com/rear/rear/pull/2749#issuecomment-1197843273
|
||||
+# and https://github.com/rear/rear/pull/2844
|
||||
+local existing_kernel_cmdline="$KERNEL_CMDLINE"
|
||||
+local existing_kernel_option new_kernel_option new_kernel_option_keyword
|
||||
for new_kernel_option in "${new_kernel_options_to_add[@]}" ; do
|
||||
new_kernel_option_keyword="${new_kernel_option%%=*}"
|
||||
-
|
||||
- for rear_kernel_option in $KERNEL_CMDLINE ; do
|
||||
- # Check if a kernel option key without value parameter (everything before =) is not already present in rear KERNEL_CMDLINE array.
|
||||
- if test "$new_kernel_option_keyword" = "${rear_kernel_option%%=*}" ; then
|
||||
- Log "Current kernel option [$new_kernel_option] supperseeded by [$rear_kernel_option] in your rear configuration: (KERNEL_CMDLINE)"
|
||||
+ for existing_kernel_option in $existing_kernel_cmdline ; do
|
||||
+ if test "$new_kernel_option_keyword" = "${existing_kernel_option%%=*}" ; then
|
||||
+ LogPrint "Not adding '$new_kernel_option' (superseded by existing '$existing_kernel_option' in KERNEL_CMDLINE)"
|
||||
# Continue with the next new_kernel_option (i.e. continue the outer 'for' loop):
|
||||
continue 2
|
||||
fi
|
||||
done
|
||||
-
|
||||
+ # If we are using persistent naming do not add net.ifnames to KERNEL_CMDLINE
|
||||
+ # see https://github.com/rear/rear/pull/1874
|
||||
+ # and continue with the next new_kernel_option:
|
||||
if test "net.ifnames" = "$new_kernel_option_keyword" ; then
|
||||
- # If we are using persistent naming do not add net.ifnames to KERNEL_CMDLINE
|
||||
- # see https://github.com/rear/rear/pull/1874
|
||||
- # and continue with the next new_kernel_option:
|
||||
- is_persistent_ethernet_name $( ip r | awk '$2 == "dev" && $8 == "src" { print $3 }' | sort -u | head -1 ) && continue
|
||||
+ if is_true $persistent_naming ; then
|
||||
+ LogPrint "Not adding '$new_kernel_option' (persistent network interface naming is used)"
|
||||
+ continue
|
||||
+ fi
|
||||
fi
|
||||
-
|
||||
- LogPrint "Adding $new_kernel_option to KERNEL_CMDLINE"
|
||||
- KERNEL_CMDLINE="$KERNEL_CMDLINE $new_kernel_option"
|
||||
+ LogPrint "Adding '$new_kernel_option' to KERNEL_CMDLINE"
|
||||
+ KERNEL_CMDLINE+=" $new_kernel_option"
|
||||
done
|
||||
|
||||
-# In case we added 'KERNEL_CMDLINE="$KERNEL_CMDLINE net.ifnames=0"' to /etc/rear/local.conf, but we have no idea if we
|
||||
-# are using persistent naming or not then we should protect the rescue image from doing stupid things and remove
|
||||
-# the keyword (and value) in a preventive way in case "persistent naming is in use".
|
||||
-# And, to be clear the /proc/cmdline did not contain the keyword net.ifnames
|
||||
-
|
||||
-if is_persistent_ethernet_name $( ip r | awk '$2 == "dev" && $8 == "src" { print $3 }' | sort -u | head -1 ) ; then
|
||||
- # persistent naming is in use
|
||||
- # When the KERNEL_CMDLINE does NOT contain net.ifnames=0 silently return
|
||||
- echo $KERNEL_CMDLINE | grep -q 'net.ifnames=0' || return
|
||||
- # Remove net.ifnames=0 from KERNEL_CMDLINE
|
||||
- KERNEL_CMDLINE=$( echo $KERNEL_CMDLINE | sed -e 's/net.ifnames=0//' )
|
||||
- LogPrint "Removing net.ifnames=0 from KERNEL_CMDLINE"
|
||||
+# The user may have added 'net.ifnames=0' to KERNEL_CMDLINE in /etc/rear/local.conf
|
||||
+# but he may not know whether or not persistent naming is used.
|
||||
+# So we should protect the rescue/recovery system from doing "stupid things"
|
||||
+# and remove 'net.ifnames=0' in a preventive way when persistent naming is used:
|
||||
+if is_true $persistent_naming ; then
|
||||
+ if echo $KERNEL_CMDLINE | grep -q 'net.ifnames=0' ; then
|
||||
+ KERNEL_CMDLINE=$( echo $KERNEL_CMDLINE | sed -e 's/net.ifnames=0//' )
|
||||
+ LogPrint "Removed 'net.ifnames=0' from KERNEL_CMDLINE (persistent network interface naming is used)"
|
||||
+ fi
|
||||
fi
|
||||
|
||||
commit 42e04f36f5f8eea0017915bb35e56ee285b394d7
|
||||
Merge: 7c6296db 940fede7
|
||||
Author: Johannes Meixner <jsmeix@suse.com>
|
||||
Date: Tue Jan 31 13:13:56 2023 +0100
|
||||
|
||||
Merge pull request #2915 from rear/jsmeix-serial-devs-fail-safe
|
||||
|
||||
In lib/serial-functions.sh make the
|
||||
get_serial_console_devices() function
|
||||
fail-safe if no serial device node exists, see
|
||||
https://github.com/rear/rear/issues/2914
|
||||
|
||||
diff --git a/usr/share/rear/lib/serial-functions.sh b/usr/share/rear/lib/serial-functions.sh
|
||||
index aac5dc88..3d421b52 100644
|
||||
--- a/usr/share/rear/lib/serial-functions.sh
|
||||
+++ b/usr/share/rear/lib/serial-functions.sh
|
||||
@@ -1,13 +1,24 @@
|
||||
|
||||
# Get available serial devices:
|
||||
function get_serial_console_devices () {
|
||||
- test "$SERIAL_CONSOLE_DEVICES" && echo $SERIAL_CONSOLE_DEVICES || ls /dev/ttyS[0-9]* /dev/hvsi[0-9]* | sort
|
||||
+ # Via SERIAL_CONSOLE_DEVICES the user specifies which ones to use (and no others):
|
||||
+ if test "$SERIAL_CONSOLE_DEVICES" ; then
|
||||
+ echo $SERIAL_CONSOLE_DEVICES
|
||||
+ return 0
|
||||
+ fi
|
||||
+ # Test if there is /dev/ttyS[0-9]* or /dev/hvsi[0-9]*
|
||||
+ # because when there is neither /dev/ttyS[0-9]* nor /dev/hvsi[0-9]*
|
||||
+ # the ls command below would become plain 'ls' because of 'nullglob'
|
||||
+ # cf. "Beware of the emptiness" in https://github.com/rear/rear/wiki/Coding-Style
|
||||
+ # see https://github.com/rear/rear/issues/2914#issuecomment-1396659184
|
||||
+ # and return 0 because it is no error when no serial device node exists
|
||||
+ test "$( echo -n /dev/ttyS[0-9]* /dev/hvsi[0-9]* )" || return 0
|
||||
# Use plain 'sort' which results /dev/ttyS0 /dev/ttyS1 /dev/ttyS10 ... /dev/ttyS19 /dev/ttyS2 /dev/ttyS20 ...
|
||||
# to get at least /dev/ttyS0 and /dev/ttyS1 before the other /dev/ttyS* devices because
|
||||
# we cannot use "sort -V" which would result /dev/ttyS0 /dev/ttyS1 ... /dev/ttyS9 /dev/ttyS10 ...
|
||||
# because in older Linux distributions 'sort' does not support '-V' e.g. SLES10 with GNU coreutils 5.93
|
||||
# (SLES11 with GNU coreutils 8.12 supports 'sort -V') but if 'sort' fails there is no output at all
|
||||
- # cf. "Maintain backward compatibility" at https://github.com/rear/rear/wiki/Coding-Style
|
||||
+ # cf. "Maintain backward compatibility" in https://github.com/rear/rear/wiki/Coding-Style
|
||||
# Furthermore 'sort' results that /dev/hvsi* devices appear before /dev/ttyS* devices
|
||||
# so the create_grub2_serial_entry function in lib/bootloader-functions.sh
|
||||
# which uses by default the first one and skips the rest will result that
|
||||
@@ -16,7 +27,8 @@ function get_serial_console_devices () {
|
||||
# that have the HVSI driver loaded (a console driver for IBM's p5 servers)
|
||||
# cf. https://lwn.net/Articles/98442/
|
||||
# and it seems right that when special console drivers are loaded
|
||||
- # then their devices should be preferred by default.
|
||||
+ # then their devices should be preferred by default:
|
||||
+ ls /dev/ttyS[0-9]* /dev/hvsi[0-9]* | sort
|
||||
}
|
||||
|
||||
# Get the serial device speed for those device nodes that belong to actual serial devices.
|
||||
|
||||
commit 07da02143b5597b202e66c187e53103561018255
|
||||
Merge: 91942f63 75a23e79
|
||||
Author: Johannes Meixner <jsmeix@suse.com>
|
||||
Date: Fri Oct 20 14:45:23 2023 +0200
|
||||
|
||||
Merge pull request #2961 from rear/jsmeix-copy-serial-console
|
||||
|
||||
For the automated serial console setup for the recovery system
|
||||
use only the 'console=...' kernel arguments from the original system
|
||||
which fixes https://github.com/rear/rear/issues/2843
|
||||
and it means that no longer all "real serial devices" get
|
||||
auto-enabled as serial consoles in the recovery system, see
|
||||
https://github.com/rear/rear/pull/2749#issuecomment-1196650631
|
||||
That new default behaviour is described in default.conf.
|
||||
In particular prep/GNU/Linux/200_include_serial_console.sh
|
||||
and lib/serial-functions.sh were overhauled which results
|
||||
that rescue/GNU/Linux/400_use_serial_console.sh is obsolete.
|
||||
|
||||
Cherry-picked-by: Lukáš Zaoral <lzaoral@redhat.com>
|
||||
|
||||
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
|
||||
index ec1691b6..76355fb8 100644
|
||||
--- a/usr/share/rear/conf/default.conf
|
||||
+++ b/usr/share/rear/conf/default.conf
|
||||
@@ -3320,39 +3320,90 @@ SIMPLIFY_TEAMING=no
|
||||
SIMPLIFY_TEAMING=no
|
||||
|
||||
# Serial console support for the ReaR rescue/recovery system:
|
||||
-# By default serial consoles get enabled if serial devices are found and
|
||||
-# then matching kernel command line parameters like 'console=ttyS0,9600 console=ttyS1,9600'
|
||||
-# are set when booting the rescue/recovery system (see KERNEL_CMDLINE above).
|
||||
# IA64 platforms require it and people need it when no VGA console is available.
|
||||
-# Specify 'yes' or 'no' or leave it empty to use ReaR's automatism:
|
||||
+# By default there is serial console support in the ReaR recovery system
|
||||
+# when 'getty' or 'agetty' and 'stty' can be found,
|
||||
+# otherwise USE_SERIAL_CONSOLE is automatically set to 'no'.
|
||||
+# When 'getty' or 'agetty' and 'stty' can be found
|
||||
+# and there is a 'console=...' option in /proc/cmdline,
|
||||
+# then USE_SERIAL_CONSOLE is automatically set to 'yes'.
|
||||
+# With USE_SERIAL_CONSOLE="no" no serial console gets set up,
|
||||
+# neither for the recovery system kernel nor for the recovery system bootloader.
|
||||
+# With USE_SERIAL_CONSOLE="yes" plus appropriate SERIAL_CONSOLE_DEVICE... settings
|
||||
+# serial consoles can be specified for the recovery system kernel and bootloader
|
||||
+# for example when there is no 'console=...' option in /proc/cmdline
|
||||
+# or when serial consoles for the recovery system kernel and bootloader
|
||||
+# should differ from what 'console=...' options in /proc/cmdline tell.
|
||||
+# By default (when empty) the automatism further described below is used:
|
||||
USE_SERIAL_CONSOLE=
|
||||
-# If you do not want to use all serial devices found as console you can specify the ones to use
|
||||
-# e.g. SERIAL_CONSOLE_DEVICES="/dev/ttyS0 /dev/ttyS1" provided USE_SERIAL_CONSOLE is turned on.
|
||||
-# By default (when empty) all serial devices found are used:
|
||||
+#
|
||||
+# Devices to be used in general for serial console setup
|
||||
+# unless explicitly specified via SERIAL_CONSOLE_DEVICES_KERNEL
|
||||
+# or SERIAL_CONSOLE_DEVICE_SYSLINUX or SERIAL_CONSOLE_DEVICE_GRUB:
|
||||
+# E.g. SERIAL_CONSOLE_DEVICES="/dev/ttyS0 /dev/ttyS1"
|
||||
SERIAL_CONSOLE_DEVICES=
|
||||
-# Serial consoles for the kernel of the recovery system:
|
||||
+#
|
||||
+# Serial consoles for the kernel of the recovery system
|
||||
+# provided USE_SERIAL_CONSOLE is not 'no':
|
||||
# SERIAL_CONSOLE_DEVICES_KERNEL can be device nodes like "/dev/ttyS0 /dev/ttyS1"
|
||||
# or 'console=...' kernel parameters like "console=ttyS1,9600 console=tty0" or both like
|
||||
# SERIAL_CONSOLE_DEVICES_KERNEL="/dev/ttyS0 console=ttyS1,9600 console=tty0"
|
||||
-# provided USE_SERIAL_CONSOLE is turned on.
|
||||
-# By default (when empty) the SERIAL_CONSOLE_DEVICES are used for the kernel:
|
||||
+# When SERIAL_CONSOLE_DEVICES_KERNEL is empty but SERIAL_CONSOLE_DEVICES is specified
|
||||
+# then the specified SERIAL_CONSOLE_DEVICES are used for the kernel.
|
||||
+# By default (when SERIAL_CONSOLE_DEVICES_KERNEL and SERIAL_CONSOLE_DEVICES are empty)
|
||||
+# serial consoles get enabled for the recovery system kernel via COPY_KERNEL_PARAMETERS
|
||||
+# for all 'console=...' options that are found in /proc/cmdline.
|
||||
SERIAL_CONSOLE_DEVICES_KERNEL=
|
||||
-# Serial console for SYSLINUX/EXTLINUX when it is used as bootloader for the recovery system:
|
||||
+#
|
||||
+# Serial console for SYSLINUX/EXTLINUX when it is used as bootloader for the recovery system
|
||||
+# provided USE_SERIAL_CONSOLE is 'yes' (automatically with 'console=...' in /proc/cmdline):
|
||||
# SYSLINUX supports only one serial device (because the last SYSLINUX 'serial' directive wins).
|
||||
# The right /dev/ttyS* can be specified like SERIAL_CONSOLE_DEVICE_SYSLINUX="/dev/ttyS0"
|
||||
# or a whole SYSLINUX 'serial' directive can be specified e.g. for /dev/ttyS1 like
|
||||
# SERIAL_CONSOLE_DEVICE_SYSLINUX="serial 1 9600"
|
||||
-# provided USE_SERIAL_CONSOLE is turned on.
|
||||
-# By default (when empty) the first one of SERIAL_CONSOLE_DEVICES is used for SYSLINUX:
|
||||
+# When SERIAL_CONSOLE_DEVICE_SYSLINUX is empty but SERIAL_CONSOLE_DEVICES is specified
|
||||
+# then the first one of SERIAL_CONSOLE_DEVICES is used for SYSLINUX.
|
||||
+# By default (when SERIAL_CONSOLE_DEVICE_SYSLINUX and SERIAL_CONSOLE_DEVICES are empty)
|
||||
+# the devices of the 'console=...' options in /proc/cmdline
|
||||
+# that exist as /dev/ttyS* or /dev/hvsi* character device nodes are used
|
||||
+# (which excludes /dev/tty0 when there is 'console=tty0' in /proc/cmdline).
|
||||
SERIAL_CONSOLE_DEVICE_SYSLINUX=
|
||||
-# Serial console for GRUB when it is used as bootloader for the recovery system:
|
||||
+#
|
||||
+# Serial console for GRUB when it is used as bootloader for the recovery system
|
||||
+# provided USE_SERIAL_CONSOLE is 'yes' (automatically with 'console=...' in /proc/cmdline):
|
||||
# GRUB supports only one serial device (because the last GRUB 'serial' command wins).
|
||||
# The right /dev/ttyS* can be specified like SERIAL_CONSOLE_DEVICE_GRUB="/dev/ttyS0"
|
||||
# or a whole GRUB 'serial' command can be specified e.g. for /dev/ttyS1 like
|
||||
# SERIAL_CONSOLE_DEVICE_GRUB="serial --unit=1 --speed=9600"
|
||||
-# provided USE_SERIAL_CONSOLE is turned on.
|
||||
-# By default (when empty) the first one of SERIAL_CONSOLE_DEVICES is used for GRUB:
|
||||
+# When SERIAL_CONSOLE_DEVICE_GRUB is empty but SERIAL_CONSOLE_DEVICES is specified
|
||||
+# then the first one of SERIAL_CONSOLE_DEVICES is used for GRUB.
|
||||
+# By default (when SERIAL_CONSOLE_DEVICE_GRUB and SERIAL_CONSOLE_DEVICES are empty)
|
||||
+# the devices of the 'console=...' options in /proc/cmdline
|
||||
+# that exist as /dev/ttyS* or /dev/hvsi* character device nodes are used
|
||||
+# (which excludes /dev/tty0 when there is 'console=tty0' in /proc/cmdline).
|
||||
SERIAL_CONSOLE_DEVICE_GRUB=
|
||||
+#
|
||||
+# Examples
|
||||
+# (provided USE_SERIAL_CONSOLE is not 'no'
|
||||
+# and 'getty' or 'agetty' and 'stty' can be found):
|
||||
+#
|
||||
+# Default behaviour
|
||||
+# when there is no 'console=...' option in /proc/cmdline
|
||||
+# then no serial console is set up for the recovery system.
|
||||
+#
|
||||
+# Default behaviour when there are for example
|
||||
+# 'console=ttyS0,9600' and 'console=tty0' in /proc/cmdline
|
||||
+# then 'console=ttyS0,9600' and 'console=tty0'
|
||||
+# are used for the recovery system kernel
|
||||
+# and only /dev/ttyS0 is used as serial console
|
||||
+# for the recovery system bootloader (SYSLINUX or GRUB).
|
||||
+#
|
||||
+# On a headless machine without VGA card but with serial device /dev/ttyS0
|
||||
+# the kernel would choose /dev/ttyS0 as its console automatically
|
||||
+# so no 'console=...' kernel option needs to be used and then the automatism described above
|
||||
+# would not set up a console for the recovery system (in particular not for the bootloader).
|
||||
+# In this case USE_SERIAL_CONSOLE="yes" and appropriate SERIAL_CONSOLE_DEVICE... settings
|
||||
+# are needed to manually specify the right console setup for the recovery system.
|
||||
|
||||
# Say "y", "Yes", etc, to enable or "n", "No" etc. to disable the DHCP client protocol or leave empty to autodetect.
|
||||
# When enabled, lets the rescue/recovery system run dhclient to get an IP address
|
||||
# instead of using the same IP address as the original system:
|
||||
diff --git a/usr/share/rear/lib/serial-functions.sh b/usr/share/rear/lib/serial-functions.sh
|
||||
index 3d421b52..a586d357 100644
|
||||
--- a/usr/share/rear/lib/serial-functions.sh
|
||||
+++ b/usr/share/rear/lib/serial-functions.sh
|
||||
@@ -6,29 +6,34 @@ function get_serial_console_devices () {
|
||||
echo $SERIAL_CONSOLE_DEVICES
|
||||
return 0
|
||||
fi
|
||||
- # Test if there is /dev/ttyS[0-9]* or /dev/hvsi[0-9]*
|
||||
- # because when there is neither /dev/ttyS[0-9]* nor /dev/hvsi[0-9]*
|
||||
- # the ls command below would become plain 'ls' because of 'nullglob'
|
||||
- # cf. "Beware of the emptiness" in https://github.com/rear/rear/wiki/Coding-Style
|
||||
- # see https://github.com/rear/rear/issues/2914#issuecomment-1396659184
|
||||
- # and return 0 because it is no error when no serial device node exists
|
||||
- test "$( echo -n /dev/ttyS[0-9]* /dev/hvsi[0-9]* )" || return 0
|
||||
- # Use plain 'sort' which results /dev/ttyS0 /dev/ttyS1 /dev/ttyS10 ... /dev/ttyS19 /dev/ttyS2 /dev/ttyS20 ...
|
||||
- # to get at least /dev/ttyS0 and /dev/ttyS1 before the other /dev/ttyS* devices because
|
||||
- # we cannot use "sort -V" which would result /dev/ttyS0 /dev/ttyS1 ... /dev/ttyS9 /dev/ttyS10 ...
|
||||
- # because in older Linux distributions 'sort' does not support '-V' e.g. SLES10 with GNU coreutils 5.93
|
||||
- # (SLES11 with GNU coreutils 8.12 supports 'sort -V') but if 'sort' fails there is no output at all
|
||||
- # cf. "Maintain backward compatibility" in https://github.com/rear/rear/wiki/Coding-Style
|
||||
- # Furthermore 'sort' results that /dev/hvsi* devices appear before /dev/ttyS* devices
|
||||
- # so the create_grub2_serial_entry function in lib/bootloader-functions.sh
|
||||
- # which uses by default the first one and skips the rest will result that
|
||||
- # the first /dev/hvsi* device becomes used for the GRUB serial console by default
|
||||
- # which looks right because /dev/hvsi* devices should exist only on systems
|
||||
- # that have the HVSI driver loaded (a console driver for IBM's p5 servers)
|
||||
- # cf. https://lwn.net/Articles/98442/
|
||||
- # and it seems right that when special console drivers are loaded
|
||||
- # then their devices should be preferred by default:
|
||||
- ls /dev/ttyS[0-9]* /dev/hvsi[0-9]* | sort
|
||||
+ # Scan the kernel command line of the currently running original system
|
||||
+ # for 'console=<device>[,<options>]' settings e.g. 'console=ttyS1,9600n8 ... console=ttyS3 ... console=tty0'
|
||||
+ # and extract the specified serial device nodes e.g. ttyS1 -> /dev/ttyS1 ... ttyS3 -> /dev/ttyS3
|
||||
+ local kernel_option console_option_value console_option_device
|
||||
+ for kernel_option in $( cat /proc/cmdline ) ; do
|
||||
+ # Continue with next kernel option when the option name (part before leftmost "=") is not 'console':
|
||||
+ test "${kernel_option%%=*}" = "console" || continue
|
||||
+ # Get the console option value (part after leftmost "=") e.g. 'ttyS1,9600n8' 'ttyS3' 'tty0'
|
||||
+ console_option_value="${kernel_option#*=}"
|
||||
+ # Get the console option device (part before leftmost optional ',' separator) e.g. 'ttyS1' 'ttyS3' 'tty0'
|
||||
+ console_option_device="${console_option_value%%,*}"
|
||||
+ # Continue with next kernel option when the current console option device is no serial device (exclude 'tty0').
|
||||
+ # The special /dev/hvsi* devices should exist only on systems that have the HVSI driver loaded
|
||||
+ # (a console driver for IBM's p5 servers) cf. https://lwn.net/Articles/98442/
|
||||
+ [[ $console_option_device == ttyS* ]] || [[ $console_option_device == hvsi* ]] || continue
|
||||
+ # Test that the matching serial device node e.g. ttyS1 -> /dev/ttyS1 and ttyS3 -> /dev/ttyS3' exists
|
||||
+ # to avoid that this automated serial console setup may not work in the ReaR recovery system
|
||||
+ # when serial device nodes get specified for the recovery system that do not exist
|
||||
+ # in the currently running original system because the default assumption is
|
||||
+ # that the replacement system has same hardware as the original system,
|
||||
+ # cf. https://github.com/rear/rear/pull/2749#issuecomment-1196650631
|
||||
+ # (if needed the user can specify what he wants via SERIAL_CONSOLE_DEVICES, see above):
|
||||
+ if ! test -c "/dev/$console_option_device" ; then
|
||||
+ LogPrintError "Found '$kernel_option' in /proc/cmdline but '/dev/$console_option_device' is no character device"
|
||||
+ continue
|
||||
+ fi
|
||||
+ echo /dev/$console_option_device
|
||||
+ done
|
||||
}
|
||||
|
||||
# Get the serial device speed for those device nodes that belong to actual serial devices.
|
||||
@@ -39,64 +44,15 @@ function get_serial_device_speed () {
|
||||
# Run it in a subshell so that 'set -o pipefail' does not affect the current shell and
|
||||
# it can run in a subshell because the caller of this function only needs its stdout
|
||||
# cf. the function get_root_disk_UUID in lib/bootloader-functions.sh
|
||||
- # so when stty fails the get_serial_device_speed return code is the stty exit code and not the awk exit code
|
||||
- # therefore one can call get_serial_device_speed with error checking for example like
|
||||
+ # so when stty fails the get_serial_device_speed return code is the stty exit code and not the awk exit code.
|
||||
+ # Therefore one can call get_serial_device_speed with error checking for example like
|
||||
# speed=$( get_serial_device_speed $serial_device ) && COMMAND_WITH_speed || COMMAND_WITHOUT_speed
|
||||
- # because the return code of variable=$( PIPE ) is the return code of the pipe,
|
||||
- # cf. how get_serial_device_speed is called in cmdline_add_console below.
|
||||
+ # because the return code of variable=$( PIPE ) is the return code of the pipe
|
||||
+ # cf. how get_serial_device_speed is called in lib/bootloader-functions.sh
|
||||
+ # and output/USB/Linux-i386/300_create_extlinux.sh
|
||||
# Suppress stty stderr output because for most /dev/ttyS* device nodes the result is
|
||||
# stty: /dev/ttyS...: Input/output error
|
||||
# when the device node does not belong to an actual serial device (i.e. to real serial hardware)
|
||||
# so get_serial_device_speed is also used to get those device nodes that belong to real serial devices:
|
||||
( set -o pipefail ; stty -F $devnode 2>/dev/null | awk '/^speed / { print $2 }' )
|
||||
}
|
||||
-
|
||||
-# Add serial console to kernel cmdline:
|
||||
-function cmdline_add_console {
|
||||
- # Nothing to do when using serial console is not wanted:
|
||||
- is_true "$USE_SERIAL_CONSOLE" || return 0
|
||||
-
|
||||
- # Strip existing 'console=...' kernel cmd parameters:
|
||||
- local param cmdline=""
|
||||
- for param in $KERNEL_CMDLINE ; do
|
||||
- case "$param" in
|
||||
- (console=*) ;;
|
||||
- (*) cmdline+=" $param";;
|
||||
- esac
|
||||
- done
|
||||
-
|
||||
- # Add serial console config to kernel cmd line:
|
||||
- local devnode speed=""
|
||||
- if test "$SERIAL_CONSOLE_DEVICES_KERNEL" ; then
|
||||
- # When the user has specified SERIAL_CONSOLE_DEVICES_KERNEL use only that (no automatisms):
|
||||
- for devnode in $SERIAL_CONSOLE_DEVICES_KERNEL ; do
|
||||
- # devnode can be a character device node like "/dev/ttyS0" or "/dev/lp0" or "/dev/ttyUSB0"
|
||||
- # cf. https://www.kernel.org/doc/html/latest/admin-guide/serial-console.html
|
||||
- # or devnode can be a 'console=...' kernel cmd parameter like "console=ttyS1,9600"
|
||||
- if test -c "$devnode" ; then
|
||||
- if speed=$( get_serial_device_speed $devnode ) ; then
|
||||
- cmdline+=" console=${devnode##/dev/},$speed"
|
||||
- else
|
||||
- cmdline+=" console=${devnode##/dev/}"
|
||||
- fi
|
||||
- else
|
||||
- # When devnode is a 'console=...' kernel cmd parameter use it as specified:
|
||||
- cmdline+=" $devnode"
|
||||
- fi
|
||||
- done
|
||||
- else
|
||||
- local real_consoles=""
|
||||
- for devnode in $( get_serial_console_devices ) ; do
|
||||
- # Only add for those device nodes that belong to actual serial devices:
|
||||
- speed=$( get_serial_device_speed $devnode ) && real_consoles+=" console=${devnode##/dev/},$speed"
|
||||
- done
|
||||
- cmdline+=" $real_consoles"
|
||||
-
|
||||
- # Add fallback console if no real serial device was found:
|
||||
- test "$real_consoles" || cmdline+=" console=tty0"
|
||||
- fi
|
||||
-
|
||||
- # Have a trailing space to be on the safe side
|
||||
- # so that more kernel cmd parameters could be "just appended" by other scripts:
|
||||
- echo "$cmdline "
|
||||
-}
|
||||
diff --git a/usr/share/rear/prep/GNU/Linux/200_include_serial_console.sh b/usr/share/rear/prep/GNU/Linux/200_include_serial_console.sh
|
||||
index 214af3c4..14ec113e 100644
|
||||
--- a/usr/share/rear/prep/GNU/Linux/200_include_serial_console.sh
|
||||
+++ b/usr/share/rear/prep/GNU/Linux/200_include_serial_console.sh
|
||||
@@ -1,31 +1,115 @@
|
||||
|
||||
-# If possible auto-enable serial console when not specified:
|
||||
-if [[ -z "$USE_SERIAL_CONSOLE" ]] ; then
|
||||
- local devnode speed=""
|
||||
- for devnode in $( get_serial_console_devices ) ; do
|
||||
- # Enable serial console when there is at least one real serial device:
|
||||
- if speed=$( get_serial_device_speed $devnode ) ; then
|
||||
- USE_SERIAL_CONSOLE="yes"
|
||||
- break
|
||||
- fi
|
||||
- done
|
||||
-fi
|
||||
+# This script prep/GNU/Linux/200_include_serial_console.sh
|
||||
+# is the first ...console... script that is run for "rear mkrescue/mkbackup".
|
||||
+#
|
||||
+# When USE_SERIAL_CONSOLE is empty then this script decides
|
||||
+# if USE_SERIAL_CONSOLE is kept empty
|
||||
+# or (provided there is sufficient reason)
|
||||
+# it sets USE_SERIAL_CONSOLE to 'no' or 'yes'.
|
||||
+# It sets USE_SERIAL_CONSOLE to 'no'
|
||||
+# when serial consoles cannot work in the recovery system.
|
||||
+# It sets USE_SERIAL_CONSOLE to 'yes'
|
||||
+# when a serial console will be set up for the recovery system kernel.
|
||||
+# Only when a serial console will be actually set up for the recovery system kernel,
|
||||
+# then it makes sense to also set up a serial console for the recovery system bootloader.
|
||||
+# So serial console setup for the recovery system bootloader is only done if USE_SERIAL_CONSOLE="yes"
|
||||
+# because an empty USE_SERIAL_CONSOLE must not result serial console setup for the recovery system bootloader
|
||||
+# (without actual serial console setup for the recovery system kernel).
|
||||
|
||||
-# Always include getty or agetty as we don't know in advance whether they are needed
|
||||
+# Always try to include getty or agetty as we do not know in advance whether they are needed
|
||||
# (the user may boot the recovery system with manually specified kernel options
|
||||
# to get serial console support in his recovery system).
|
||||
-# For serial support we need to include the agetty binary,
|
||||
-# but Debian distro's use getty instead of agetty:
|
||||
-local getty_binary=""
|
||||
+# For serial console support we need to include 'getty' or 'agetty'.
|
||||
+# Debian distributions (in particular Ubuntu) use 'getty'.
|
||||
+# Fedora, RHEL, SLES,... use 'agetty'.
|
||||
if has_binary getty ; then
|
||||
- # Debian, Ubuntu,...
|
||||
- getty_binary="getty"
|
||||
+ PROGS+=( getty )
|
||||
elif has_binary agetty ; then
|
||||
- # Fedora, RHEL, SLES,...
|
||||
- getty_binary="agetty"
|
||||
+ PROGS+=( agetty )
|
||||
+else
|
||||
+ is_true "$USE_SERIAL_CONSOLE" && Error "Failed to find 'getty' or 'agetty' (USE_SERIAL_CONSOLE is 'true')"
|
||||
+ LogPrintError "No serial console support (failed to find 'getty' or 'agetty')"
|
||||
+ USE_SERIAL_CONSOLE="no"
|
||||
+fi
|
||||
+
|
||||
+# Also try to include 'stty' which is (currently) only needed for serial console support
|
||||
+# in skel/default/etc/scripts/system-setup.d/45-serial-console.sh
|
||||
+# and lib/serial-functions.sh
|
||||
+if has_binary stty ; then
|
||||
+ PROGS+=( stty )
|
||||
else
|
||||
- # The user must have the programs in REQUIRED_PROGS installed on his system:
|
||||
- Error "Failed to find 'getty' or 'agetty' for serial console"
|
||||
+ is_true "$USE_SERIAL_CONSOLE" && Error "Failed to find 'stty' (USE_SERIAL_CONSOLE is 'true')"
|
||||
+ LogPrintError "No serial console support (failed to find 'stty')"
|
||||
+ USE_SERIAL_CONSOLE="no"
|
||||
fi
|
||||
|
||||
-REQUIRED_PROGS+=( "$getty_binary" stty )
|
||||
+# Auto-enable serial console support for the recovery system
|
||||
+# provided console support is not impossible because there is no getty or agetty and stty
|
||||
+# and unless the user specified to not have serial console support:
|
||||
+is_false "$USE_SERIAL_CONSOLE" && return 0
|
||||
+
|
||||
+# When the user has specified SERIAL_CONSOLE_DEVICES_KERNEL use only that,
|
||||
+# otherwise use SERIAL_CONSOLE_DEVICES if the user has specified it:
|
||||
+local serial_console_devices=""
|
||||
+test "$SERIAL_CONSOLE_DEVICES" && serial_console_devices="$SERIAL_CONSOLE_DEVICES"
|
||||
+test "$SERIAL_CONSOLE_DEVICES_KERNEL" && serial_console_devices="$SERIAL_CONSOLE_DEVICES_KERNEL"
|
||||
+if test "$serial_console_devices" ; then
|
||||
+ local serial_console speed="" cmdline_add_console=""
|
||||
+ for serial_console in $serial_console_devices ; do
|
||||
+ # serial_console can be a character device node like "/dev/ttyS0" or "/dev/lp0" or "/dev/ttyUSB0"
|
||||
+ # cf. https://www.kernel.org/doc/html/latest/admin-guide/serial-console.html
|
||||
+ # or serial_console can be a 'console=...' kernel cmd parameter like "console=ttyS1,9600"
|
||||
+ if test -c "$serial_console" ; then
|
||||
+ if speed=$( get_serial_device_speed $serial_console ) ; then
|
||||
+ cmdline_add_console+=" console=${serial_console##/dev/},$speed"
|
||||
+ else
|
||||
+ cmdline_add_console+=" console=${serial_console##/dev/}"
|
||||
+ fi
|
||||
+ else
|
||||
+ # When serial_console is not a character device
|
||||
+ # it should be a 'console=...' kernel cmd parameter
|
||||
+ # that is used as specified ("final power to the user"):
|
||||
+ cmdline_add_console+=" $serial_console"
|
||||
+ fi
|
||||
+ done
|
||||
+ if test "$cmdline_add_console" ; then
|
||||
+ KERNEL_CMDLINE+="$cmdline_add_console"
|
||||
+ DebugPrint "Appended '$cmdline_add_console' to KERNEL_CMDLINE"
|
||||
+ USE_SERIAL_CONSOLE="yes"
|
||||
+ # No further automatisms when a 'console=...' kernel cmd parameter was set
|
||||
+ # via SERIAL_CONSOLE_DEVICES_KERNEL or SERIAL_CONSOLE_DEVICES:
|
||||
+ return
|
||||
+ fi
|
||||
+ LogPrintError "SERIAL_CONSOLE_DEVICES_KERNEL or SERIAL_CONSOLE_DEVICES specified but none is a character device"
|
||||
+fi
|
||||
+
|
||||
+# Auto-enable serial console support for the recovery system kernel:
|
||||
+# The below auto-enable serial console support for the recovery system kernel
|
||||
+# does not auto-enable serial console support for the recovery system bootloader.
|
||||
+# Currently auto-enable serial console support for the recovery system bootloader
|
||||
+# happens for the first real serial device from get_serial_console_devices()
|
||||
+# in lib/bootloader-functions.sh in make_syslinux_config() and create_grub2_cfg()
|
||||
+# and in output/USB/Linux-i386/300_create_extlinux.sh
|
||||
+# The auto-enable serial console support for the recovery system bootloader should be
|
||||
+# auto-aligned with the auto-enable serial console support for the recovery system kernel.
|
||||
+# Things are auto-aligned when the first 'console=...' device in /proc/cmdline
|
||||
+# is also the first real serial device from get_serial_console_devices().
|
||||
+# When current auto-alignment does not result what the user needs, what is needed can be specified
|
||||
+# via SERIAL_CONSOLE_DEVICES_KERNEL and SERIAL_CONSOLE_DEVICE_SYSLINUX or SERIAL_CONSOLE_DEVICE_GRUB.
|
||||
+
|
||||
+# Scan the kernel command line of the currently running original system
|
||||
+# and auto-enable serial console for the recovery system kernel
|
||||
+# only if there is at least one 'console=...' option:
|
||||
+local kernel_option
|
||||
+for kernel_option in $( cat /proc/cmdline ) ; do
|
||||
+ # Get the kernel option name (part before leftmost "="):
|
||||
+ if test "${kernel_option%%=*}" = "console" ; then
|
||||
+ USE_SERIAL_CONSOLE="yes"
|
||||
+ # Get all 'console=...' kernel command line options
|
||||
+ # copied from the currently running original system
|
||||
+ # via rescue/GNU/Linux/290_kernel_cmdline.sh that runs later:
|
||||
+ COPY_KERNEL_PARAMETERS+=( console )
|
||||
+ return
|
||||
+ fi
|
||||
+done
|
||||
+DebugPrint "No 'console=...' setting for recovery system kernel (none in /proc/cmdline)"
|
||||
diff --git a/usr/share/rear/rescue/GNU/Linux/400_use_serial_console.sh b/usr/share/rear/rescue/GNU/Linux/400_use_serial_console.sh
|
||||
deleted file mode 100644
|
||||
index fc935844..00000000
|
||||
--- a/usr/share/rear/rescue/GNU/Linux/400_use_serial_console.sh
|
||||
+++ /dev/null
|
||||
@@ -1,6 +0,0 @@
|
||||
-
|
||||
-# Nothing to do when using serial console is not wanted:
|
||||
-is_true "$USE_SERIAL_CONSOLE" || return 0
|
||||
-
|
||||
-KERNEL_CMDLINE=$( cmdline_add_console )
|
||||
-Log "Modified kernel commandline to: '$KERNEL_CMDLINE'"
|
@ -0,0 +1,321 @@
|
||||
commit ec9080664303165799a215cef062826b65f6a6f8
|
||||
Author: Johannes Meixner <jsmeix@suse.com>
|
||||
Date: Fri Apr 12 15:25:28 2024 +0200
|
||||
|
||||
New unique_unsorted() function (#3177)
|
||||
|
||||
In lib/global-functions.sh added a
|
||||
new unique_unsorted() function
|
||||
that outputs lines in a file or from STDIN
|
||||
without subsequent duplicate lines
|
||||
which keeps the ordering of the lines, see
|
||||
https://github.com/rear/rear/pull/3177
|
||||
In backup/NETFS/default/500_make_backup.sh use
|
||||
unique_unsorted $TMP_DIR/backup-include.txt
|
||||
to ignore duplicate arguments provided
|
||||
to 'tar' and 'rsync' what should be archived
|
||||
to avoid that 'tar' and 'rsync' archive
|
||||
exact same things multiple times
|
||||
which needlessly increases backup time and
|
||||
in case of 'tar' the backup archive size and
|
||||
storage space and backup restore time, cf.
|
||||
https://github.com/rear/rear/pull/3175#issuecomment-1985306750
|
||||
|
||||
Cherry-picked-by: Lukáš Zaoral <lzaoral@redhat.com>
|
||||
|
||||
diff --git a/usr/share/rear/backup/NETFS/default/500_make_backup.sh b/usr/share/rear/backup/NETFS/default/500_make_backup.sh
|
||||
index feb4d322..fba03338 100644
|
||||
--- a/usr/share/rear/backup/NETFS/default/500_make_backup.sh
|
||||
+++ b/usr/share/rear/backup/NETFS/default/500_make_backup.sh
|
||||
@@ -42,10 +42,10 @@ fi
|
||||
|
||||
# Log what is included in the backup and what is excluded from the backup
|
||||
# cf. backup/NETFS/default/400_create_include_exclude_files.sh
|
||||
-Log "Backup include list (backup-include.txt contents):"
|
||||
+Log "Backup include list (backup-include.txt contents without subsequent duplicates):"
|
||||
while read -r backup_include_item ; do
|
||||
test "$backup_include_item" && Log " $backup_include_item"
|
||||
-done < $TMP_DIR/backup-include.txt
|
||||
+done < <( unique_unsorted $TMP_DIR/backup-include.txt )
|
||||
Log "Backup exclude list (backup-exclude.txt contents):"
|
||||
while read -r backup_exclude_item ; do
|
||||
test "$backup_exclude_item" && Log " $backup_exclude_item"
|
||||
@@ -127,7 +127,7 @@ case "$(basename ${BACKUP_PROG})" in
|
||||
$BACKUP_PROG_CREATE_NEWER_OPTIONS \
|
||||
${BACKUP_PROG_BLOCKS:+-b $BACKUP_PROG_BLOCKS} "${BACKUP_PROG_COMPRESS_OPTIONS[@]}" \
|
||||
-X $TMP_DIR/backup-exclude.txt -C / -c -f - \
|
||||
- $(cat $TMP_DIR/backup-include.txt) $RUNTIME_LOGFILE \| $BACKUP_PROG_CRYPT_OPTIONS BACKUP_PROG_CRYPT_KEY \| $SPLIT_COMMAND
|
||||
+ $(unique_unsorted $TMP_DIR/backup-include.txt) $RUNTIME_LOGFILE \| $BACKUP_PROG_CRYPT_OPTIONS BACKUP_PROG_CRYPT_KEY \| $SPLIT_COMMAND
|
||||
else
|
||||
Log $BACKUP_PROG $TAR_OPTIONS --sparse --block-number --totals --verbose \
|
||||
--no-wildcards-match-slash --one-file-system \
|
||||
@@ -135,7 +135,7 @@ case "$(basename ${BACKUP_PROG})" in
|
||||
$BACKUP_PROG_CREATE_NEWER_OPTIONS \
|
||||
${BACKUP_PROG_BLOCKS:+-b $BACKUP_PROG_BLOCKS} "${BACKUP_PROG_COMPRESS_OPTIONS[@]}" \
|
||||
-X $TMP_DIR/backup-exclude.txt -C / -c -f - \
|
||||
- $(cat $TMP_DIR/backup-include.txt) $RUNTIME_LOGFILE \| $SPLIT_COMMAND
|
||||
+ $(unique_unsorted $TMP_DIR/backup-include.txt) $RUNTIME_LOGFILE \| $SPLIT_COMMAND
|
||||
fi
|
||||
|
||||
if is_true "$BACKUP_PROG_CRYPT_ENABLED" ; then
|
||||
@@ -151,7 +151,7 @@ case "$(basename ${BACKUP_PROG})" in
|
||||
${BACKUP_PROG_BLOCKS:+-b $BACKUP_PROG_BLOCKS} \
|
||||
"${BACKUP_PROG_COMPRESS_OPTIONS[@]}" \
|
||||
-X $TMP_DIR/backup-exclude.txt -C / -c -f - \
|
||||
- $(cat $TMP_DIR/backup-include.txt) $RUNTIME_LOGFILE | \
|
||||
+ $(unique_unsorted $TMP_DIR/backup-include.txt) $RUNTIME_LOGFILE | \
|
||||
{ $BACKUP_PROG_CRYPT_OPTIONS "$BACKUP_PROG_CRYPT_KEY" ; } 2>/dev/null | \
|
||||
$SPLIT_COMMAND
|
||||
pipes_rc=( ${PIPESTATUS[@]} )
|
||||
@@ -160,14 +160,14 @@ case "$(basename ${BACKUP_PROG})" in
|
||||
"$(basename $(echo "$BACKUP_PROG" | awk '{ print $1 }'))"
|
||||
"$(basename $(echo "$SPLIT_COMMAND" | awk '{ print $1 }'))"
|
||||
)
|
||||
- $BACKUP_PROG $TAR_OPTIONS --sparse --block-number --totals --verbose \
|
||||
- --no-wildcards-match-slash --one-file-system \
|
||||
- --ignore-failed-read "${BACKUP_PROG_OPTIONS[@]}" \
|
||||
- $BACKUP_PROG_CREATE_NEWER_OPTIONS \
|
||||
- ${BACKUP_PROG_BLOCKS:+-b $BACKUP_PROG_BLOCKS} \
|
||||
- "${BACKUP_PROG_COMPRESS_OPTIONS[@]}" \
|
||||
- -X $TMP_DIR/backup-exclude.txt -C / -c -f - \
|
||||
- $(cat $TMP_DIR/backup-include.txt) $RUNTIME_LOGFILE | \
|
||||
+ $BACKUP_PROG $TAR_OPTIONS --sparse --block-number --totals --verbose \
|
||||
+ --no-wildcards-match-slash --one-file-system \
|
||||
+ --ignore-failed-read "${BACKUP_PROG_OPTIONS[@]}" \
|
||||
+ $BACKUP_PROG_CREATE_NEWER_OPTIONS \
|
||||
+ ${BACKUP_PROG_BLOCKS:+-b $BACKUP_PROG_BLOCKS} \
|
||||
+ "${BACKUP_PROG_COMPRESS_OPTIONS[@]}" \
|
||||
+ -X $TMP_DIR/backup-exclude.txt -C / -c -f - \
|
||||
+ $(unique_unsorted $TMP_DIR/backup-include.txt) $RUNTIME_LOGFILE | \
|
||||
$SPLIT_COMMAND
|
||||
pipes_rc=( ${PIPESTATUS[@]} )
|
||||
fi
|
||||
@@ -213,21 +213,21 @@ case "$(basename ${BACKUP_PROG})" in
|
||||
mkdir -p $v "$backuparchive" >&2
|
||||
Log $BACKUP_PROG --verbose "${BACKUP_RSYNC_OPTIONS[@]}" --one-file-system --delete \
|
||||
--exclude-from=$TMP_DIR/backup-exclude.txt --delete-excluded \
|
||||
- $(cat $TMP_DIR/backup-include.txt) "$backuparchive"
|
||||
+ $(unique_unsorted $TMP_DIR/backup-include.txt) "$backuparchive"
|
||||
$BACKUP_PROG --verbose "${BACKUP_RSYNC_OPTIONS[@]}" --one-file-system --delete \
|
||||
--exclude-from=$TMP_DIR/backup-exclude.txt --delete-excluded \
|
||||
- $(cat $TMP_DIR/backup-include.txt) "$backuparchive" >&2
|
||||
+ $(unique_unsorted $TMP_DIR/backup-include.txt) "$backuparchive" >&2
|
||||
;;
|
||||
(*)
|
||||
Log "Using unsupported backup program '$BACKUP_PROG'"
|
||||
Log $BACKUP_PROG "${BACKUP_PROG_COMPRESS_OPTIONS[@]}" \
|
||||
$BACKUP_PROG_OPTIONS_CREATE_ARCHIVE $TMP_DIR/backup-exclude.txt \
|
||||
"${BACKUP_PROG_OPTIONS[@]}" "$backuparchive" \
|
||||
- $(cat $TMP_DIR/backup-include.txt) $RUNTIME_LOGFILE > "$backuparchive"
|
||||
+ $(unique_unsorted $TMP_DIR/backup-include.txt) $RUNTIME_LOGFILE > "$backuparchive"
|
||||
$BACKUP_PROG "${BACKUP_PROG_COMPRESS_OPTIONS[@]}" \
|
||||
$BACKUP_PROG_OPTIONS_CREATE_ARCHIVE $TMP_DIR/backup-exclude.txt \
|
||||
"${BACKUP_PROG_OPTIONS[@]}" "$backuparchive" \
|
||||
- $(cat $TMP_DIR/backup-include.txt) $RUNTIME_LOGFILE > "$backuparchive"
|
||||
+ $(unique_unsorted $TMP_DIR/backup-include.txt) $RUNTIME_LOGFILE > "$backuparchive"
|
||||
;;
|
||||
esac 2> "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log"
|
||||
# For the rsync and default case the backup prog is the last in the case entry
|
||||
diff --git a/usr/share/rear/lib/global-functions.sh b/usr/share/rear/lib/global-functions.sh
|
||||
index 77263cb1..1fc083b4 100644
|
||||
--- a/usr/share/rear/lib/global-functions.sh
|
||||
+++ b/usr/share/rear/lib/global-functions.sh
|
||||
@@ -14,6 +14,35 @@ function read_and_strip_file () {
|
||||
sed -e '/^[[:space:]]/d;/^$/d;/^#/d' "$filename"
|
||||
}
|
||||
|
||||
+# Output lines in STDIN or in a file without subsequent duplicate lines
|
||||
+# i.e. for each line that was seen (and output) do not output subsequent duplicates of that line.
|
||||
+# This keeps the ordering of the lines so the input
|
||||
+# one
|
||||
+# two
|
||||
+# one
|
||||
+# three
|
||||
+# two
|
||||
+# one
|
||||
+# gets output as
|
||||
+# one
|
||||
+# two
|
||||
+# three
|
||||
+# To remove duplicate lines and keep the ordering one could use ... | cat -n | sort -uk2 | sort -nk1 | cut -f2-
|
||||
+# cf. https://stackoverflow.com/questions/11532157/remove-duplicate-lines-without-sorting/11532197#11532197
|
||||
+# that also explains an awk command that prints each line provided the line was not seen before.
|
||||
+# The awk variable $0 holds an entire line and square brackets is associative array access in awk.
|
||||
+# For each line the node of the associative array 'seen' is incremented and the line is printed
|
||||
+# if the content of that node was not '!' previously set (i.e. if the line was not previously seen)
|
||||
+# cf. https://www.thegeekstuff.com/2010/03/awk-arrays-explained-with-5-practical-examples/
|
||||
+function unique_unsorted () {
|
||||
+ local filename="$1"
|
||||
+ if test "$filename" ; then
|
||||
+ test -r "$filename" && awk '!seen[$0]++' "$filename"
|
||||
+ else
|
||||
+ awk '!seen[$0]++'
|
||||
+ fi
|
||||
+}
|
||||
+
|
||||
# Three functions to test
|
||||
# if the argument is an integer
|
||||
# if the argument is a positive integer (i.e. test for '> 0')
|
||||
|
||||
commit 2da70f54936e5c558c9f607b1526b9b17f6501b1
|
||||
Author: Lukáš Zaoral <lzaoral@redhat.com>
|
||||
Date: Fri Jul 12 10:44:04 2024 +0200
|
||||
|
||||
Automatically include mounted btrfs subvolumes in NETFS backups (#3175)
|
||||
|
||||
* automatically exclude btrfs snapshot subvolumes from 'btrfsmountedsubvol'
|
||||
|
||||
Related: https://github.com/rear/rear/pull/3175#issuecomment-1983498175
|
||||
|
||||
* automatically include mounted btrfs subvolumes in NETFS backups
|
||||
|
||||
... unless they are explicitly excluded.
|
||||
|
||||
Resolves: https://github.com/rear/rear/issues/2928
|
||||
|
||||
* always add the excluded component in RESTORE_EXCLUDE_FILE
|
||||
|
||||
Otherwise, the component itself would not be included if it had any child
|
||||
components of the `fs` type.
|
||||
|
||||
* automatically exclude btrfs subvolume children of excluded components
|
||||
|
||||
Cherry-picked-by: Lukáš Zaoral <lzaoral@redhat.com>
|
||||
|
||||
diff --git a/usr/share/rear/layout/prepare/default/610_exclude_from_restore.sh b/usr/share/rear/layout/prepare/default/610_exclude_from_restore.sh
|
||||
index 0a902041..1e7522b2 100644
|
||||
--- a/usr/share/rear/layout/prepare/default/610_exclude_from_restore.sh
|
||||
+++ b/usr/share/rear/layout/prepare/default/610_exclude_from_restore.sh
|
||||
@@ -7,24 +7,33 @@ RESTORE_EXCLUDE_FILE="$TMP_DIR/restore-exclude-list.txt"
|
||||
|
||||
: >"$RESTORE_EXCLUDE_FILE"
|
||||
|
||||
+local component
|
||||
+
|
||||
for component in "${EXCLUDE_RECREATE[@]}" ; do
|
||||
if ! IsInArray "$component" "${EXCLUDE_RESTORE[@]}" ; then
|
||||
EXCLUDE_RESTORE+=( "$component" )
|
||||
fi
|
||||
done
|
||||
|
||||
+local comp_type children child
|
||||
+local comp_types=( "btrfsmountedsubvol" "fs" )
|
||||
+
|
||||
for component in "${EXCLUDE_RESTORE[@]}" ; do
|
||||
- fs_children=$(get_child_components "$component" "fs" | sort -u)
|
||||
- if [ -n "$fs_children" ] ; then
|
||||
- for child in $fs_children ; do
|
||||
- child=${child#fs:}
|
||||
- echo "${child#/}" >> "$RESTORE_EXCLUDE_FILE"
|
||||
- echo "${child#/}/*" >> "$RESTORE_EXCLUDE_FILE"
|
||||
- done
|
||||
- else
|
||||
- # if there are no fs deps, assume it is a wildcard path
|
||||
- component=${component#fs:}
|
||||
- echo "${component#/}" >> "$RESTORE_EXCLUDE_FILE"
|
||||
- echo "${component#/}/*" >> "$RESTORE_EXCLUDE_FILE"
|
||||
- fi
|
||||
+ for comp_type in "${comp_types[@]}"; do
|
||||
+ children=$(get_child_components "$component" "$comp_type" | sort -u)
|
||||
+ if [ -n "$children" ] ; then
|
||||
+ for child in $children ; do
|
||||
+ child=${child#$comp_type:}
|
||||
+ echo "${child#/}" >> "$RESTORE_EXCLUDE_FILE"
|
||||
+ echo "${child#/}/*" >> "$RESTORE_EXCLUDE_FILE"
|
||||
+ done
|
||||
+ fi
|
||||
+ done
|
||||
+
|
||||
+ # exclude the component itself
|
||||
+ for comp_type in "${comp_types[@]}"; do
|
||||
+ component=${component#$comp_type:}
|
||||
+ done
|
||||
+ echo "${component#/}" >> "$RESTORE_EXCLUDE_FILE"
|
||||
+ echo "${component#/}/*" >> "$RESTORE_EXCLUDE_FILE"
|
||||
done
|
||||
diff --git a/usr/share/rear/layout/save/GNU/Linux/230_filesystem_layout.sh b/usr/share/rear/layout/save/GNU/Linux/230_filesystem_layout.sh
|
||||
index 7990c055..166b9cd2 100644
|
||||
--- a/usr/share/rear/layout/save/GNU/Linux/230_filesystem_layout.sh
|
||||
+++ b/usr/share/rear/layout/save/GNU/Linux/230_filesystem_layout.sh
|
||||
@@ -434,6 +434,7 @@ fi
|
||||
# Output header only once:
|
||||
btrfsmountedsubvol_entry_exists="yes"
|
||||
echo "# All mounted btrfs subvolumes (including mounted btrfs default subvolumes and mounted btrfs snapshot subvolumes)."
|
||||
+ echo "# Mounted btrfs snapshot subvolumes are autoexcluded."
|
||||
if test "$findmnt_FSROOT_works" ; then
|
||||
echo "# Determined by the findmnt command that shows the mounted btrfs_subvolume_path."
|
||||
echo "# Format: btrfsmountedsubvol <device> <subvolume_mountpoint> <mount_options> <btrfs_subvolume_path>"
|
||||
@@ -469,7 +470,10 @@ fi
|
||||
# Finally, test whether the btrfs subvolume listed as mounted actually exists. A running docker
|
||||
# daemon apparently can convince the system to list a non-existing btrfs volume as mounted.
|
||||
# See https://github.com/rear/rear/issues/1496
|
||||
- if btrfs_subvolume_exists "$subvolume_mountpoint" "$btrfs_subvolume_path"; then
|
||||
+ if btrfs_snapshot_subvolume_exists "$subvolume_mountpoint" "$btrfs_subvolume_path"; then
|
||||
+ # Exclude mounted snapshot subvolumes
|
||||
+ echo "#btrfsmountedsubvol $device $subvolume_mountpoint $mount_options $btrfs_subvolume_path"
|
||||
+ elif btrfs_subvolume_exists "$subvolume_mountpoint" "$btrfs_subvolume_path"; then
|
||||
echo "btrfsmountedsubvol $device $subvolume_mountpoint $mount_options $btrfs_subvolume_path"
|
||||
else
|
||||
LogPrintError "Ignoring non-existing btrfs subvolume listed as mounted: $subvolume_mountpoint"
|
||||
diff --git a/usr/share/rear/layout/save/default/340_generate_mountpoint_device.sh b/usr/share/rear/layout/save/default/340_generate_mountpoint_device.sh
|
||||
index 2b58922b..fb358ccf 100644
|
||||
--- a/usr/share/rear/layout/save/default/340_generate_mountpoint_device.sh
|
||||
+++ b/usr/share/rear/layout/save/default/340_generate_mountpoint_device.sh
|
||||
@@ -7,15 +7,15 @@
|
||||
# EXCLUDE_RECREATE is handled automatically (commented out in LAYOUT_FILE)
|
||||
excluded_mountpoints=()
|
||||
while read fs device mountpoint junk ; do
|
||||
- if IsInArray "fs:$mountpoint" "${EXCLUDE_BACKUP[@]}" ; then
|
||||
+ if IsInArray "$fs:$mountpoint" "${EXCLUDE_BACKUP[@]}" ; then
|
||||
excluded_mountpoints+=( $mountpoint )
|
||||
fi
|
||||
- for component in $(get_parent_components "fs:$mountpoint" | sort -u) ; do
|
||||
+ for component in $(get_parent_components "$fs:$mountpoint" | sort -u) ; do
|
||||
if IsInArray "$component" "${EXCLUDE_BACKUP[@]}" ; then
|
||||
excluded_mountpoints+=( $mountpoint )
|
||||
fi
|
||||
done
|
||||
-done < <(grep ^fs $LAYOUT_FILE)
|
||||
+done < <(grep -E '^(fs|btrfsmountedsubvol)' $LAYOUT_FILE)
|
||||
|
||||
# Generate the list of mountpoints and devices to exclude from backup
|
||||
while read fs device mountpoint junk ; do
|
||||
@@ -25,4 +25,4 @@ while read fs device mountpoint junk ; do
|
||||
continue
|
||||
fi
|
||||
echo "$mountpoint $device"
|
||||
-done < <(grep '^fs' $LAYOUT_FILE) > $VAR_DIR/recovery/mountpoint_device
|
||||
+done < <(grep -E '^(fs|btrfsmountedsubvol)' $LAYOUT_FILE) | unique_unsorted > $VAR_DIR/recovery/mountpoint_device
|
||||
diff --git a/usr/share/rear/lib/filesystems-functions.sh b/usr/share/rear/lib/filesystems-functions.sh
|
||||
index f0547706..826571be 100644
|
||||
--- a/usr/share/rear/lib/filesystems-functions.sh
|
||||
+++ b/usr/share/rear/lib/filesystems-functions.sh
|
||||
@@ -3,16 +3,27 @@
|
||||
#
|
||||
# File system support functions
|
||||
|
||||
+function btrfs_snapshot_subvolume_exists() {
|
||||
+ # returns true if the btrfs snapshot subvolume ($2) exists in the Btrfs
|
||||
+ # file system at the mount point ($1).
|
||||
+
|
||||
+ # Use -s so that btrfs subvolume list considers snapshots only
|
||||
+ btrfs_subvolume_exists "$1" "$2" "-s"
|
||||
+}
|
||||
+
|
||||
function btrfs_subvolume_exists() {
|
||||
# returns true if the btrfs subvolume ($2) exists in the Btrfs file system at the mount point ($1).
|
||||
local subvolume_mountpoint="$1" btrfs_subvolume_path="$2"
|
||||
|
||||
+ # extra options for the btrfs subvolume list command ($3)
|
||||
+ local btrfs_extra_opts="$3"
|
||||
+
|
||||
# A root subvolume can be assumed to always exist
|
||||
[ "$btrfs_subvolume_path" == "/" ] && return 0
|
||||
|
||||
# A non-root subvolume exists if the btrfs subvolume list contains its complete path at the end of one line.
|
||||
# This code deliberately uses a plain string comparison rather than a regexp.
|
||||
- btrfs subvolume list -a "$subvolume_mountpoint" | sed -e 's; path <FS_TREE>/; path ;' |
|
||||
+ btrfs subvolume list -a $btrfs_extra_opts "$subvolume_mountpoint" | sed -e 's; path <FS_TREE>/; path ;' |
|
||||
awk -v path="$btrfs_subvolume_path" '
|
||||
BEGIN {
|
||||
match_string = " path " path;
|
@ -0,0 +1,54 @@
|
||||
From 060fef89b6968f0c8f254e6f612eff839b83c057 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Cahyna <pcahyna@redhat.com>
|
||||
Date: Mon, 13 Nov 2023 18:54:41 +0100
|
||||
Subject: [PATCH] Do not mount /sys if already mounted
|
||||
|
||||
Newer versions of systemd (starting with Fedora 39) seem to mount /sys
|
||||
themselves. Mounting it again leads to errors on the recovery system
|
||||
startup (startup scripts failing with status=219/CGROUP ), see
|
||||
https://github.com/rear/rear/issues/3017.
|
||||
|
||||
Check if /sys is already mounted using the `mountpoint` tool and mount it
|
||||
only if it is not.
|
||||
|
||||
Do the same for the other system mountpoints like /proc, /dev, /dev/pts.
|
||||
Not sure if they suffer from the same problem, but they probably could.
|
||||
|
||||
N.B. the `mountpoint` command is already among REQUIRED_PROGS.
|
||||
---
|
||||
usr/share/rear/skel/default/etc/scripts/boot | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/usr/share/rear/skel/default/etc/scripts/boot b/usr/share/rear/skel/default/etc/scripts/boot
|
||||
index 0f221af3e4..f06e759620 100755
|
||||
--- a/usr/share/rear/skel/default/etc/scripts/boot
|
||||
+++ b/usr/share/rear/skel/default/etc/scripts/boot
|
||||
@@ -4,8 +4,8 @@
|
||||
dmesg -n1
|
||||
|
||||
# basic mounts
|
||||
-mount -t proc -n none /proc
|
||||
-mount -t sysfs none /sys
|
||||
+mountpoint /proc || mount -t proc -n none /proc
|
||||
+mountpoint /sys || mount -t sysfs none /sys
|
||||
|
||||
if type udevd &>/dev/null && ! type udevinfo &>/dev/null; then
|
||||
### we use udevinfo to filter out old udev versions (<106) that don't
|
||||
@@ -13,7 +13,7 @@ if type udevd &>/dev/null && ! type udevinfo &>/dev/null; then
|
||||
udev_version=$(udevd --version)
|
||||
if [[ "$udev_version" -gt 175 ]]; then
|
||||
### udev > 175 needs devtmpfs
|
||||
- mount -t devtmpfs none /dev
|
||||
+ mountpoint /dev || mount -t devtmpfs none /dev
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -26,7 +26,7 @@ if [[ ! -L /dev/fd ]] ; then
|
||||
ln -s /proc/self/fd /dev/fd
|
||||
fi
|
||||
|
||||
-mount -t devpts -o gid=5,mode=620 none /dev/pts
|
||||
+mountpoint /dev/pts || mount -t devpts -o gid=5,mode=620 none /dev/pts
|
||||
|
||||
cat /proc/mounts >/etc/mtab 2>/dev/null
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,110 @@
|
||||
commit eb574592a21c7ca986393c4563fe5484b9f01454
|
||||
Author: Johannes Meixner <jsmeix@suse.com>
|
||||
Date: Tue Jun 18 13:47:27 2024 +0200
|
||||
|
||||
In 990_verify_rootfs.sh fix issue #3021 (#3250)
|
||||
|
||||
In build/default/990_verify_rootfs.sh
|
||||
for each 'not found' shared object
|
||||
(i.e. a shared object that was 'not found' by 'ldd')
|
||||
check whether or not the shared object
|
||||
may exist nevertheless in the recovery system
|
||||
and if yes, we may sufficiently safely assume
|
||||
things are OK in the ReaR recovery system
|
||||
so we do not report it as missing to the user
|
||||
(for debugging we have all in the log), see
|
||||
https://github.com/rear/rear/issues/3021#issuecomment-2165453757
|
||||
Additionally in 990_verify_rootfs.sh
|
||||
more consistent level when messages are shown,
|
||||
i.e. now only LogPrint and LogPrintError
|
||||
to show nothing (except errors) when not in verbose mode
|
||||
and all messages when in verbose mode
|
||||
to make the messages as a whole
|
||||
better understandable by the user.
|
||||
|
||||
Cherry-picked-by: Lukáš Zaoral <lzaoral@redhat.com>
|
||||
|
||||
diff --git a/usr/share/rear/build/default/990_verify_rootfs.sh b/usr/share/rear/build/default/990_verify_rootfs.sh
|
||||
index 3d203cca..dce42701 100644
|
||||
--- a/usr/share/rear/build/default/990_verify_rootfs.sh
|
||||
+++ b/usr/share/rear/build/default/990_verify_rootfs.sh
|
||||
@@ -70,9 +70,13 @@ DebugPrint "Testing each binary with 'ldd' and look for 'not found' libraries wi
|
||||
local backup_tool_LD_LIBRARY_PATH=""
|
||||
local binary=""
|
||||
local broken_binary_LD_LIBRARY_PATH=""
|
||||
-local broken_binaries="no"
|
||||
local fatal_missing_library="no"
|
||||
local ldd_output=""
|
||||
+local not_found_output=""
|
||||
+local not_found_library=""
|
||||
+local junk=""
|
||||
+local actually_found_library=""
|
||||
+local actually_missing_libraries="no"
|
||||
# Third-party backup tools may use LD_LIBRARY_PATH to find their libraries
|
||||
# so that for testing such third-party backup tools we must also use their special LD_LIBRARY_PATH here:
|
||||
if test "$BACKUP" = "TSM" ; then
|
||||
@@ -159,9 +163,8 @@ for binary in $( find $ROOTFS_DIR -type f \( -executable -o -name '*.so' -o -nam
|
||||
broken_binary_LD_LIBRARY_PATH=$backup_tool_LD_LIBRARY_PATH
|
||||
Log "$binary requires additional libraries with backup tool specific LD_LIBRARY_PATH=$backup_tool_LD_LIBRARY_PATH"
|
||||
fi
|
||||
- # All tests had a 'not found' shared object dependency so the binary requires additional libraries
|
||||
- # without LD_LIBRARY_PATH and with LD_LIBRARY_PATH and with backup tool specific LD_LIBRARY_PATH:
|
||||
- broken_binaries="yes"
|
||||
+ # At this point all tests had a 'not found' shared object dependency so the binary requires additional libraries
|
||||
+ # without LD_LIBRARY_PATH and with LD_LIBRARY_PATH and with backup tool specific LD_LIBRARY_PATH.
|
||||
# Only for programs (i.e. files in a .../bin/... or .../sbin/... directory) treat a missing library as fatal
|
||||
# unless specified when a 'not found' reported library is not fatal (when the 'ldd' test was false alarm):
|
||||
if grep -q '/[s]*bin/' <<<"$binary" ; then
|
||||
@@ -169,17 +172,17 @@ for binary in $( find $ROOTFS_DIR -type f \( -executable -o -name '*.so' -o -nam
|
||||
if test "$NON_FATAL_BINARIES_WITH_MISSING_LIBRARY" ; then
|
||||
# A program with missing library is treated as fatal when it does not match the pattern:
|
||||
if grep -E -q "$NON_FATAL_BINARIES_WITH_MISSING_LIBRARY" <<<"$binary" ; then
|
||||
- LogPrintError "$binary requires additional libraries (specified as non-fatal)"
|
||||
+ LogPrint "$binary requires libraries were 'ldd' shows 'not found' (specified as non-fatal)"
|
||||
else
|
||||
- LogPrintError "$binary requires additional libraries (fatal error)"
|
||||
+ LogPrint "$binary requires libraries were 'ldd' shows 'not found' (fatal error)"
|
||||
fatal_missing_library="yes"
|
||||
fi
|
||||
else
|
||||
- LogPrintError "$binary requires additional libraries (fatal error)"
|
||||
+ LogPrint "$binary requires libraries were 'ldd' shows 'not found' (fatal by default)"
|
||||
fatal_missing_library="yes"
|
||||
fi
|
||||
else
|
||||
- LogPrintError "$binary requires additional libraries"
|
||||
+ LogPrint "$binary requires libraries were 'ldd' shows 'not found'"
|
||||
fi
|
||||
# Run the same ldd call as above but now keep its whole stdout output.
|
||||
# The ldd call that results the final 'not found' shared object is the last of the above ldd calls that was run.
|
||||
@@ -191,10 +194,27 @@ for binary in $( find $ROOTFS_DIR -type f \( -executable -o -name '*.so' -o -nam
|
||||
fi
|
||||
# Have the whole ldd output only in the log:
|
||||
Log "$ldd_output"
|
||||
- # Show only the missing libraries to the user to not flood his screen with tons of other ldd output lines:
|
||||
- PrintError "$( grep 'not found' <<<"$ldd_output" )"
|
||||
+ # For each 'not found' shared object (i.e. a shared object that was 'not found' by 'ldd')
|
||||
+ # check whether or not the shared object may exist nevertheless in the ReaR recovery system
|
||||
+ # and if yes, we may sufficiently safely assume things are OK in the ReaR recovery system
|
||||
+ # so we do not report it as missing to the user (for debugging we have all in the log)
|
||||
+ # cf. https://github.com/rear/rear/issues/3021#issuecomment-2165453757
|
||||
+ not_found_output="$( grep 'not found' <<<"$ldd_output" )"
|
||||
+ # not_found_output is a string of multiple lines (separated by \n) that look e.g. like
|
||||
+ # libsystemd-shared-255.4-1.fc40.so => not found
|
||||
+ # /path/to/library => not found
|
||||
+ while read not_found_library junk ; do
|
||||
+ # We prefer a simple 'grep -q' pipe over dealing with find -name versus -path options:
|
||||
+ if actually_found_library="$( find $ROOTFS_DIR -xdev | grep "$not_found_library" )" ; then
|
||||
+ LogPrint "$binary requires $not_found_library which was not found by 'ldd' but exists as $actually_found_library"
|
||||
+ else
|
||||
+ actually_missing_libraries="yes"
|
||||
+ # Show only the missing libraries to the user to not flood his screen with tons of other ldd output lines:
|
||||
+ LogPrintError "$binary requires $not_found_library which could not be found in the ReaR recovery system"
|
||||
+ fi
|
||||
+ done <<<"$not_found_output"
|
||||
done
|
||||
-is_true $broken_binaries && LogPrintError "ReaR recovery system in '$ROOTFS_DIR' needs additional libraries, check $RUNTIME_LOGFILE for details"
|
||||
+is_true $actually_missing_libraries && LogPrintError "ReaR recovery system in '$ROOTFS_DIR' needs additional libraries, check $RUNTIME_LOGFILE for details"
|
||||
is_true $fatal_missing_library && keep_build_dir
|
||||
|
||||
# Testing that each program in the PROGS array can be found as executable command within the recovery system
|
@ -1,25 +0,0 @@
|
||||
commit 2aa7b47354bdf5863071c8b479d29c99aad05ecb
|
||||
Author: Johannes Meixner <jsmeix@suse.com>
|
||||
Date: Fri Jul 24 13:02:45 2020 +0200
|
||||
|
||||
Update 240_reassign_luks_keyfiles.sh
|
||||
|
||||
Use ReaR specific TMP_DIR (not TMPDIR or hardcoded /tmp)
|
||||
|
||||
diff --git a/usr/share/rear/finalize/GNU/Linux/240_reassign_luks_keyfiles.sh b/usr/share/rear/finalize/GNU/Linux/240_reassign_luks_keyfiles.sh
|
||||
index d989c3fb..358f3950 100644
|
||||
--- a/usr/share/rear/finalize/GNU/Linux/240_reassign_luks_keyfiles.sh
|
||||
+++ b/usr/share/rear/finalize/GNU/Linux/240_reassign_luks_keyfiles.sh
|
||||
@@ -24,9 +24,9 @@ awk '
|
||||
while read target_name source_device original_keyfile; do
|
||||
Log "Re-assigning keyfile $original_keyfile to LUKS device $target_name ($source_device)"
|
||||
|
||||
- # The scheme for generating a temporary keyfile path must be the same here and in the 'layout/prepare' stage.
|
||||
- temp_keyfile="${TMPDIR:-/tmp}/LUKS-keyfile-$target_name"
|
||||
- [ -f "$temp_keyfile" ] || BugError "temporary keyfile $temp_keyfile not found"
|
||||
+ # The scheme for generating a temporary keyfile path must be the same here and in the 'layout/prepare' stage:
|
||||
+ temp_keyfile="$TMP_DIR/LUKS-keyfile-$target_name"
|
||||
+ test -f "$temp_keyfile" || BugError "temporary LUKS keyfile $temp_keyfile not found"
|
||||
|
||||
target_keyfile="$TARGET_FS_ROOT/$original_keyfile"
|
||||
|
@ -0,0 +1,117 @@
|
||||
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
|
||||
index 17a764cba..a944114b3 100644
|
||||
--- a/usr/share/rear/conf/default.conf
|
||||
+++ b/usr/share/rear/conf/default.conf
|
||||
@@ -1866,7 +1866,7 @@ OBDR_BLOCKSIZE=2048
|
||||
# BACKUP=NBU stuff (Symantec/Veritas NetBackup)
|
||||
##
|
||||
#
|
||||
-COPY_AS_IS_NBU=( /usr/openv/bin/vnetd /usr/openv/bin/vopied /usr/openv/lib /usr/openv/netbackup /usr/openv/var/auth/[mn]*.txt /usr/openv/var/vxss /usr/openv/var/webtruststore /usr/openv/resources/nbpxyhelper /opt/VRTSpbx /etc/vx/VxICS /etc/vx/vrtslog.conf /var/log/VRTSpbx )
|
||||
+COPY_AS_IS_NBU=( /usr/openv/bin/vnetd /usr/openv/bin/vopied /usr/openv/lib /usr/openv/netbackup /usr/openv/var /usr/openv/resources/nbpxyhelper /opt/VRTSpbx /etc/vx/VxICS /etc/vx/vrtslog.conf /var/log/VRTSpbx )
|
||||
COPY_AS_IS_EXCLUDE_NBU=( "/usr/openv/netbackup/logs/*" "/usr/openv/netbackup/bin/bpjava*" /usr/openv/netbackup/bin/xbp /usr/openv/netbackup/bin/private /usr/openv/lib/java "/usr/openv/lib/*-plugins" /usr/openv/lib/shared/vddk /usr/openv/netbackup/baremetal "/var/log/VRTSpbx/*" )
|
||||
# See https://github.com/rear/rear/issues/2105 why /usr/openv/netbackup/sec/at/lib/ is needed:
|
||||
NBU_LD_LIBRARY_PATH="/usr/openv/lib:/usr/openv/netbackup/sec/at/lib/:/usr/openv/lib/boost"
|
||||
diff --git a/usr/share/rear/finalize/NBU/default/990_copy_bplogrestorelog.sh b/usr/share/rear/finalize/NBU/default/990_copy_bplogrestorelog.sh
|
||||
index 60d9a222c..e326db612 100644
|
||||
--- a/usr/share/rear/finalize/NBU/default/990_copy_bplogrestorelog.sh
|
||||
+++ b/usr/share/rear/finalize/NBU/default/990_copy_bplogrestorelog.sh
|
||||
@@ -1,5 +1,51 @@
|
||||
# 990_copy_bprestorelog.sh
|
||||
-# copy the logfile to the recovered system, at least the part that has been written till now.
|
||||
+# copy the logfiles to the recovered system, at least the part that has been written till now.
|
||||
|
||||
-mkdir -p $TARGET_FS_ROOT/$ROOT_HOME_DIR
|
||||
-cp -f $TMP_DIR/bplog.restore* $TARGET_FS_ROOT/$ROOT_HOME_DIR/
|
||||
+# $VAR_DIR/restore will be copied to $recovery_system_recover_log_dir in wrapup/default/990_copy_logfile.sh
|
||||
+mkdir -p "$VAR_DIR/restore/netbackup"
|
||||
+cp -pr /usr/openv/netbackup/logs/* "$VAR_DIR/restore/netbackup"
|
||||
+
|
||||
+# take care of $VAR_DIR/restore/bplog.restore* files (that used to be in /root before)
|
||||
+function symlink_bprestore_logs ()
|
||||
+{
|
||||
+ # adapted from wrapup/default/990_copy_logfile.sh
|
||||
+ local final_logfile_name_full
|
||||
+ local final_logfile_name
|
||||
+ local log_file_symlink_target
|
||||
+ local log_file_symlink
|
||||
+ local recover_log_dir=$LOG_DIR/recover
|
||||
+ local recovery_system_recover_log_dir=$TARGET_FS_ROOT/$recover_log_dir
|
||||
+ # Create the directories with mode 0700 (rwx------) so that only root can access files and subdirectories therein
|
||||
+ # because in particular logfiles could contain security relevant information.
|
||||
+
|
||||
+ # To be backward compatible with where to the logfile was copied before
|
||||
+ # have it as a symbolic link that points to where the logfile actually is:
|
||||
+ # ( "roots" in recovery_system_roots_home_dir means root's but ' in a variable name is not so good ;-)
|
||||
+ local recovery_system_roots_home_dir=$TARGET_FS_ROOT/$ROOT_HOME_DIR
|
||||
+ test -d $recovery_system_roots_home_dir || mkdir $verbose -m 0700 $recovery_system_roots_home_dir
|
||||
+
|
||||
+ # Remove existing and now outdated symlinks that would falsely point to the same target
|
||||
+ # The symlink name bplog.restore-$( date -Iseconds ).log is for example bplog.restore-2019-12-17T09:40:36+01:00.log or rear-2006-08-14T02:34:56-06:00.log
|
||||
+ # so a matching globbing pattern is bplog.restore-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]*.log ('*' for the UTC offset):
|
||||
+ for log_file_symlink in $recovery_system_roots_home_dir/bplog.restore*-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]*.log ; do
|
||||
+ # Skip if a file that matches the globbing pattern is not a symlink (it could be even a directory full of user's sacrocanct files):
|
||||
+ test -L $log_file_symlink || continue
|
||||
+ # Remove also outdated dangling symlinks where their target does not exist by using 'readlink -m':
|
||||
+ test "$log_file_symlink_target" = "$( readlink -m $log_file_symlink )" || continue
|
||||
+ rm $verbose $log_file_symlink
|
||||
+ done
|
||||
+
|
||||
+ # At the moment this function runs, $VAR_DIR/restore will have been already copied
|
||||
+ # to $recovery_system_recover_log_dir in wrapup/default/990_copy_logfile.sh
|
||||
+ # (exit tasks run in reverse order, so this task will run after the tasks defined in
|
||||
+ # wrapup/default/990_copy_logfile.sh )
|
||||
+ for final_logfile_name_full in $recovery_system_recover_log_dir/restore/bplog.restore* ; do
|
||||
+ final_logfile_name="$( basename "$final_logfile_name_full" )"
|
||||
+ log_file_symlink_target="$recover_log_dir/restore/$final_logfile_name"
|
||||
+ # Create symlink with current timestamp that points to where the logfile actually is:
|
||||
+ log_file_symlink=$recovery_system_roots_home_dir/$( basename "$final_logfile_name" .log )-$( date -Iseconds ).log
|
||||
+ ln $verbose -s $log_file_symlink_target $log_file_symlink || true
|
||||
+ done
|
||||
+}
|
||||
+
|
||||
+AddExitTask "symlink_bprestore_logs"
|
||||
diff --git a/usr/share/rear/restore/NBU/default/400_restore_with_nbu.sh b/usr/share/rear/restore/NBU/default/400_restore_with_nbu.sh
|
||||
index 71f7359a1..4280cb021 100644
|
||||
--- a/usr/share/rear/restore/NBU/default/400_restore_with_nbu.sh
|
||||
+++ b/usr/share/rear/restore/NBU/default/400_restore_with_nbu.sh
|
||||
@@ -2,6 +2,23 @@
|
||||
# 400_restore_with_nbu.sh
|
||||
# restore files with NBU
|
||||
|
||||
+# Unique log file name: adapted from restore/NETFS/default/400_restore_backup.sh
|
||||
+# and restore/TSM/default/400_restore_with_tsm.sh
|
||||
+local backup_restore_log_dir="$VAR_DIR/restore"
|
||||
+mkdir -p $backup_restore_log_dir
|
||||
+local backup_restore_log_file=""
|
||||
+local backup_restore_log_prefix="bplog.restore"
|
||||
+local backup_restore_log_suffix="log"
|
||||
+# E.g. when "rear -C 'general.conf /path/to/special.conf' recover" was called CONFIG_APPEND_FILES is "general.conf /path/to/special.conf"
|
||||
+# so that in particular '/' characters must be replaced in the backup restore log file (by a colon) and then
|
||||
+# the backup restore log file name will be like .../restore/bplog.restore.generalconf_:path:to:specialconf.1234.log
|
||||
+# It does not work with $( tr -d -c '[:alnum:]/[:space:]' <<<"$CONFIG_APPEND_FILES" | tr -s '/[:space:]' ':_' )
|
||||
+# because the <<<"$CONFIG_APPEND_FILES" results a trailing newline that becomes a trailing '_' character so that
|
||||
+# echo -n $CONFIG_APPEND_FILES (without double quotes) is used to avoid leading and trailing spaces and newlines:
|
||||
+test "$CONFIG_APPEND_FILES" && backup_restore_log_prefix=$backup_restore_log_prefix.$( echo -n $CONFIG_APPEND_FILES | tr -d -c '[:alnum:]/[:space:]' | tr -s '/[:space:]' ':_' )
|
||||
+
|
||||
+backup_restore_log_file=$backup_restore_log_dir/$backup_restore_log_prefix.$MASTER_PID.$backup_restore_log_suffix
|
||||
+
|
||||
LogPrint "NetBackup: restoring / into $TARGET_FS_ROOT"
|
||||
|
||||
echo "change / to $TARGET_FS_ROOT" > $TMP_DIR/nbu_change_file
|
||||
@@ -10,13 +27,13 @@ echo "change / to $TARGET_FS_ROOT" > $TMP_DIR/nbu_change_file
|
||||
# $TMP_DIR/restore_fs_list was made by 300_create_nbu_restore_fs_list.sh
|
||||
if [ ${#NBU_ENDTIME[@]} -gt 0 ] ; then
|
||||
edate="${NBU_ENDTIME[@]}"
|
||||
- bprestore_args="-B -H -L $TMP_DIR/bplog.restore -8 -R $TMP_DIR/nbu_change_file -t 0 -w 0 -e ${edate} -C ${NBU_CLIENT_SOURCE} -D ${NBU_CLIENT_NAME} -f $TMP_DIR/restore_fs_list"
|
||||
+ bprestore_args="-B -H -L $backup_restore_log_file -8 -R $TMP_DIR/nbu_change_file -t 0 -w 0 -e ${edate} -C ${NBU_CLIENT_SOURCE} -D ${NBU_CLIENT_NAME} -f $TMP_DIR/restore_fs_list"
|
||||
else
|
||||
- bprestore_args="-B -H -L $TMP_DIR/bplog.restore -8 -R $TMP_DIR/nbu_change_file -t 0 -w 0 -C ${NBU_CLIENT_SOURCE} -D ${NBU_CLIENT_NAME} -f $TMP_DIR/restore_fs_list"
|
||||
+ bprestore_args="-B -H -L $backup_restore_log_file -8 -R $TMP_DIR/nbu_change_file -t 0 -w 0 -C ${NBU_CLIENT_SOURCE} -D ${NBU_CLIENT_NAME} -f $TMP_DIR/restore_fs_list"
|
||||
fi
|
||||
|
||||
LogPrint "RUN: /usr/openv/netbackup/bin/bprestore $bprestore_args"
|
||||
-LogPrint "Restore progress: see $TMP_DIR/bplog.restore"
|
||||
+LogPrint "Restore progress: see $backup_restore_log_file"
|
||||
LANG=C /usr/openv/netbackup/bin/bprestore $bprestore_args
|
||||
rc=$?
|
||||
if (( $rc > 1 )) ; then
|
@ -1,60 +0,0 @@
|
||||
diff --git a/usr/share/rear/lib/framework-functions.sh b/usr/share/rear/lib/framework-functions.sh
|
||||
index 4878216b..e919bdbf 100644
|
||||
--- a/usr/share/rear/lib/framework-functions.sh
|
||||
+++ b/usr/share/rear/lib/framework-functions.sh
|
||||
@@ -121,7 +121,7 @@ function cleanup_build_area_and_end_program () {
|
||||
sleep 2
|
||||
umount_mountpoint_lazy $BUILD_DIR/outputfs
|
||||
fi
|
||||
- remove_temporary_mountpoint '$BUILD_DIR/outputfs' || BugError "Directory $BUILD_DIR/outputfs not empty, can not remove"
|
||||
+ remove_temporary_mountpoint "$BUILD_DIR/outputfs" || BugError "Directory $BUILD_DIR/outputfs not empty, can not remove"
|
||||
rmdir $v $BUILD_DIR >&2
|
||||
fi
|
||||
Log "End of program reached"
|
||||
diff --git a/usr/share/rear/lib/global-functions.sh b/usr/share/rear/lib/global-functions.sh
|
||||
index c1a11615..0f8f362d 100644
|
||||
--- a/usr/share/rear/lib/global-functions.sh
|
||||
+++ b/usr/share/rear/lib/global-functions.sh
|
||||
@@ -317,7 +317,20 @@ function url_path() {
|
||||
|
||||
### Returns true if one can upload files to the URL
|
||||
function scheme_accepts_files() {
|
||||
- local scheme=$1
|
||||
+ # Be safe against 'set -eu' which would exit 'rear' with "bash: $1: unbound variable"
|
||||
+ # when scheme_accepts_files is called without an argument
|
||||
+ # by bash parameter expansion with using an empty default value if $1 is unset or null.
|
||||
+ # Bash parameter expansion with assigning a default value ${1:=} does not work
|
||||
+ # (then it would still exit with "bash: $1: cannot assign in this way")
|
||||
+ # but using a default value is practicable here because $1 is used only once
|
||||
+ # cf. https://github.com/rear/rear/pull/2675#discussion_r705018956
|
||||
+ local scheme=${1:-}
|
||||
+ # Return false if scheme is empty or blank (e.g. when OUTPUT_URL is unset or empty or blank)
|
||||
+ # cf. https://github.com/rear/rear/issues/2676
|
||||
+ # and https://github.com/rear/rear/issues/2667#issuecomment-914447326
|
||||
+ # also return false if scheme is more than one word (so no quoted "$scheme" here)
|
||||
+ # cf. https://github.com/rear/rear/pull/2675#discussion_r704401462
|
||||
+ test $scheme || return 1
|
||||
case $scheme in
|
||||
(null|tape|obdr)
|
||||
# tapes do not support uploading arbitrary files, one has to handle them
|
||||
@@ -341,7 +354,10 @@ function scheme_accepts_files() {
|
||||
### Returning true does not imply that the URL is currently mounted at a filesystem and usable,
|
||||
### only that it can be mounted (use mount_url() first)
|
||||
function scheme_supports_filesystem() {
|
||||
- local scheme=$1
|
||||
+ # Be safe against 'set -eu' exit if scheme_supports_filesystem is called without argument
|
||||
+ local scheme=${1:-}
|
||||
+ # Return false if scheme is empty or blank or more than one word, cf. scheme_accepts_files() above
|
||||
+ test $scheme || return 1
|
||||
case $scheme in
|
||||
(null|tape|obdr|rsync|fish|ftp|ftps|hftp|http|https|sftp)
|
||||
return 1
|
||||
@@ -560,7 +576,7 @@ function umount_url() {
|
||||
|
||||
RemoveExitTask "perform_umount_url '$url' '$mountpoint' lazy"
|
||||
|
||||
- remove_temporary_mountpoint '$mountpoint' && RemoveExitTask "remove_temporary_mountpoint '$mountpoint'"
|
||||
+ remove_temporary_mountpoint "$mountpoint" && RemoveExitTask "remove_temporary_mountpoint '$mountpoint'"
|
||||
return 0
|
||||
}
|
||||
|
@ -0,0 +1,30 @@
|
||||
commit 9f859c13f5ba285cd1d5983c9b595975c21888d3
|
||||
Merge: 01f503ed 4434da63
|
||||
Author: pcahyna <pcahyna@users.noreply.github.com>
|
||||
Date: Tue Nov 14 14:33:56 2023 +0100
|
||||
|
||||
Merge pull request #3073 from pcahyna/resolve-libraries-for-symlinks-in-COPY_AS_IS
|
||||
|
||||
Resolve libs for executable links in COPY_AS_IS
|
||||
|
||||
diff --git a/usr/share/rear/build/GNU/Linux/100_copy_as_is.sh b/usr/share/rear/build/GNU/Linux/100_copy_as_is.sh
|
||||
index 2169efaa..2e991145 100644
|
||||
--- a/usr/share/rear/build/GNU/Linux/100_copy_as_is.sh
|
||||
+++ b/usr/share/rear/build/GNU/Linux/100_copy_as_is.sh
|
||||
@@ -135,10 +135,13 @@ local copy_as_is_file=""
|
||||
# cf. https://github.com/rear/rear/pull/2378
|
||||
# It is crucial to append to /dev/$DISPENSABLE_OUTPUT_DEV (cf. 'Print' in lib/_input-output-functions.sh):
|
||||
while read -r copy_as_is_file ; do
|
||||
- # Skip non-regular files like directories, device files, and 'tar' error messages (e.g. in case of non-existent files, see above):
|
||||
+ # Skip non-regular files like directories, device files, and 'tar' error messages (e.g. in case of non-existent files, see above)
|
||||
+ # but do not skip symbolic links. Their targets will be copied later by build/default/490_fix_broken_links.sh.
|
||||
+ # We thus need library dependencies for symlinked executables just like for normal executables
|
||||
+ # and build/default/490_fix_broken_links.sh does not perform library dependency scan.
|
||||
+ # See GitHub PR https://github.com/rear/rear/pull/3073
|
||||
+ # and issue https://github.com/rear/rear/issues/3064 for details.
|
||||
test -f "$copy_as_is_file" || continue
|
||||
- # Skip symbolic links (only care about symbolic link targets):
|
||||
- test -L "$copy_as_is_file" && continue
|
||||
# Remember actual regular files that are executable:
|
||||
test -x "$copy_as_is_file" && copy_as_is_executables+=( "$copy_as_is_file" )
|
||||
done < <( sort -u $copy_as_is_filelist_file ) 2>>/dev/$DISPENSABLE_OUTPUT_DEV
|
@ -1,38 +0,0 @@
|
||||
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
|
||||
index 9ada92c3..455aa3ce 100644
|
||||
--- a/usr/share/rear/conf/default.conf
|
||||
+++ b/usr/share/rear/conf/default.conf
|
||||
@@ -1813,7 +1813,7 @@ OBDR_BLOCKSIZE=2048
|
||||
# BACKUP=NBU stuff (Symantec/Veritas NetBackup)
|
||||
##
|
||||
#
|
||||
-COPY_AS_IS_NBU=( /usr/openv/bin/vnetd /usr/openv/bin/vopied /usr/openv/lib /usr/openv/netbackup /usr/openv/var/auth/[mn]*.txt )
|
||||
+COPY_AS_IS_NBU=( /usr/openv/bin/vnetd /usr/openv/bin/vopied /usr/openv/lib /usr/openv/netbackup /usr/openv/var/auth/[mn]*.txt /opt/VRTSpbx /etc/vx/VxICS /etc/vx/vrtslog.conf )
|
||||
COPY_AS_IS_EXCLUDE_NBU=( /usr/openv/netbackup/logs "/usr/openv/netbackup/bin/bpjava*" /usr/openv/netbackup/bin/xbp /usr/openv/netbackup/bin/private /usr/openv/lib/java /usr/openv/lib/shared/vddk /usr/openv/netbackup/baremetal )
|
||||
# See https://github.com/rear/rear/issues/2105 why /usr/openv/netbackup/sec/at/lib/ is needed:
|
||||
NBU_LD_LIBRARY_PATH="/usr/openv/lib:/usr/openv/netbackup/sec/at/lib/"
|
||||
diff --git a/usr/share/rear/rescue/NBU/default/450_prepare_netbackup.sh b/usr/share/rear/rescue/NBU/default/450_prepare_netbackup.sh
|
||||
index cd48b8d9..ae5a3ccc 100644
|
||||
--- a/usr/share/rear/rescue/NBU/default/450_prepare_netbackup.sh
|
||||
+++ b/usr/share/rear/rescue/NBU/default/450_prepare_netbackup.sh
|
||||
@@ -7,6 +7,12 @@
|
||||
|
||||
[[ $NBU_version -lt 7 ]] && return # NBU is using xinetd when version <7.x
|
||||
|
||||
+if [ -e "/etc/init.d/vxpbx_exchanged" ]; then
|
||||
+ cp $v /etc/init.d/vxpbx_exchanged $ROOTFS_DIR/etc/scripts/system-setup.d/vxpbx_exchanged.real
|
||||
+ chmod $v +x $ROOTFS_DIR/etc/scripts/system-setup.d/vxpbx_exchanged.real
|
||||
+ echo "( /etc/scripts/system-setup.d/vxpbx_exchanged.real start )" > $ROOTFS_DIR/etc/scripts/system-setup.d/89-vxpbx_exchanged.sh
|
||||
+fi
|
||||
+
|
||||
if [ -e "/etc/init.d/netbackup" ]; then
|
||||
cp $v /etc/init.d/netbackup $ROOTFS_DIR/etc/scripts/system-setup.d/netbackup.real
|
||||
chmod $v +x $ROOTFS_DIR/etc/scripts/system-setup.d/netbackup.real
|
||||
diff --git a/usr/share/rear/skel/NBU/usr/openv/tmp/.gitignore b/usr/share/rear/skel/NBU/usr/openv/tmp/.gitignore
|
||||
new file mode 100644
|
||||
index 00000000..d6b7ef32
|
||||
--- /dev/null
|
||||
+++ b/usr/share/rear/skel/NBU/usr/openv/tmp/.gitignore
|
||||
@@ -0,0 +1,2 @@
|
||||
+*
|
||||
+!.gitignore
|
@ -0,0 +1,62 @@
|
||||
From c8409e1f2972e9cd87d9390ca0b52b908d1a872a Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Zaoral?= <lzaoral@redhat.com>
|
||||
Date: Wed, 20 Mar 2024 12:22:46 +0100
|
||||
Subject: [PATCH] skip btrfs subvolumes when detecting ESP partitions
|
||||
|
||||
The idea is to find all direct partitions that contain the ESP
|
||||
mount point and to skip all other transitive `fs:` dependencies.
|
||||
|
||||
The `diskdeps.conf` file contains following entries on default Fedora
|
||||
installations (the list was shortened to only the relevant ones):
|
||||
```
|
||||
/dev/vda1 /dev/vda
|
||||
/dev/vda4 /dev/vda
|
||||
/dev/vda5 /dev/vda
|
||||
fs:/boot/efi /dev/vda1
|
||||
fs:/boot/efi fs:/boot
|
||||
fs:/boot/efi fs:/
|
||||
fs:/boot/efi btrfsmountedsubvol:/
|
||||
fs:/boot /dev/vda4
|
||||
fs:/boot fs:/
|
||||
fs:/boot btrfsmountedsubvol:/
|
||||
fs:/ /dev/vda5
|
||||
btrfsmountedsubvol:/ /dev/vda5
|
||||
```
|
||||
|
||||
The ESP partition is only on `/dev/vda1`. However, the `find_partition` call
|
||||
was not taking into account the need to skip mounted btrfs subvolumes as well.
|
||||
Therefore, `/dev/vda5` was listed as an ESP partition as well.
|
||||
|
||||
This change makes sure that only direct ESP partitions are listed and
|
||||
fixes a bug where ReaR would create broken BootXXXX entries which point to
|
||||
completely unrelated partitions.
|
||||
|
||||
Relevant excerpts from logs:
|
||||
```
|
||||
++ efibootmgr --create --gpt --disk /dev/vda --part 1 --write-signature --label 'RedHatEnterpriseServer 41' --loader '\EFI\fedora\grubx64.efi'
|
||||
...
|
||||
++ efibootmgr --create --gpt --disk /dev/vda --part 5 --write-signature --label 'RedHatEnterpriseServer 41' --loader '\EFI\fedora\grubx64.efi'
|
||||
```
|
||||
---
|
||||
usr/share/rear/finalize/Linux-i386/670_run_efibootmgr.sh | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/usr/share/rear/finalize/Linux-i386/670_run_efibootmgr.sh b/usr/share/rear/finalize/Linux-i386/670_run_efibootmgr.sh
|
||||
index 33d87767..8b658618 100644
|
||||
--- a/usr/share/rear/finalize/Linux-i386/670_run_efibootmgr.sh
|
||||
+++ b/usr/share/rear/finalize/Linux-i386/670_run_efibootmgr.sh
|
||||
@@ -47,7 +47,10 @@ fi
|
||||
# accounting for possible trailing slashes in TARGET_FS_ROOT
|
||||
esp_mountpoint_inside="${esp_mountpoint#${TARGET_FS_ROOT%%*(/)}}"
|
||||
|
||||
-boot_efi_parts=$( find_partition "fs:$esp_mountpoint_inside" fs )
|
||||
+# Find all partitions with the ESP mount point and skip all other transitive
|
||||
+# 'fs' and 'btrfsmountedsubvol' components in LAYOUT_DEPS (var/lib/rear/layout/diskdeps.conf)
|
||||
+# to support ESP on software RAID (cf. https://github.com/rear/rear/pull/2608).
|
||||
+boot_efi_parts=$( find_partition "fs:$esp_mountpoint_inside" 'btrfsmountedsubvol fs' )
|
||||
if ! test "$boot_efi_parts" ; then
|
||||
LogPrint "Unable to find ESP $esp_mountpoint_inside in layout"
|
||||
LogPrint "Trying to determine device currently mounted at $esp_mountpoint as fallback"
|
||||
--
|
||||
2.44.0
|
||||
|
@ -0,0 +1,90 @@
|
||||
commit c08658d5a0260c3242bb817e77b9c6dadecd14f6
|
||||
Merge: 879e173f db191aaf
|
||||
Author: pcahyna <pcahyna@users.noreply.github.com>
|
||||
Date: Wed Sep 13 12:46:54 2023 +0200
|
||||
|
||||
Merge pull request #3047 from pcahyna/skip-invalid-drives
|
||||
|
||||
Skip invalid disk drives (zero sized, no media) when saving layout
|
||||
|
||||
Cherry-picked-by: Lukáš Zaoral <lzaoral@redhat.com>
|
||||
|
||||
diff --git a/usr/share/rear/layout/save/GNU/Linux/200_partition_layout.sh b/usr/share/rear/layout/save/GNU/Linux/200_partition_layout.sh
|
||||
index 9d6e0bc6..b2dc743a 100644
|
||||
--- a/usr/share/rear/layout/save/GNU/Linux/200_partition_layout.sh
|
||||
+++ b/usr/share/rear/layout/save/GNU/Linux/200_partition_layout.sh
|
||||
@@ -413,17 +413,21 @@ Log "Saving disks and their partitions"
|
||||
elif [[ ! ($blockd = *rpmb || $blockd = *[0-9]boot[0-9]) ]]; then # Silently skip Replay Protected Memory Blocks and others
|
||||
devname=$(get_device_name $disk)
|
||||
devsize=$(get_disk_size ${disk#/sys/block/})
|
||||
- disktype=$(parted -s $devname print | grep -E "Partition Table|Disk label" | cut -d ":" -f "2" | tr -d " ")
|
||||
# Ensure syntactically correct 'disk' entries:
|
||||
# Each value must exist and each value must be a single non-blank word so we 'test' without quoting the value:
|
||||
test $devname || Error "Invalid 'disk' entry (no disk device name for '$disk')"
|
||||
test $devsize || Error "Invalid 'disk $devname' entry (no device size for '$devname')"
|
||||
- # We do not error out when there is no partition label type value because
|
||||
- # "rear recover" works in a special case without partition label type value when there is
|
||||
- # only a 'disk' entry but nothing else for this disk exists in disklayout.conf
|
||||
- # which can happen when /dev/sdX is an empty SD card slot without medium,
|
||||
- # see https://github.com/rear/rear/issues/2810
|
||||
- test $disktype || LogPrintError "No partition label type for 'disk $devname' (may cause 'rear recover' failure)"
|
||||
+ # Validation error can happen when /dev/sdX is an empty SD card slot without medium,
|
||||
+ # see https://github.com/rear/rear/issues/2810 https://github.com/rear/rear/issues/2958
|
||||
+ # this is normal, but such device must be skipped and not be added to the layout
|
||||
+ # - it does not contain any data anyway.
|
||||
+ # See https://github.com/rear/rear/pull/3047
|
||||
+ if ! validation_error=$(is_disk_valid $devname) ; then
|
||||
+ LogPrintError "Ignoring $blockd: $validation_error"
|
||||
+ continue
|
||||
+ fi
|
||||
+ disktype=$(parted -s $devname print | grep -E "Partition Table|Disk label" | cut -d ":" -f "2" | tr -d " ")
|
||||
+ test $disktype || Error "Invalid 'disk $devname' entry (no partition table type for '$devname')"
|
||||
if [ "$disktype" != "dasd" ]; then
|
||||
echo "# Disk $devname"
|
||||
echo "# Format: disk <devname> <size(bytes)> <partition label type>"
|
||||
diff --git a/usr/share/rear/lib/layout-functions.sh b/usr/share/rear/lib/layout-functions.sh
|
||||
index 6dd43313..e46478d6 100644
|
||||
--- a/usr/share/rear/lib/layout-functions.sh
|
||||
+++ b/usr/share/rear/lib/layout-functions.sh
|
||||
@@ -819,6 +819,41 @@ is_disk_a_pv() {
|
||||
return 1
|
||||
}
|
||||
|
||||
+# Check whether disk is suitable for being added to layout
|
||||
+# Can be used to skip obviously unsuitable/broken devices
|
||||
+# (missing device node, zero size, device can't be opened).
|
||||
+# Should not be used to skip potential mapping targets before layout restoration
|
||||
+# - an invalid disk may become valid later, for example if it is a DASD that needs
|
||||
+# low-level formatting (see 090_include_dasd_code.sh and 360_generate_dasd_format_code.sh),
|
||||
+# unformatted DASDs show zero size.
|
||||
+# Returns 0 if the device is ok
|
||||
+# Returns nonzero code if it should be skipped, and a text describing the error
|
||||
+# on stdout
|
||||
+# usage example:
|
||||
+# local err
|
||||
+# if ! err=$(is_disk_valid /dev/sda); then
|
||||
+
|
||||
+function is_disk_valid {
|
||||
+ local disk="$1"
|
||||
+ local size
|
||||
+
|
||||
+ if ! test -b "$disk" ; then
|
||||
+ echo "$disk is not a block device"
|
||||
+ return 1
|
||||
+ fi
|
||||
+ # capture stdout in a variable and redirect stderr to stdout - the error message
|
||||
+ # will be our output
|
||||
+ if { size=$(blockdev --getsize64 "$disk") ; } 2>&1 ; then
|
||||
+ if ! test "$size" -gt 0 2>/dev/null ; then
|
||||
+ echo "$disk has invalid size $size"
|
||||
+ return 1
|
||||
+ fi
|
||||
+ return 0
|
||||
+ else
|
||||
+ return 1
|
||||
+ fi
|
||||
+}
|
||||
+
|
||||
function is_multipath_used {
|
||||
# Return 'false' if there is no multipath command:
|
||||
type multipath &>/dev/null || return 1
|
@ -1,37 +0,0 @@
|
||||
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
|
||||
index 9ada92c3..3bdb5497 100644
|
||||
--- a/usr/share/rear/conf/default.conf
|
||||
+++ b/usr/share/rear/conf/default.conf
|
||||
@@ -57,10 +57,16 @@
|
||||
#
|
||||
# where /prefix/for/rear/working/directory must already exist.
|
||||
# This is useful for example when there is not sufficient free space
|
||||
-# in /tmp or $TMPDIR for the ISO image or even the backup archive.
|
||||
-# TMPDIR cannot be set to a default value here, otherwise /usr/sbin/rear
|
||||
+# in /var/tmp or $TMPDIR for the ISO image or even the backup archive.
|
||||
+# TMPDIR cannot be set to a default value here unconditionally but only
|
||||
+# if it is not set before calling the program, otherwise /usr/sbin/rear
|
||||
# would not work in compliance with the Linux/Unix standards regarding TMPDIR
|
||||
# see https://github.com/rear/rear/issues/968
|
||||
+# The default is /var/tmp instead of the more usual /tmp (the system default),
|
||||
+# because /tmp is not intended for such large amounts of data that ReaR usually
|
||||
+# produces when creating the image (see file-hierarchy(7)). In particular,
|
||||
+# /tmp can be a tmpfs, and thus restricted by the available RAM/swap.
|
||||
+export TMPDIR="${TMPDIR-/var/tmp}"
|
||||
|
||||
##
|
||||
# ROOT_HOME_DIR
|
||||
diff --git a/usr/share/rear/rescue/GNU/Linux/600_unset_TMPDIR_in_rescue_conf.sh b/usr/share/rear/rescue/GNU/Linux/600_unset_TMPDIR_in_rescue_conf.sh
|
||||
deleted file mode 100644
|
||||
index 84d0cabb..00000000
|
||||
--- a/usr/share/rear/rescue/GNU/Linux/600_unset_TMPDIR_in_rescue_conf.sh
|
||||
+++ /dev/null
|
||||
@@ -1,8 +0,0 @@
|
||||
-cat - <<EOF >> "$ROOTFS_DIR/etc/rear/rescue.conf"
|
||||
-# TMPDIR variable may be defined in local.conf file as prefix dir for mktemp command
|
||||
-# e.g. by defining TMPDIR=/var we would get our BUILD_DIR=/var/tmp/rear.XXXXXXXXXXXX
|
||||
-# However, in rescue we want our BUILD_DIR=/tmp/rear.XXXXXXX as we are not sure that
|
||||
-# the user defined TMPDIR would exist in our rescue image
|
||||
-# by 'unset TMPDIR' we achieve above goal (as rescue.conf is read after local.conf)!
|
||||
-unset TMPDIR
|
||||
-EOF
|
@ -0,0 +1,343 @@
|
||||
commit 283efdaea10ff62dc94e968f74e1136b8384a954
|
||||
Merge: 41c2d9b1 70a39382
|
||||
Author: Johannes Meixner <jsmeix@suse.com>
|
||||
Date: Fri Jul 21 14:56:34 2023 +0200
|
||||
|
||||
Merge pull request #3025 from rear/jsmeix-create_grub2_cfg
|
||||
|
||||
Fixed create_grub2_cfg function usage:
|
||||
Introduced GRUB2_SET_ROOT_COMMAND config variable
|
||||
in addition to the existing GRUB2_SEARCH_ROOT_COMMAND
|
||||
to get consistency how GRUB2 sets and/or searches its 'root' device
|
||||
and adapted the create_grub2_cfg function calls accordingly.
|
||||
Furthermore enhanced some messages regarding Secure Boot setup.
|
||||
|
||||
Cherry-picked-by: Lukáš Zaoral <lzaoral@redhat.com>
|
||||
|
||||
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
|
||||
index 3e29280f..5ec89049 100644
|
||||
--- a/usr/share/rear/conf/default.conf
|
||||
+++ b/usr/share/rear/conf/default.conf
|
||||
@@ -1210,15 +1210,6 @@ USB_BIOS_BOOT_DEFAULT=""
|
||||
# Default is using GRUB2 for EFI other then elilo, extlinux for ext, syslinux otherwise:
|
||||
USB_BOOTLOADER=
|
||||
#
|
||||
-# USB EFI booting can benefit with a better search string than the default:
|
||||
-# GRUB2_SEARCH_ROOT_COMMAND="search --no-floppy --set=root --label REAR-EFI
|
||||
-# as hardcoded in script output/USB/Linux-i386/100_create_efiboot.sh
|
||||
-# Only to be used by experts. An example of a different setup could be:
|
||||
-# GRUB2_SEARCH_ROOT_COMMAND="search --no-floppy --set=root --label REAR-EFI --hint hd0,msdos1"
|
||||
-# or
|
||||
-# GRUB2_SEARCH_ROOT_COMMAND="search --no-floppy --set=root --file /EFI/BOOT/BOOTX64.efi"
|
||||
-GRUB2_SEARCH_ROOT_COMMAND=""
|
||||
-#
|
||||
# Resulting files that should be copied onto the USB stick:
|
||||
USB_FILES=()
|
||||
#
|
||||
@@ -3550,12 +3541,12 @@ GRUB2_INSTALL_DEVICES="${GRUB2_INSTALL_DEVICES:-}"
|
||||
# and /boot/efi, if applicable.
|
||||
# More modules can be installed into the Grub2 standalone image ramdisk without
|
||||
# being included in the core image, see GRUB2_MODULES_UEFI.
|
||||
-# This variable currently applies when building Grub2 boot loader for UEFI in two scenarios:
|
||||
+# This variable currently applies when building GRUB2 boot loader for UEFI in two scenarios:
|
||||
# 1. UEFI boot without secure boot (SECURE_BOOT_BOOTLOADER="")
|
||||
# and / or
|
||||
# 2. UEFI boot with GRUB_RESCUE="y"
|
||||
-# Incorrect use of this variable can lead to unusable ReaR recovery system.
|
||||
-# When you modify this variable, verify that your ReaR recovery system works.
|
||||
+# Incorrect use of this variable can lead to an unusable ReaR recovery system.
|
||||
+# When you specify it, verify that your ReaR recovery system works.
|
||||
GRUB2_MODULES_UEFI_LOAD=()
|
||||
|
||||
##
|
||||
@@ -3565,8 +3556,8 @@ GRUB2_MODULES_UEFI_LOAD=()
|
||||
# When empty ReaR will use the defaults of grub-mkstandalone
|
||||
# (install all modules in the standalone image ramdisk)
|
||||
# This variable currently applies in the same scenarios as GRUB2_MODULES_UEFI_LOAD.
|
||||
-# Incorrect use of this variable can lead to unusable ReaR recovery system.
|
||||
-# When you modify this variable, verify that your ReaR recovery system works.
|
||||
+# Incorrect use of this variable can lead to an unusable ReaR recovery system.
|
||||
+# When you specify it, verify that your ReaR recovery system works.
|
||||
GRUB2_MODULES_UEFI=()
|
||||
|
||||
##
|
||||
@@ -3587,6 +3578,29 @@ GRUB2_DEFAULT_BOOT="chainloader"
|
||||
# The timeout in seconds to automatically boot GRUB2_DEFAULT_BOOT
|
||||
# when GRUB2 is used as bootloader for the ReaR recovery system.
|
||||
GRUB2_TIMEOUT="$USER_INPUT_TIMEOUT"
|
||||
+#
|
||||
+# GRUB2_SET_ROOT_COMMAND
|
||||
+# GRUB2_SEARCH_ROOT_COMMAND
|
||||
+# Incorrect use of those variables can lead to an unusable ReaR recovery system.
|
||||
+# When you specify one of them, verify that your ReaR recovery system works.
|
||||
+# GRUB2_SET_ROOT_COMMAND is a GRUB2 command to set the 'root' device in GRUB2.
|
||||
+# For example to set the first CDROM device to be used as 'root' device in GRUB2 use
|
||||
+# GRUB2_SET_ROOT_COMMAND="set root=cd0"
|
||||
+# GRUB2_SEARCH_ROOT_COMMAND is a GRUB2 command to let GRUB2 search for its 'root' device.
|
||||
+# For example USB EFI booting may need a different search string than the default like
|
||||
+# GRUB2_SEARCH_ROOT_COMMAND="search --no-floppy --set=root --label REAR-EFI"
|
||||
+# cf. the script output/USB/Linux-i386/100_create_efiboot.sh
|
||||
+# Other examples of a different setup could be like
|
||||
+# GRUB2_SEARCH_ROOT_COMMAND="search --no-floppy --set=root --label REAR-EFI --hint hd0,msdos1"
|
||||
+# or
|
||||
+# GRUB2_SEARCH_ROOT_COMMAND="search --no-floppy --set=root --file /EFI/BOOT/BOOTX64.efi"
|
||||
+# When both GRUB2_SET_ROOT_COMMAND and GRUB2_SEARCH_ROOT_COMMAND are specified
|
||||
+# then GRUB2_SET_ROOT_COMMAND is done before GRUB2_SEARCH_ROOT_COMMAND
|
||||
+# so GRUB2_SET_ROOT_COMMAND sets a default 'root' device and
|
||||
+# then GRUB2 searches for a 'root' device via GRUB2_SEARCH_ROOT_COMMAND
|
||||
+# which is used if one is found - otherwise the default 'root' device is used as fallback.
|
||||
+GRUB2_SET_ROOT_COMMAND=""
|
||||
+GRUB2_SEARCH_ROOT_COMMAND=""
|
||||
|
||||
##
|
||||
# USING_UEFI_BOOTLOADER
|
||||
@@ -3625,13 +3639,18 @@ USING_UEFI_BOOTLOADER=
|
||||
##
|
||||
# SECURE_BOOT_BOOTLOADER
|
||||
#
|
||||
-# When using Secure Boot set full path of your signed boot loader here.
|
||||
-# e. g.
|
||||
-# SECURE_BOOT_BOOTLOADER="/boot/efi/EFI/BOOT/shim.efi"
|
||||
-#
|
||||
-# SECURE_BOOT_BOOTLOADER overrides UEFI_BOOTLOADER
|
||||
-#
|
||||
-# c.f. https://github.com/rear/rear/pull/1385
|
||||
+# When using Secure Boot specify the full path of the Secure Boot bootloader.
|
||||
+# For example: SECURE_BOOT_BOOTLOADER="/boot/efi/EFI/BOOT/shim.efi"
|
||||
+# SECURE_BOOT_BOOTLOADER overrides UEFI_BOOTLOADER.
|
||||
+# Normally Shim is the only used Secure Boot bootloader.
|
||||
+# For a technical description of Shim see https://mjg59.dreamwidth.org/19448.html
|
||||
+# Shim is a first stage bootloader that loads and executes a second stage bootloader
|
||||
+# which normally is GRUB that is usually available as a grub*.efi file.
|
||||
+# When Shim is used, its second stage bootloader can be actually anything
|
||||
+# named grub*.efi (second stage bootloader is Shim compile time option)
|
||||
+# so when for example SECURE_BOOT_BOOTLOADER="/boot/efi/EFI/BOOT/shim.efi" is specified
|
||||
+# then all /boot/efi/EFI/BOOT/grub*.efi files are made available as second stage bootloader.
|
||||
+# For more details see the output/ISO/Linux-i386/250_populate_efibootimg.sh script.
|
||||
SECURE_BOOT_BOOTLOADER=""
|
||||
|
||||
##
|
||||
diff --git a/usr/share/rear/lib/bootloader-functions.sh b/usr/share/rear/lib/bootloader-functions.sh
|
||||
index 5f18d2ad..f3e27937 100644
|
||||
--- a/usr/share/rear/lib/bootloader-functions.sh
|
||||
+++ b/usr/share/rear/lib/bootloader-functions.sh
|
||||
@@ -536,25 +536,25 @@ function get_root_disk_UUID {
|
||||
# so that kernel and initrd are /boot_mountpoint/path/to/kernel and /boot_mountpoint/path/to/initrd
|
||||
# and that boot partition gets set as root device name for GRUB2's
|
||||
# then $1 would have to be /path/to/kernel and $2 would have to be /path/to/initrd
|
||||
-# $3 is an appropriate GRUB2 command to set its root device (usually via GRUB2's 'root' environment variable)
|
||||
-# e.g. when the filesystem that contains kernel and initrd has the filesystem label REARBOOT
|
||||
-# then $3 could be something like 'search --no-floppy --set root --label REARBOOT'
|
||||
function create_grub2_cfg {
|
||||
local grub2_kernel="$1"
|
||||
test "$grub2_kernel" || BugError "create_grub2_cfg function called without grub2_kernel argument"
|
||||
- DebugPrint "Configuring GRUB2 kernel $grub2_kernel"
|
||||
+ DebugPrint "Let GRUB2 load kernel $grub2_kernel"
|
||||
local grub2_initrd="$2"
|
||||
test "$grub2_initrd" || BugError "create_grub2_cfg function called without grub2_initrd argument"
|
||||
- DebugPrint "Configuring GRUB2 initrd $grub2_initrd"
|
||||
- local grub2_search_root_command="$3"
|
||||
- if ! test "$grub2_search_root_command" ; then
|
||||
- test "$grub2_set_root" && grub2_search_root_command="set root=$grub2_set_root"
|
||||
- fi
|
||||
- if ! test "$grub2_search_root_command" ; then
|
||||
- test "$GRUB2_SEARCH_ROOT_COMMAND" && grub2_search_root_command="$GRUB2_SEARCH_ROOT_COMMAND"
|
||||
+ DebugPrint "Let GRUB2 load initrd $grub2_initrd"
|
||||
+
|
||||
+ # Before https://github.com/rear/rear/pull/3025 it was possible to call create_grub2_cfg()
|
||||
+ # with a third argument that is a "search GRUB2 'root' device command" string:
|
||||
+ test "$3" && BugError "create_grub2_cfg function must not be called with a third argument"
|
||||
+ # Since https://github.com/rear/rear/pull/3025 GRUB2_SET_ROOT_COMMAND and/or GRUB2_SEARCH_ROOT_COMMAND must be specified:
|
||||
+ if contains_visible_char "$GRUB2_SEARCH_ROOT_COMMAND" ; then
|
||||
+ contains_visible_char "$GRUB2_SET_ROOT_COMMAND" && DebugPrint "Set GRUB2 default root device via '$GRUB2_SET_ROOT_COMMAND'"
|
||||
+ DebugPrint "Let GRUB2 search root device via '$GRUB2_SEARCH_ROOT_COMMAND'"
|
||||
+ else
|
||||
+ contains_visible_char "$GRUB2_SET_ROOT_COMMAND" || BugError "create_grub2_cfg function called but neither GRUB2_SET_ROOT_COMMAND nor GRUB2_SEARCH_ROOT_COMMAND is specified"
|
||||
+ DebugPrint "Set GRUB2 root device via '$GRUB2_SET_ROOT_COMMAND'"
|
||||
fi
|
||||
- test "$grub2_search_root_command" || grub2_search_root_command="search --no-floppy --set=root --file /boot/efiboot.img"
|
||||
- DebugPrint "Configuring GRUB2 root device as '$grub2_search_root_command'"
|
||||
|
||||
local grub2_default_menu_entry="$GRUB2_DEFAULT_BOOT"
|
||||
test "$grub2_default_menu_entry" || grub2_default_menu_entry="chainloader"
|
||||
@@ -613,6 +613,9 @@ function create_grub2_cfg {
|
||||
echo "terminal_input serial"
|
||||
echo "terminal_output serial"
|
||||
fi
|
||||
+ else
|
||||
+ DebugPrint "No serial console in GRUB2 (USE_SERIAL_CONSOLE is not true)"
|
||||
+ echo "echo 'No serial console (USE_SERIAL_CONSOLE was not true)'"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -632,7 +635,6 @@ menuentry "Relax-and-Recover (BIOS or UEFI without Secure Boot)" --id=rear {
|
||||
echo 'Loading initial ramdisk $grub2_initrd ...'
|
||||
initrd $grub2_initrd
|
||||
}
|
||||
-
|
||||
menuentry "Relax-and-Recover (UEFI and Secure Boot)" --id=rear_secure_boot {
|
||||
insmod gzio
|
||||
insmod xzio
|
||||
@@ -714,10 +716,14 @@ EOF
|
||||
|
||||
# The actual work starts here.
|
||||
# Create and output GRUB2 configuration.
|
||||
- # Sleep 3 seconds before the GRUB2 menu replaces what there is on the screen
|
||||
- # so that the user has a chance to see possible (error) messages on the screen.
|
||||
+ # Sleep (interruptible) USER_INPUT_INTERRUPT_TIMEOUT seconds (by default 30 seconds)
|
||||
+ # before the GRUB2 menu replaces what there is on the screen
|
||||
+ # so that the user can read and understand possible (error) messages on the screen.
|
||||
cat << EOF
|
||||
-$grub2_search_root_command
|
||||
+$GRUB2_SET_ROOT_COMMAND
|
||||
+$GRUB2_SEARCH_ROOT_COMMAND
|
||||
+echo "Using root device (\$root) - available devices are:"
|
||||
+ls
|
||||
insmod all_video
|
||||
set gfxpayload=keep
|
||||
insmod part_gpt
|
||||
@@ -727,8 +733,8 @@ $( create_grub2_serial_entry )
|
||||
set timeout="$grub2_timeout"
|
||||
set default="$grub2_default_menu_entry"
|
||||
set fallback="chainloader"
|
||||
-echo 'Switching to GRUB2 boot menu...'
|
||||
-sleep --verbose --interruptible 3
|
||||
+echo 'Switching to GRUB boot menu...'
|
||||
+sleep --verbose --interruptible $USER_INPUT_INTERRUPT_TIMEOUT
|
||||
$( create_grub2_rear_boot_entry )
|
||||
$( create_grub2_boot_next_entry )
|
||||
$( create_grub2_reboot_entry )
|
||||
diff --git a/usr/share/rear/output/ISO/Linux-i386/250_populate_efibootimg.sh b/usr/share/rear/output/ISO/Linux-i386/250_populate_efibootimg.sh
|
||||
index c0fc5834..ff97dbd1 100644
|
||||
--- a/usr/share/rear/output/ISO/Linux-i386/250_populate_efibootimg.sh
|
||||
+++ b/usr/share/rear/output/ISO/Linux-i386/250_populate_efibootimg.sh
|
||||
@@ -13,22 +13,32 @@ mkdir $v -p $efi_boot_tmp_dir || Error "Could not create $efi_boot_tmp_dir"
|
||||
mkdir $v -p $efi_boot_tmp_dir/fonts || Error "Could not create $efi_boot_tmp_dir/fonts"
|
||||
mkdir $v -p $efi_boot_tmp_dir/locale || Error "Could not create $efi_boot_tmp_dir/locale"
|
||||
|
||||
-# Copy the grub*.efi executable to EFI/BOOT/BOOTX64.efi
|
||||
+# Copy the grub*.efi or shim.efi executable to EFI/BOOT/BOOTX64.efi
|
||||
# Intentionally an empty UEFI_BOOTLOADER results an invalid "cp -v /tmp/.../mnt/EFI/BOOT/BOOTX64.efi" command that fails:
|
||||
cp $v "$UEFI_BOOTLOADER" $efi_boot_tmp_dir/BOOTX64.efi || Error "Could not find UEFI_BOOTLOADER '$UEFI_BOOTLOADER'"
|
||||
local uefi_bootloader_dirname="$( dirname $UEFI_BOOTLOADER )"
|
||||
if test -f "$SECURE_BOOT_BOOTLOADER" ; then
|
||||
- # FIXME: Explain why it tests that a SECURE_BOOT_BOOTLOADER file exists
|
||||
- # but then it copies any grub*.efi files and ignores if there are none.
|
||||
- # Why does it not copy SECURE_BOOT_BOOTLOADER and errors out if that fails?
|
||||
- # If shim is used, bootloader can be actually anything
|
||||
- # named as grub*.efi (follow-up loader is shim compile time option), see
|
||||
+ # For a technical description of Shim see https://mjg59.dreamwidth.org/19448.html
|
||||
+ # Shim is a signed EFI binary that is a first stage bootloader
|
||||
+ # that loads and executes another (signed) EFI binary
|
||||
+ # which normally is a second stage bootloader
|
||||
+ # which normally is a GRUB EFI binary
|
||||
+ # which normally is available as a file named grub*.efi
|
||||
+ # so when SECURE_BOOT_BOOTLOADER is used as UEFI_BOOTLOADER
|
||||
+ # (cf. rescue/default/850_save_sysfs_uefi_vars.sh)
|
||||
+ # then Shim (usually shim.efi) was copied above as efi_boot_tmp_dir/BOOTX64.efi
|
||||
+ # and Shim's second stage bootloader must be also copied where Shim already is.
|
||||
+ DebugPrint "Using Shim '$SECURE_BOOT_BOOTLOADER' as first stage UEFI bootloader BOOTX64.efi"
|
||||
+ # When Shim is used, its second stage bootloader can be actually anything
|
||||
+ # named grub*.efi (second stage bootloader is Shim compile time option), see
|
||||
# http://www.rodsbooks.com/efi-bootloaders/secureboot.html#initial_shim
|
||||
+ local second_stage_UEFI_bootloader_files="$( echo $uefi_bootloader_dirname/grub*.efi )"
|
||||
# Avoid 'nullglob' pitfall when nothing matches .../grub*.efi which results
|
||||
# an invalid "cp -v /tmp/.../mnt/EFI/BOOT/" command that fails
|
||||
# cf. https://github.com/rear/rear/issues/1921
|
||||
- local shim_files="$( echo $uefi_bootloader_dirname/grub*.efi )"
|
||||
- test "$shim_files" && cp $v $shim_files $efi_boot_tmp_dir/
|
||||
+ test "$second_stage_UEFI_bootloader_files" || Error "Could not find second stage bootloader '$uefi_bootloader_dirname/grub*.efi' for Shim"
|
||||
+ DebugPrint "Using second stage UEFI bootloader files for Shim: $second_stage_UEFI_bootloader_files"
|
||||
+ cp $v $second_stage_UEFI_bootloader_files $efi_boot_tmp_dir/ || Error "Failed to copy second stage bootloader files for Shim"
|
||||
fi
|
||||
|
||||
# FIXME: Do we need to test if we are ebiso at all?
|
||||
@@ -47,6 +57,12 @@ if test "ebiso" = "$( basename $ISO_MKISOFS_BIN )" ; then
|
||||
cp -pL $v $KERNEL_FILE $efi_boot_tmp_dir/kernel || Error "Failed to copy KERNEL_FILE '$KERNEL_FILE' to $efi_boot_tmp_dir/kernel"
|
||||
cp $v $TMP_DIR/$REAR_INITRD_FILENAME $efi_boot_tmp_dir/$REAR_INITRD_FILENAME || Error "Failed to copy initrd '$REAR_INITRD_FILENAME' into $efi_boot_tmp_dir"
|
||||
create_ebiso_elilo_conf > $efi_boot_tmp_dir/elilo.conf
|
||||
+ # We need to set the GRUB environment variable 'root' to a reasonable default/fallback value
|
||||
+ # because GRUB's default 'root' (or GRUB's 'root' identifcation heuristics) would point to the ramdisk
|
||||
+ # but neither kernel nor initrd are located on the ramdisk but on the device where the recovery system was booted from.
|
||||
+ # GRUB2_SET_ROOT_COMMAND and/or GRUB2_SEARCH_ROOT_COMMAND is needed by the create_grub2_cfg() function.
|
||||
+ # Set GRUB2_SET_ROOT_COMMAND if not specified by the user:
|
||||
+ contains_visible_char "$GRUB2_SET_ROOT_COMMAND" || GRUB2_SET_ROOT_COMMAND="set root=cd0"
|
||||
create_grub2_cfg /isolinux/kernel /isolinux/$REAR_INITRD_FILENAME > $efi_boot_tmp_dir/grub.cfg
|
||||
fi
|
||||
fi
|
||||
@@ -67,10 +83,12 @@ else
|
||||
# This was seen at least in Debian Buster running in Qemu
|
||||
# (VirtualBox works fine, RHEL/CentOS in Qemu works fine as well).
|
||||
# The GRUB2 image created by grub-mkstandalone has 'root' set to memdisk, which can't work.
|
||||
- # To make ReaR work in this case, set 'root' to a sensible value 'cd0' before trying search
|
||||
- # (via ${grub2_set_root:+"set root=$grub2_set_root"} in the create_grub2_cfg function)
|
||||
+ # To make ReaR work in this case, set 'root' to a sensible default value 'cd0'
|
||||
+ # before trying to search via GRUB2_SEARCH_ROOT_COMMAND in the create_grub2_cfg function
|
||||
# cf. https://github.com/rear/rear/issues/2434 and https://github.com/rear/rear/pull/2453
|
||||
- grub2_set_root=cd0
|
||||
+ # Set GRUB2_SET_ROOT_COMMAND and GRUB2_SEARCH_ROOT_COMMAND if not specified by the user:
|
||||
+ contains_visible_char "$GRUB2_SET_ROOT_COMMAND" || GRUB2_SET_ROOT_COMMAND="set root=cd0"
|
||||
+ contains_visible_char "$GRUB2_SEARCH_ROOT_COMMAND" || GRUB2_SEARCH_ROOT_COMMAND="search --no-floppy --set=root --file /boot/efiboot.img"
|
||||
create_grub2_cfg /isolinux/kernel /isolinux/$REAR_INITRD_FILENAME > $efi_boot_tmp_dir/grub.cfg
|
||||
fi
|
||||
|
||||
diff --git a/usr/share/rear/output/USB/Linux-i386/100_create_efiboot.sh b/usr/share/rear/output/USB/Linux-i386/100_create_efiboot.sh
|
||||
index 1f6ca069..8ad4d97e 100644
|
||||
--- a/usr/share/rear/output/USB/Linux-i386/100_create_efiboot.sh
|
||||
+++ b/usr/share/rear/output/USB/Linux-i386/100_create_efiboot.sh
|
||||
@@ -93,11 +93,13 @@ EOF
|
||||
;;
|
||||
(2)
|
||||
DebugPrint "Configuring GRUB2 for EFI boot"
|
||||
- # We need to explicitly set GRUB 2 'root' variable to $efi_label (hardcoded "REAR-EFI")
|
||||
- # because default $root would point to memdisk, where kernel and initrd are NOT present.
|
||||
- # GRUB2_SEARCH_ROOT_COMMAND is used in the create_grub2_cfg() function:
|
||||
- [[ -z "$GRUB2_SEARCH_ROOT_COMMAND" ]] && GRUB2_SEARCH_ROOT_COMMAND="search --no-floppy --set=root --label $efi_label"
|
||||
- # Create config for GRUB 2
|
||||
+ # We need to set the GRUB environment variable 'root' to the partition device with label $efi_label (hardcoded "REAR-EFI")
|
||||
+ # because GRUB's default 'root' (or GRUB's 'root' identifcation heuristics) would point to the ramdisk but neither kernel
|
||||
+ # nor initrd are located on the ramdisk but on the partition device with label $efi_label.
|
||||
+ # GRUB2_SET_ROOT_COMMAND and/or GRUB2_SEARCH_ROOT_COMMAND is needed by the create_grub2_cfg() function.
|
||||
+ # Set GRUB2_SEARCH_ROOT_COMMAND if not specified by the user:
|
||||
+ contains_visible_char "$GRUB2_SEARCH_ROOT_COMMAND" || GRUB2_SEARCH_ROOT_COMMAND="search --no-floppy --set=root --label $efi_label"
|
||||
+ # Create config for GRUB2:
|
||||
create_grub2_cfg $efi_dir/kernel $efi_dir/$REAR_INITRD_FILENAME > $efi_dst/grub.cfg
|
||||
# Create BOOTX86.efi but only if we are NOT secure booting.
|
||||
# We are not able to create signed boot loader
|
||||
diff --git a/usr/share/rear/output/USB/Linux-i386/300_create_grub.sh b/usr/share/rear/output/USB/Linux-i386/300_create_grub.sh
|
||||
index c2566bc5..1dbfe1de 100644
|
||||
--- a/usr/share/rear/output/USB/Linux-i386/300_create_grub.sh
|
||||
+++ b/usr/share/rear/output/USB/Linux-i386/300_create_grub.sh
|
||||
@@ -70,10 +70,11 @@ if is_true $USING_UEFI_BOOTLOADER ; then
|
||||
# grub[2]-install creates the $BUILD_DIR/outputfs/boot/grub[2] sub-directory that is needed
|
||||
# to create the GRUB2 config $BUILD_DIR/outputfs/boot/grub[2].cfg in the next step:
|
||||
DebugPrint "Creating GRUB2 config for legacy BIOS boot as USB bootloader"
|
||||
-test "$USB_DEVICE_BOOT_LABEL" || USB_DEVICE_BOOT_LABEL="REARBOOT"
|
||||
+contains_visible_char "$USB_DEVICE_BOOT_LABEL" || USB_DEVICE_BOOT_LABEL="REARBOOT"
|
||||
# We need to set the GRUB environment variable 'root' to the partition device with filesystem label USB_DEVICE_BOOT_LABEL
|
||||
# because GRUB's default 'root' (or GRUB's 'root' identifcation heuristics) would point to the ramdisk but neither kernel
|
||||
# nor initrd are located on the ramdisk but on the partition device with filesystem label USB_DEVICE_BOOT_LABEL.
|
||||
-# GRUB2_SEARCH_ROOT_COMMAND is used in the create_grub2_cfg() function:
|
||||
-GRUB2_SEARCH_ROOT_COMMAND="search --no-floppy --set=root --label $USB_DEVICE_BOOT_LABEL"
|
||||
-create_grub2_cfg /$USB_PREFIX/kernel /$USB_PREFIX/$REAR_INITRD_FILENAME > $usb_boot_dir/$grub_cfg || Error "Failed to create $usb_boot_dir/$grub_cfg"
|
||||
+# GRUB2_SET_ROOT_COMMAND and/or GRUB2_SEARCH_ROOT_COMMAND is needed by the create_grub2_cfg() function.
|
||||
+# Set GRUB2_SEARCH_ROOT_COMMAND if not specified by the user:
|
||||
+contains_visible_char "$GRUB2_SEARCH_ROOT_COMMAND" || GRUB2_SEARCH_ROOT_COMMAND="search --no-floppy --set=root --label $USB_DEVICE_BOOT_LABEL"
|
||||
+create_grub2_cfg /$USB_PREFIX/kernel /$USB_PREFIX/$REAR_INITRD_FILENAME > $usb_boot_dir/$grub_cfg
|
||||
diff --git a/usr/share/rear/rescue/default/850_save_sysfs_uefi_vars.sh b/usr/share/rear/rescue/default/850_save_sysfs_uefi_vars.sh
|
||||
index a1af17fa..051f2755 100644
|
||||
--- a/usr/share/rear/rescue/default/850_save_sysfs_uefi_vars.sh
|
||||
+++ b/usr/share/rear/rescue/default/850_save_sysfs_uefi_vars.sh
|
||||
@@ -135,7 +135,11 @@ for dummy in "once" ; do
|
||||
done
|
||||
|
||||
# Show to the user what will actually be used as UEFI bootloader file:
|
||||
-LogPrint "Using '$UEFI_BOOTLOADER' as UEFI bootloader file"
|
||||
+if test -f "$SECURE_BOOT_BOOTLOADER" ; then
|
||||
+ LogPrint "Using '$UEFI_BOOTLOADER' as UEFI Secure Boot bootloader file"
|
||||
+else
|
||||
+ LogPrint "Using '$UEFI_BOOTLOADER' as UEFI bootloader file (non Secure Boot)"
|
||||
+fi
|
||||
|
||||
# Save the variables we need in recover mode into the rescue.conf file:
|
||||
cat - <<EOF >> "$ROOTFS_DIR/etc/rear/rescue.conf"
|
@ -1,41 +0,0 @@
|
||||
commit 1cd41052f7a7cd42ea14ea53b7280c73624aba3f
|
||||
Author: Johannes Meixner <jsmeix@suse.com>
|
||||
Date: Mon Mar 21 12:14:21 2022 +0100
|
||||
|
||||
Merge pull request #2774 from rear/jsmeix-1024-USB_UEFI_PART_SIZE
|
||||
|
||||
In default.conf increase USB_UEFI_PART_SIZE to 1024 MiB,
|
||||
cf. https://github.com/rear/rear/pull/1205
|
||||
in particular to also make things work by default when additional
|
||||
third-party kernel modules and firmware (e.g. from Nvidia) are used,
|
||||
cf. https://github.com/rear/rear/issues/2770#issuecomment-1068935688
|
||||
|
||||
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
|
||||
index 8faa56aa..17a764cb 100644
|
||||
--- a/usr/share/rear/conf/default.conf
|
||||
+++ b/usr/share/rear/conf/default.conf
|
||||
@@ -872,13 +872,20 @@ USB_PARTITION_ALIGN_BLOCK_SIZE="8"
|
||||
# in MiB when formatting a medium by the format workflow.
|
||||
# If USB_UEFI_PART_SIZE is empty or invalid (i.e. not an unsigned integer larger than 0)
|
||||
# the user must interactively enter a valid value while running the format workflow.
|
||||
-# The default value of 400 MiB should be sufficiently big and it is in compliance
|
||||
-# with the 8 MiB partition alignment default value ( 400 = 8 * 50 )
|
||||
-# and even with a 16 MiB partition alignment value ( 400 = 16 * 25 )
|
||||
+# The default value of 1024 MiB should be sufficiently big
|
||||
# cf. https://github.com/rear/rear/pull/1205
|
||||
+# in particular when third-party kernel modules and firmware (e.g. from Nvidia) are used
|
||||
+# cf. https://github.com/rear/rear/issues/2770#issuecomment-1068935688
|
||||
+# and 1024 MiB is in compliance with the 8 MiB partition alignment value ( 1024 = 8 * 128 )
|
||||
+# and also with higher 2^n MiB partition alignment values.
|
||||
+# Furthermore the default value of 1024 MiB results that the FAT filesystem of the ESP
|
||||
+# will be in compliance with that the ESP should officially use a FAT32 filesystem
|
||||
+# because mkfs.vfat automatically makes a FAT32 filesystem starting at 512 MiB
|
||||
+# (a FAT16 ESP works in most cases but causes issues with certain UEFI firmware)
|
||||
+# cf. https://github.com/rear/rear/issues/2575
|
||||
# The value of USB_UEFI_PART_SIZE will be rounded to the nearest
|
||||
# USB_PARTITION_ALIGN_BLOCK_SIZE chunk:
|
||||
-USB_UEFI_PART_SIZE="400"
|
||||
+USB_UEFI_PART_SIZE="1024"
|
||||
#
|
||||
# Default boot option (i.e. what gets booted automatically after some timeout)
|
||||
# when EXTLINUX boots the USB stick or USB disk or other disk device on BIOS systems.
|
@ -1,21 +0,0 @@
|
||||
commit ead05a460d3b219372f47be888ba6011c7fd3318
|
||||
Author: Pavel Cahyna <pcahyna@redhat.com>
|
||||
Date: Tue Aug 22 12:32:04 2023 +0200
|
||||
|
||||
Fix downstream only bug
|
||||
|
||||
\$IsInArray -> IsInArray - it is a shell function, not a variable.
|
||||
|
||||
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 d34ab335..a65a9c8e 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
|
||||
@@ -246,7 +246,7 @@ create_lvmvol() {
|
||||
local warnraidline
|
||||
|
||||
if [ $is_thin -eq 0 ] ; then
|
||||
- ifline="if IsInArray $vg \"\${create_logical_volumes[@]}\" && ! \$IsInArray $vg \"\${create_thin_volumes_only[@]}\" ; then"
|
||||
+ ifline="if IsInArray $vg \"\${create_logical_volumes[@]}\" && ! IsInArray $vg \"\${create_thin_volumes_only[@]}\" ; then"
|
||||
else
|
||||
ifline="if IsInArray $vg \"\${create_logical_volumes[@]}\" ; then"
|
||||
fi
|
@ -1,864 +0,0 @@
|
||||
commit e6a9c973dbb7be6e46ed9a7fe34df0635635fed6
|
||||
Author: Johannes Meixner <jsmeix@suse.com>
|
||||
Date: Tue Jul 12 13:59:28 2022 +0200
|
||||
|
||||
Merge pull request #2831 from pcahyna/rsync-url-fix-refactor
|
||||
|
||||
Refactor rsync URL support, fixes rsync OUTPUT_URL:
|
||||
The code to parse rsync:// URLs was BACKUP_URL specific.
|
||||
If one specified BACKUP=RSYNC and an OUTPUT_URL different from BACKUP_URL,
|
||||
the OUTPUT_URL was ignored and the output files went to BACKUP_URL.
|
||||
Fix by introducing generic functions for rsync URL parsing and
|
||||
use them for both BACKUP_URL and OUTPUT_URL, as appropriate.
|
||||
Replace all uses of global RSYNC_* variables derived
|
||||
from BACKUP_URL by those functions.
|
||||
There also was inconsistent special handling for OUTPUT=PXE which is now removed:
|
||||
An rsync OUTPUT_URL with OUTPUT=PXE now creates the RSYNC_PREFIX directory
|
||||
at the destination and the URL is interpreted as in all other cases.
|
||||
See https://github.com/rear/rear/pull/2831
|
||||
and https://github.com/rear/rear/issues/2781
|
||||
|
||||
diff --git a/usr/share/rear/backup/NETFS/default/200_check_rsync_relative_option.sh b/usr/share/rear/backup/NETFS/default/200_check_rsync_relative_option.sh
|
||||
deleted file mode 120000
|
||||
index 336b83f5..00000000
|
||||
--- a/usr/share/rear/backup/NETFS/default/200_check_rsync_relative_option.sh
|
||||
+++ /dev/null
|
||||
@@ -1 +0,0 @@
|
||||
-../../RSYNC/default/200_check_rsync_relative_option.sh
|
||||
\ No newline at end of file
|
||||
diff --git a/usr/share/rear/backup/NETFS/default/210_check_rsync_relative_option.sh b/usr/share/rear/backup/NETFS/default/210_check_rsync_relative_option.sh
|
||||
new file mode 120000
|
||||
index 00000000..0570eb44
|
||||
--- /dev/null
|
||||
+++ b/usr/share/rear/backup/NETFS/default/210_check_rsync_relative_option.sh
|
||||
@@ -0,0 +1 @@
|
||||
+../../RSYNC/default/210_check_rsync_relative_option.sh
|
||||
\ No newline at end of file
|
||||
diff --git a/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh b/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh
|
||||
index 1692ba4c..dd198ede 100644
|
||||
--- a/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh
|
||||
+++ b/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh
|
||||
@@ -6,29 +6,29 @@ local backup_prog_rc
|
||||
touch "${TMP_DIR}/selinux.autorelabel"
|
||||
cat $TMP_DIR/selinux.mode > $SELINUX_ENFORCE
|
||||
Log "Restored original SELinux mode"
|
||||
- case $RSYNC_PROTO in
|
||||
+ case $(rsync_proto "$BACKUP_URL") in
|
||||
|
||||
(ssh)
|
||||
# for some reason rsync changes the mode of backup after each run to 666
|
||||
# FIXME: Add an explanatory comment why "2>/dev/null" is useful here
|
||||
# or remove it according to https://github.com/rear/rear/issues/1395
|
||||
- ssh $RSYNC_USER@$RSYNC_HOST "chmod $v 755 ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" 2>/dev/null
|
||||
+ ssh $(rsync_remote_ssh "$BACKUP_URL") "chmod $v 755 $(rsync_path_full "$BACKUP_URL")/backup" 2>/dev/null
|
||||
$BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" \
|
||||
- "$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel" 2>/dev/null
|
||||
+ "$(rsync_remote_full "$BACKUP_URL")/backup/.autorelabel" 2>/dev/null
|
||||
backup_prog_rc=$?
|
||||
if [ $backup_prog_rc -ne 0 ]; then
|
||||
- LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]"
|
||||
- #StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
|
||||
+ LogPrint "Failed to create .autorelabel on $(rsync_path_full "$BACKUP_URL")/backup [${rsync_err_msg[$backup_prog_rc]}]"
|
||||
+ #StopIfError "Failed to create .autorelabel on $(rsync_path_full "$BACKUP_URL")/backup"
|
||||
fi
|
||||
;;
|
||||
|
||||
(rsync)
|
||||
$BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" "${BACKUP_RSYNC_OPTIONS[@]}" \
|
||||
- "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel"
|
||||
+ "$(rsync_remote_full "$BACKUP_URL")/backup/.autorelabel"
|
||||
backup_prog_rc=$?
|
||||
if [ $backup_prog_rc -ne 0 ]; then
|
||||
- LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]"
|
||||
- #StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
|
||||
+ LogPrint "Failed to create .autorelabel on $(rsync_path_full "$BACKUP_URL")/backup [${rsync_err_msg[$backup_prog_rc]}]"
|
||||
+ #StopIfError "Failed to create .autorelabel on $(rsync_path_full "$BACKUP_URL")/backup"
|
||||
fi
|
||||
;;
|
||||
|
||||
diff --git a/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh b/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh
|
||||
index 9a17d6bb..de57d571 100644
|
||||
--- a/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh
|
||||
+++ b/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh
|
||||
@@ -4,29 +4,29 @@ local backup_prog_rc
|
||||
|
||||
> "${TMP_DIR}/selinux.autorelabel"
|
||||
|
||||
- case $RSYNC_PROTO in
|
||||
+ case $(rsync_proto "$BACKUP_URL") in
|
||||
|
||||
(ssh)
|
||||
# for some reason rsync changes the mode of backup after each run to 666
|
||||
# FIXME: Add an explanatory comment why "2>/dev/null" is useful here
|
||||
# or remove it according to https://github.com/rear/rear/issues/1395
|
||||
- ssh $RSYNC_USER@$RSYNC_HOST "chmod $v 755 ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" 2>/dev/null
|
||||
+ ssh $(rsync_remote_ssh "$BACKUP_URL") "chmod $v 755 $(rsync_path_full "$BACKUP_URL")/backup" 2>/dev/null
|
||||
$BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" \
|
||||
- "$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel" 2>/dev/null
|
||||
+ "$(rsync_remote_full "$BACKUP_URL")/backup/.autorelabel" 2>/dev/null
|
||||
backup_prog_rc=$?
|
||||
if [ $backup_prog_rc -ne 0 ]; then
|
||||
- LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]"
|
||||
- #StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
|
||||
+ LogPrint "Failed to create .autorelabel on $(rsync_path_full "$BACKUP_URL")/backup [${rsync_err_msg[$backup_prog_rc]}]"
|
||||
+ #StopIfError "Failed to create .autorelabel on $(rsync_path_full "$BACKUP_URL")/backup"
|
||||
fi
|
||||
;;
|
||||
|
||||
(rsync)
|
||||
$BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" "${BACKUP_RSYNC_OPTIONS[@]}" \
|
||||
- "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel"
|
||||
+ "$(rsync_remote_full "$BACKUP_URL")/backup/.autorelabel"
|
||||
backup_prog_rc=$?
|
||||
if [ $backup_prog_rc -ne 0 ]; then
|
||||
- LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]"
|
||||
- #StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
|
||||
+ LogPrint "Failed to create .autorelabel on $(rsync_path_full "$BACKUP_URL")/backup [${rsync_err_msg[$backup_prog_rc]}]"
|
||||
+ #StopIfError "Failed to create .autorelabel on $(rsync_path_full "$BACKUP_URL")/backup"
|
||||
fi
|
||||
;;
|
||||
|
||||
diff --git a/usr/share/rear/backup/RSYNC/default/200_make_prefix_dir.sh b/usr/share/rear/backup/RSYNC/default/200_make_prefix_dir.sh
|
||||
new file mode 100644
|
||||
index 00000000..81aa6879
|
||||
--- /dev/null
|
||||
+++ b/usr/share/rear/backup/RSYNC/default/200_make_prefix_dir.sh
|
||||
@@ -0,0 +1,28 @@
|
||||
+# Create RSYNC_PREFIX/backup on remote rsync server
|
||||
+# RSYNC_PREFIX=$HOSTNAME as set in default.conf
|
||||
+
|
||||
+local proto host
|
||||
+
|
||||
+proto="$(rsync_proto "$BACKUP_URL")"
|
||||
+host="$(rsync_host "$BACKUP_URL")"
|
||||
+
|
||||
+mkdir -p $v -m0750 "${TMP_DIR}/rsync/${RSYNC_PREFIX}" >&2 || Error "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}'"
|
||||
+mkdir -p $v -m0755 "${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup" >&2 || Error "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup'"
|
||||
+
|
||||
+case $proto in
|
||||
+
|
||||
+ (ssh)
|
||||
+ $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "$(rsync_remote "$BACKUP_URL")" >/dev/null 2>&1 \
|
||||
+ || Error "Could not create '$(rsync_path_full "$BACKUP_URL")' on remote ${host}"
|
||||
+ ;;
|
||||
+
|
||||
+ (rsync)
|
||||
+ $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${BACKUP_RSYNC_OPTIONS[@]}" "$(rsync_remote "$BACKUP_URL")/" >/dev/null \
|
||||
+ || Error "Could not create '$(rsync_path_full "$BACKUP_URL")' on remote ${host}"
|
||||
+ ;;
|
||||
+
|
||||
+esac
|
||||
+
|
||||
+# We don't need it anymore, from now we operate on the remote copy
|
||||
+rmdir $v "${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup"
|
||||
+rmdir $v "${TMP_DIR}/rsync/${RSYNC_PREFIX}"
|
||||
diff --git a/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh b/usr/share/rear/backup/RSYNC/default/210_check_rsync_relative_option.sh
|
||||
similarity index 91%
|
||||
rename from usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh
|
||||
rename to usr/share/rear/backup/RSYNC/default/210_check_rsync_relative_option.sh
|
||||
index cedee9ce..692616b7 100644
|
||||
--- a/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh
|
||||
+++ b/usr/share/rear/backup/RSYNC/default/210_check_rsync_relative_option.sh
|
||||
@@ -1,4 +1,4 @@
|
||||
-# 200_check_rsync_relative_option.sh
|
||||
+# 210_check_rsync_relative_option.sh
|
||||
# See issue #871 for details
|
||||
|
||||
# check for the --relative option in BACKUP_RSYNC_OPTIONS array
|
||||
diff --git a/usr/share/rear/backup/RSYNC/default/450_calculate_req_space.sh b/usr/share/rear/backup/RSYNC/default/450_calculate_req_space.sh
|
||||
index eb99dbf6..037e49c0 100644
|
||||
--- a/usr/share/rear/backup/RSYNC/default/450_calculate_req_space.sh
|
||||
+++ b/usr/share/rear/backup/RSYNC/default/450_calculate_req_space.sh
|
||||
@@ -1,6 +1,12 @@
|
||||
# here we will calculate the space required to hold the backup archive on the remote rsync system
|
||||
# This file is part of Relax-and-Recover, licensed under the GNU General
|
||||
# Public License. Refer to the included COPYING for full text of license.
|
||||
+local proto host path
|
||||
+
|
||||
+proto="$(rsync_proto "$BACKUP_URL")"
|
||||
+host="$(rsync_host "$BACKUP_URL")"
|
||||
+path="$(rsync_path "$BACKUP_URL")"
|
||||
+
|
||||
_local_size=0
|
||||
_remote_size=0
|
||||
while read -r ; do
|
||||
@@ -13,17 +19,17 @@ while read -r ; do
|
||||
done < $TMP_DIR/backup-include.txt
|
||||
LogPrint "Estimated size of local file systems is $(( _local_size / 1024 )) MB"
|
||||
|
||||
-case $RSYNC_PROTO in
|
||||
+case $proto in
|
||||
(ssh)
|
||||
- LogPrint "Calculating size of $RSYNC_HOST:$RSYNC_PATH"
|
||||
- ssh -l $RSYNC_USER $RSYNC_HOST "df -P $RSYNC_PATH" >$TMP_DIR/rs_size
|
||||
- StopIfError "Failed to determine size of $RSYNC_PATH"
|
||||
+ LogPrint "Calculating size of ${host}:${path}"
|
||||
+ ssh $(rsync_remote_ssh "$BACKUP_URL") "df -P ${path}" >$TMP_DIR/rs_size
|
||||
+ StopIfError "Failed to determine size of ${path}"
|
||||
_div=1 # 1024-blocks
|
||||
grep -q "512-blocks" $TMP_DIR/rs_size && _div=2 # HPUX: divide with 2 to get kB size
|
||||
_remote_size=$( tail -n 1 $TMP_DIR/rs_size | awk '{print $2}' )
|
||||
_remote_size=$(( _remote_size / _div ))
|
||||
[[ $_remote_size -gt $_local_size ]]
|
||||
- StopIfError "Not enough disk space available on $RSYNC_HOST:$RSYNC_PATH ($_remote_size < $_local_size)"
|
||||
+ StopIfError "Not enough disk space available on ${host}:${path} ($_remote_size < $_local_size)"
|
||||
;;
|
||||
(rsync)
|
||||
# TODO: how can we calculate the free size on remote system via rsync protocol??
|
||||
diff --git a/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh b/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh
|
||||
index 750a04ca..aa8192c0 100644
|
||||
--- a/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh
|
||||
+++ b/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh
|
||||
@@ -5,6 +5,11 @@
|
||||
local backup_prog_rc
|
||||
local backup_log_message
|
||||
|
||||
+local host path
|
||||
+
|
||||
+host="$(rsync_host "$BACKUP_URL")"
|
||||
+path="$(rsync_path "$BACKUP_URL")"
|
||||
+
|
||||
Log "Include list:"
|
||||
while read -r ; do
|
||||
Log " $REPLY"
|
||||
@@ -14,26 +19,27 @@ while read -r ; do
|
||||
Log " $REPLY"
|
||||
done < $TMP_DIR/backup-exclude.txt
|
||||
|
||||
-LogPrint "Creating $BACKUP_PROG backup on '${RSYNC_HOST}:${RSYNC_PATH}'"
|
||||
+LogPrint "Creating $BACKUP_PROG backup on '${host}:${path}'"
|
||||
|
||||
ProgressStart "Running backup operation"
|
||||
(
|
||||
case "$(basename $BACKUP_PROG)" in
|
||||
|
||||
(rsync)
|
||||
+ # We are in a subshell, so this change will not propagate to later scripts
|
||||
BACKUP_RSYNC_OPTIONS+=( --one-file-system --delete --exclude-from=$TMP_DIR/backup-exclude.txt --delete-excluded )
|
||||
|
||||
- case $RSYNC_PROTO in
|
||||
+ case $(rsync_proto "$BACKUP_URL") in
|
||||
|
||||
(ssh)
|
||||
- Log $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" $(cat $TMP_DIR/backup-include.txt) "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
|
||||
+ Log $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" $(cat $TMP_DIR/backup-include.txt) "$(rsync_remote_full "$BACKUP_URL")/backup"
|
||||
$BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" $(cat $TMP_DIR/backup-include.txt) \
|
||||
- "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
|
||||
+ "$(rsync_remote_full "$BACKUP_URL")/backup"
|
||||
;;
|
||||
|
||||
(rsync)
|
||||
$BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" $(cat $TMP_DIR/backup-include.txt) \
|
||||
- "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
|
||||
+ "$(rsync_remote_full "$BACKUP_URL")/backup"
|
||||
;;
|
||||
|
||||
esac
|
||||
@@ -57,11 +63,11 @@ get_size() {
|
||||
}
|
||||
|
||||
check_remote_df() {
|
||||
- echo $(ssh ${RSYNC_USER}@${RSYNC_HOST} df -P ${RSYNC_PATH} 2>/dev/null | tail -1 | awk '{print $5}' | sed -e 's/%//')
|
||||
+ echo $(ssh $(rsync_remote_ssh "$BACKUP_URL") df -P ${path} 2>/dev/null | tail -1 | awk '{print $5}' | sed -e 's/%//')
|
||||
}
|
||||
|
||||
check_remote_du() {
|
||||
- x=$(ssh ${RSYNC_USER}@${RSYNC_HOST} du -sb ${RSYNC_PATH}/${RSYNC_PREFIX}/backup 2>/dev/null | awk '{print $1}')
|
||||
+ x=$(ssh $(rsync_remote_ssh "$BACKUP_URL") du -sb $(rsync_path_full "$BACKUP_URL")/backup 2>/dev/null | awk '{print $1}')
|
||||
[[ -z "${x}" ]] && x=0
|
||||
echo $x
|
||||
}
|
||||
@@ -81,7 +87,7 @@ case "$(basename $BACKUP_PROG)" in
|
||||
case $i in
|
||||
|
||||
300)
|
||||
- [[ $(check_remote_df) -eq 100 ]] && Error "Disk is full on system ${RSYNC_HOST}"
|
||||
+ [[ $(check_remote_df) -eq 100 ]] && Error "Disk is full on system ${host}"
|
||||
;;
|
||||
|
||||
15|30|45|60|75|90|105|120|135|150|165|180|195|210|225|240|255|270|285)
|
||||
diff --git a/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh b/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh
|
||||
index b90d459b..76b9f971 100644
|
||||
--- a/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh
|
||||
+++ b/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh
|
||||
@@ -1,26 +1,27 @@
|
||||
|
||||
# copy the backup.log & rear.log file to remote destination with timestamp added
|
||||
-local timestamp
|
||||
+local timestamp proto
|
||||
|
||||
timestamp=$( date +%Y%m%d.%H%M )
|
||||
+proto="$(rsync_proto "$BACKUP_URL")"
|
||||
|
||||
# compress the log file first
|
||||
gzip "$TMP_DIR/$BACKUP_PROG_ARCHIVE.log" || Error "Failed to 'gzip $TMP_DIR/$BACKUP_PROG_ARCHIVE.log'"
|
||||
|
||||
-case $RSYNC_PROTO in
|
||||
+case $proto in
|
||||
(ssh)
|
||||
# FIXME: Add an explanatory comment why "2>/dev/null" is useful here
|
||||
# or remove it according to https://github.com/rear/rear/issues/1395
|
||||
$BACKUP_PROG -a "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log.gz" \
|
||||
- "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${timestamp}.log.gz" 2>/dev/null
|
||||
+ "$(rsync_remote_full "$BACKUP_URL")/${BACKUP_PROG_ARCHIVE}-${timestamp}.log.gz" 2>/dev/null
|
||||
|
||||
- $BACKUP_PROG -a "$RUNTIME_LOGFILE" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/rear-${timestamp}.log" 2>/dev/null
|
||||
+ $BACKUP_PROG -a "$RUNTIME_LOGFILE" "$(rsync_remote_full "$BACKUP_URL")/rear-${timestamp}.log" 2>/dev/null
|
||||
;;
|
||||
(rsync)
|
||||
$BACKUP_PROG -a "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log.gz" "${BACKUP_RSYNC_OPTIONS[@]}" \
|
||||
- "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${timestamp}.log.gz"
|
||||
+ "$(rsync_remote_full "$BACKUP_URL")/${BACKUP_PROG_ARCHIVE}-${timestamp}.log.gz"
|
||||
|
||||
- $BACKUP_PROG -a "$RUNTIME_LOGFILE" "${BACKUP_RSYNC_OPTIONS[@]}" "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}//rear-${timestamp}.log"
|
||||
+ $BACKUP_PROG -a "$RUNTIME_LOGFILE" "${BACKUP_RSYNC_OPTIONS[@]}" "$(rsync_remote_full "$BACKUP_URL")//rear-${timestamp}.log"
|
||||
;;
|
||||
esac
|
||||
|
||||
diff --git a/usr/share/rear/lib/global-functions.sh b/usr/share/rear/lib/global-functions.sh
|
||||
index 32aeb8ca..2edb64a6 100644
|
||||
--- a/usr/share/rear/lib/global-functions.sh
|
||||
+++ b/usr/share/rear/lib/global-functions.sh
|
||||
@@ -259,7 +259,7 @@ function url_scheme() {
|
||||
# the scheme is the leading part up to '://'
|
||||
local scheme=${url%%://*}
|
||||
# rsync scheme does not have to start with rsync:// it can also be scp style
|
||||
- # see the comments in usr/share/rear/prep/RSYNC/default/100_check_rsync.sh
|
||||
+ # see the comments in usr/share/rear/lib/rsync-functions.sh
|
||||
echo $scheme | grep -q ":" && echo rsync || echo $scheme
|
||||
}
|
||||
|
||||
diff --git a/usr/share/rear/lib/rsync-functions.sh b/usr/share/rear/lib/rsync-functions.sh
|
||||
new file mode 100644
|
||||
index 00000000..443a9625
|
||||
--- /dev/null
|
||||
+++ b/usr/share/rear/lib/rsync-functions.sh
|
||||
@@ -0,0 +1,178 @@
|
||||
+# Functions for manipulation of rsync URLs (both OUTPUT_URL and BACKUP_URL)
|
||||
+
|
||||
+#### OLD STYLE:
|
||||
+# BACKUP_URL=[USER@]HOST:PATH # using ssh (no rsh)
|
||||
+#
|
||||
+# with rsync protocol PATH is a MODULE name defined in remote /etc/rsyncd.conf file
|
||||
+# BACKUP_URL=[USER@]HOST::PATH # using rsync
|
||||
+# BACKUP_URL=rsync://[USER@]HOST[:PORT]/PATH # using rsync (is not compatible with new style!!!)
|
||||
+
|
||||
+#### NEW STYLE:
|
||||
+# BACKUP_URL=rsync://[USER@]HOST[:PORT]/PATH # using ssh
|
||||
+# BACKUP_URL=rsync://[USER@]HOST[:PORT]::/PATH # using rsync
|
||||
+
|
||||
+function rsync_validate () {
|
||||
+ local url="$1"
|
||||
+
|
||||
+ if [[ "$(url_scheme "$url")" != "rsync" ]]; then # url_scheme still recognizes old style
|
||||
+ BugError "Non-rsync URL $url !"
|
||||
+ fi
|
||||
+}
|
||||
+
|
||||
+# Determine whether the URL specifies the use of the rsync protocol (rsyncd) or ssh
|
||||
+# Do not call on non-rsync URLs (use url_scheme first)
|
||||
+function rsync_proto () {
|
||||
+ local url="$1"
|
||||
+
|
||||
+ rsync_validate "$url"
|
||||
+ if egrep -q '(::)' <<< $url ; then # new style '::' means rsync protocol
|
||||
+ echo rsync
|
||||
+ else
|
||||
+ echo ssh
|
||||
+ fi
|
||||
+}
|
||||
+
|
||||
+# Functions to parse the URL into its components:
|
||||
+# USER, HOST, PORT, PATH
|
||||
+
|
||||
+function rsync_user () {
|
||||
+ local url="$1"
|
||||
+ local host
|
||||
+
|
||||
+ host=$(url_host "$url")
|
||||
+
|
||||
+ if grep -q '@' <<< $host ; then
|
||||
+ echo "${host%%@*}" # grab user name
|
||||
+ else
|
||||
+ echo root
|
||||
+ fi
|
||||
+}
|
||||
+
|
||||
+function rsync_host () {
|
||||
+ local url="$1"
|
||||
+ local host
|
||||
+ local path
|
||||
+
|
||||
+ host=$(url_host "$url")
|
||||
+ path=$(url_path "$url")
|
||||
+ # remove USER@ if present
|
||||
+ local tmp2="${host#*@}"
|
||||
+
|
||||
+ case "$(rsync_proto "$url")" in
|
||||
+ (rsync)
|
||||
+ # tmp2=witsbebelnx02::backup or tmp2=witsbebelnx02::
|
||||
+ echo "${tmp2%%::*}"
|
||||
+ ;;
|
||||
+ (ssh)
|
||||
+ # tmp2=host or tmp2=host:
|
||||
+ echo "${tmp2%%:*}"
|
||||
+ ;;
|
||||
+ esac
|
||||
+}
|
||||
+
|
||||
+function rsync_path () {
|
||||
+ local url="$1"
|
||||
+ local host
|
||||
+ local path
|
||||
+ local url_without_scheme
|
||||
+ local url_without_scheme_user
|
||||
+
|
||||
+ host=$(url_host "$url")
|
||||
+ path=$(url_path "$url")
|
||||
+ local tmp2="${host#*@}"
|
||||
+
|
||||
+ url_without_scheme="${url#*//}"
|
||||
+ url_without_scheme_user="${url_without_scheme#$(rsync_user "$url")@}"
|
||||
+
|
||||
+ case "$(rsync_proto "$url")" in
|
||||
+
|
||||
+ (rsync)
|
||||
+ if grep -q '::' <<< $url_without_scheme_user ; then
|
||||
+ # we can not use url_path here, it uses / as separator, not ::
|
||||
+ local url_after_separator="${url_without_scheme_user##*::}"
|
||||
+ # remove leading / - this is a module name
|
||||
+ echo "${url_after_separator#/}"
|
||||
+ else
|
||||
+ echo "${path#*/}"
|
||||
+ fi
|
||||
+ ;;
|
||||
+ (ssh)
|
||||
+ if [ "$url_without_scheme" == "$url" ]; then
|
||||
+ # no scheme - old-style URL
|
||||
+ if grep -q ':' <<< $url_without_scheme_user ; then
|
||||
+ echo "${url_without_scheme_user##*:}"
|
||||
+ else
|
||||
+ BugError "Old-style rsync URL $url without : !"
|
||||
+ fi
|
||||
+ else
|
||||
+ echo "$path"
|
||||
+ fi
|
||||
+ ;;
|
||||
+
|
||||
+ esac
|
||||
+}
|
||||
+
|
||||
+function rsync_port () {
|
||||
+ # XXX changing port not implemented yet
|
||||
+ echo 873
|
||||
+}
|
||||
+
|
||||
+# Full path to the destination directory on the remote server,
|
||||
+# includes RSYNC_PREFIX. RSYNC_PREFIX is not given by the URL,
|
||||
+# it is a global parameter (by default derived from hostname).
|
||||
+function rsync_path_full () {
|
||||
+ local url="$1"
|
||||
+
|
||||
+ echo "$(rsync_path "$url")/${RSYNC_PREFIX}"
|
||||
+}
|
||||
+
|
||||
+# Argument for the ssh command to log in to the remote host ("user@host")
|
||||
+function rsync_remote_ssh () {
|
||||
+ local url="$1"
|
||||
+
|
||||
+ local user host
|
||||
+
|
||||
+ user="$(rsync_user "$url")"
|
||||
+ host="$(rsync_host "$url")"
|
||||
+
|
||||
+ echo "${user}@${host}"
|
||||
+}
|
||||
+
|
||||
+# Argument for the rsync command to reach the remote host, without path.
|
||||
+function rsync_remote_base () {
|
||||
+ local url="$1"
|
||||
+
|
||||
+ local user host port
|
||||
+
|
||||
+ user="$(rsync_user "$url")"
|
||||
+ host="$(rsync_host "$url")"
|
||||
+ port="$(rsync_port "$url")"
|
||||
+
|
||||
+ case "$(rsync_proto "$url")" in
|
||||
+
|
||||
+ (rsync)
|
||||
+ echo "rsync://${user}@${host}:${port}/"
|
||||
+ ;;
|
||||
+ (ssh)
|
||||
+ echo "$(rsync_remote_ssh "$url"):"
|
||||
+ ;;
|
||||
+
|
||||
+ esac
|
||||
+}
|
||||
+
|
||||
+# Complete argument to rsync to reach the remote location identified by URL,
|
||||
+# but without the added RSYNC_PREFIX.
|
||||
+# This essentially converts our rsync:// URLs into a form accepted by the rsync command.
|
||||
+function rsync_remote () {
|
||||
+ local url="$1"
|
||||
+
|
||||
+ echo "$(rsync_remote_base "$url")$(rsync_path "$url")"
|
||||
+}
|
||||
+
|
||||
+# Complete argument to rsync including even RSYNC_PREFIX.
|
||||
+# Determined from the URL and RSYNC_PREFIX.
|
||||
+function rsync_remote_full () {
|
||||
+ local url="$1"
|
||||
+
|
||||
+ echo "$(rsync_remote_base "$url")$(rsync_path_full "$url")"
|
||||
+}
|
||||
diff --git a/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh b/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh
|
||||
index 519febf5..d00d15e4 100644
|
||||
--- a/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh
|
||||
+++ b/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh
|
||||
@@ -1,20 +1,32 @@
|
||||
# Create RSYNC_PREFIX under the local TMP_DIR and also on remote rsync server
|
||||
# RSYNC_PREFIX=$HOSTNAME as set in default.conf
|
||||
|
||||
-# create temporary local work-spaces to collect files (we already make the remote backup dir with the correct mode!!)
|
||||
+local proto host scheme
|
||||
+
|
||||
+scheme="$(url_scheme "$OUTPUT_URL")"
|
||||
+
|
||||
+# we handle only rsync:// output schemes.
|
||||
+# ToDo: why does handling of the output URL scheme belong under RSYNC (which is a backup method)?
|
||||
+# OUTPUT_URL is independent on the chosen backup method, so this code should be moved to be backup-independent.
|
||||
+test "rsync" = "$scheme" || return 0
|
||||
+
|
||||
+proto="$(rsync_proto "$OUTPUT_URL")"
|
||||
+host="$(rsync_host "$OUTPUT_URL")"
|
||||
+
|
||||
+# create temporary local work-spaces to collect files
|
||||
mkdir -p $v -m0750 "${TMP_DIR}/rsync/${RSYNC_PREFIX}" >&2 || Error "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}'"
|
||||
-mkdir -p $v -m0755 "${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup" >&2 || Error "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup'"
|
||||
|
||||
-case $RSYNC_PROTO in
|
||||
+case $proto in
|
||||
|
||||
(ssh)
|
||||
- $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}" >/dev/null 2>&1 \
|
||||
- || Error "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}"
|
||||
+ $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "$(rsync_remote "$OUTPUT_URL")" >/dev/null 2>&1 \
|
||||
+ || Error "Could not create '$(rsync_path_full "$OUTPUT_URL")' on remote ${host}"
|
||||
;;
|
||||
|
||||
(rsync)
|
||||
- $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${BACKUP_RSYNC_OPTIONS[@]}" "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/" >/dev/null \
|
||||
- || Error "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}"
|
||||
+ # This must run before the backup stage. Otherwise --relative gets added to BACKUP_RSYNC_OPTIONS
|
||||
+ $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${BACKUP_RSYNC_OPTIONS[@]}" "$(rsync_remote "$OUTPUT_URL")/" >/dev/null \
|
||||
+ || Error "Could not create '$(rsync_path_full "$OUTPUT_URL")' on remote ${host}"
|
||||
;;
|
||||
|
||||
esac
|
||||
diff --git a/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh b/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh
|
||||
index 96b62da1..4ddf3cb4 100644
|
||||
--- a/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh
|
||||
+++ b/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh
|
||||
@@ -1,6 +1,17 @@
|
||||
#
|
||||
# copy resulting files to remote network (backup) location
|
||||
|
||||
+local proto scheme
|
||||
+
|
||||
+scheme="$(url_scheme "$OUTPUT_URL")"
|
||||
+
|
||||
+# we handle only rsync:// output schemes.
|
||||
+# ToDo: why does handling of the output URL scheme belong under RSYNC (which is a backup method)?
|
||||
+# OUTPUT_URL is independent on the chosen backup method, so this code should be moved to be backup-independent.
|
||||
+test "rsync" = "$scheme" || return 0
|
||||
+
|
||||
+proto="$(rsync_proto "$OUTPUT_URL")"
|
||||
+
|
||||
LogPrint "Copying resulting files to $OUTPUT_URL location"
|
||||
|
||||
# if called as mkbackuponly then we just don't have any result files.
|
||||
@@ -19,21 +30,21 @@ cp $v $(get_template "RESULT_usage_$OUTPUT.txt") "${TMP_DIR}/rsync/${RSYNC_PREFI
|
||||
cat "$RUNTIME_LOGFILE" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/rear.log" \
|
||||
|| Error "Could not copy $RUNTIME_LOGFILE to local rsync location"
|
||||
|
||||
-case $RSYNC_PROTO in
|
||||
+case $proto in
|
||||
|
||||
(ssh)
|
||||
- Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ ${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/"
|
||||
+ Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ $(rsync_remote_full "$OUTPUT_URL")/"
|
||||
# FIXME: Add an explanatory comment why "2>/dev/null" is useful here
|
||||
# or remove it according to https://github.com/rear/rear/issues/1395
|
||||
- $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null \
|
||||
+ $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "$(rsync_remote_full "$OUTPUT_URL")/" 2>/dev/null \
|
||||
|| Error "Could not copy '${RESULT_FILES[*]}' to $OUTPUT_URL location"
|
||||
;;
|
||||
|
||||
(rsync)
|
||||
- Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ ${BACKUP_RSYNC_OPTIONS[*]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/"
|
||||
+ Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ ${BACKUP_RSYNC_OPTIONS[*]} $(rsync_remote_full "$OUTPUT_URL")/"
|
||||
# FIXME: Add an explanatory comment why "2>/dev/null" is useful here
|
||||
# or remove it according to https://github.com/rear/rear/issues/1395
|
||||
- $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "${BACKUP_RSYNC_OPTIONS[@]}" "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null \
|
||||
+ $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "${BACKUP_RSYNC_OPTIONS[@]}" "$(rsync_remote_full "$OUTPUT_URL")/" 2>/dev/null \
|
||||
|| Error "Could not copy '${RESULT_FILES[*]}' to $OUTPUT_URL location"
|
||||
;;
|
||||
|
||||
diff --git a/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh b/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh
|
||||
index eb7df29e..84500039 100644
|
||||
--- a/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh
|
||||
+++ b/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh
|
||||
@@ -25,8 +25,10 @@ case $(basename $BACKUP_PROG) in
|
||||
|
||||
(rsync)
|
||||
if grep -q "no xattrs" "$TMP_DIR/rsync_protocol"; then
|
||||
+ local host
|
||||
+ host="$(rsync_host "$BACKUP_URL")"
|
||||
# no xattrs compiled in remote rsync, so saving SELinux attributes are not possible
|
||||
- Log "WARNING: --xattrs not possible on system ($RSYNC_HOST) (no xattrs compiled in rsync)"
|
||||
+ Log "WARNING: --xattrs not possible on system ($host) (no xattrs compiled in rsync)"
|
||||
# $TMP_DIR/selinux.mode is a trigger during backup to disable SELinux
|
||||
cat $SELINUX_ENFORCE > $TMP_DIR/selinux.mode
|
||||
RSYNC_SELINUX= # internal variable used in recover mode (empty means disable SELinux)
|
||||
diff --git a/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh b/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh
|
||||
index c964a148..448a1b1a 100644
|
||||
--- a/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh
|
||||
+++ b/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh
|
||||
@@ -3,97 +3,40 @@
|
||||
# This file is part of Relax-and-Recover, licensed under the GNU General
|
||||
# Public License. Refer to the included COPYING for full text of license.
|
||||
|
||||
-#### OLD STYLE:
|
||||
-# BACKUP_URL=[USER@]HOST:PATH # using ssh (no rsh)
|
||||
-#
|
||||
-# with rsync protocol PATH is a MODULE name defined in remote /etc/rsyncd.conf file
|
||||
-# BACKUP_URL=[USER@]HOST::PATH # using rsync
|
||||
-# BACKUP_URL=rsync://[USER@]HOST[:PORT]/PATH # using rsync (is not compatible with new style!!!)
|
||||
-
|
||||
-#### NEW STYLE:
|
||||
-# BACKUP_URL=rsync://[USER@]HOST[:PORT]/PATH # using ssh
|
||||
-# BACKUP_URL=rsync://[USER@]HOST[:PORT]::/PATH # using rsync
|
||||
-
|
||||
if test -z "$BACKUP_URL" ; then
|
||||
Error "Missing BACKUP_URL=rsync://[USER@]HOST[:PORT][::]/PATH !"
|
||||
fi
|
||||
|
||||
-local host=$(url_host $BACKUP_URL)
|
||||
local scheme=$(url_scheme $BACKUP_URL) # url_scheme still recognizes old style
|
||||
-local path=$(url_path $BACKUP_URL)
|
||||
|
||||
if [[ "$scheme" != "rsync" ]]; then
|
||||
Error "Missing BACKUP_URL=rsync://[USER@]HOST[:PORT][::]/PATH !"
|
||||
fi
|
||||
|
||||
-RSYNC_PROTO= # ssh or rsync
|
||||
-RSYNC_USER=
|
||||
-RSYNC_HOST=
|
||||
-RSYNC_PORT=873 # default port (of rsync server)
|
||||
-RSYNC_PATH=
|
||||
-
|
||||
-
|
||||
-if egrep -q '(::)' <<< $BACKUP_URL ; then # new style '::' means rsync protocol
|
||||
- RSYNC_PROTO=rsync
|
||||
-else
|
||||
- RSYNC_PROTO=ssh
|
||||
-fi
|
||||
-
|
||||
-if grep -q '@' <<< $host ; then
|
||||
- RSYNC_USER="${host%%@*}" # grab user name
|
||||
-else
|
||||
- RSYNC_USER=root
|
||||
-fi
|
||||
-
|
||||
-# remove USER@ if present (we don't need it anymore)
|
||||
-local tmp2="${host#*@}"
|
||||
-
|
||||
-case "$RSYNC_PROTO" in
|
||||
-
|
||||
- (rsync)
|
||||
- # tmp2=witsbebelnx02::backup or tmp2=witsbebelnx02::
|
||||
- RSYNC_HOST="${tmp2%%::*}"
|
||||
- # path=/gdhaese1@witsbebelnx02::backup or path=/backup
|
||||
- if grep -q '::' <<< $path ; then
|
||||
- RSYNC_PATH="${path##*::}"
|
||||
- else
|
||||
- RSYNC_PATH="${path##*/}"
|
||||
- fi
|
||||
- ;;
|
||||
- (ssh)
|
||||
- # tmp2=host or tmp2=host:
|
||||
- RSYNC_HOST="${tmp2%%:*}"
|
||||
- RSYNC_PATH=$path
|
||||
- ;;
|
||||
-
|
||||
-esac
|
||||
-
|
||||
-#echo RSYNC_PROTO=$RSYNC_PROTO
|
||||
-#echo RSYNC_USER=$RSYNC_USER
|
||||
-#echo RSYNC_HOST=$RSYNC_HOST
|
||||
-#echo RSYNC_PORT=$RSYNC_PORT
|
||||
-#echo RSYNC_PATH=$RSYNC_PATH
|
||||
+local host proto
|
||||
+host="$(rsync_host "$BACKUP_URL")"
|
||||
+proto="$(rsync_proto "$BACKUP_URL")"
|
||||
|
||||
# check if host is reachable
|
||||
if test "$PING" ; then
|
||||
- ping -c 2 "$RSYNC_HOST" >/dev/null || Error "Backup host [$RSYNC_HOST] not reachable."
|
||||
+ ping -c 2 "$host" >/dev/null || Error "Backup host [$host] not reachable."
|
||||
else
|
||||
Log "Skipping ping test"
|
||||
fi
|
||||
|
||||
# check protocol connectivity
|
||||
-case "$RSYNC_PROTO" in
|
||||
+case "$proto" in
|
||||
|
||||
(rsync)
|
||||
- Log "Test: $BACKUP_PROG ${BACKUP_RSYNC_OPTIONS[*]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/"
|
||||
- $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/ >/dev/null \
|
||||
- || Error "Rsync daemon not running on $RSYNC_HOST"
|
||||
+ Log "Test: $BACKUP_PROG ${BACKUP_RSYNC_OPTIONS[*]} $(rsync_remote_base "$BACKUP_URL")"
|
||||
+ $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" $(rsync_remote_base "$BACKUP_URL") >/dev/null \
|
||||
+ || Error "Rsync daemon not running on $host"
|
||||
;;
|
||||
|
||||
(ssh)
|
||||
- Log "Test: ssh ${RSYNC_USER}@${RSYNC_HOST} /bin/true"
|
||||
- ssh ${RSYNC_USER}@${RSYNC_HOST} /bin/true >/dev/null 2>&1 \
|
||||
- || Error "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]"
|
||||
+ Log "Test: ssh $(rsync_remote_ssh "$BACKUP_URL") /bin/true"
|
||||
+ ssh $(rsync_remote_ssh "$BACKUP_URL") /bin/true >/dev/null 2>&1 \
|
||||
+ || Error "Secure shell connection not setup properly [$(rsync_remote_ssh "$BACKUP_URL")]"
|
||||
;;
|
||||
|
||||
esac
|
||||
diff --git a/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh b/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh
|
||||
index e9103531..becf35a0 100644
|
||||
--- a/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh
|
||||
+++ b/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh
|
||||
@@ -3,15 +3,18 @@
|
||||
# Public License. Refer to the included COPYING for full text of license.
|
||||
# try to grab the rsync protocol version of rsync on the remote server
|
||||
|
||||
-local remote_mountpoint
|
||||
+local remote_mountpoint host path proto
|
||||
+host="$(rsync_host "$BACKUP_URL")"
|
||||
+path="$(rsync_path "$BACKUP_URL")"
|
||||
+proto="$(rsync_proto "$BACKUP_URL")"
|
||||
|
||||
if [ -z "$RSYNC_PROTOCOL_VERSION" ]; then
|
||||
|
||||
- case $RSYNC_PROTO in
|
||||
+ case $proto in
|
||||
|
||||
(ssh)
|
||||
- ssh ${RSYNC_USER}@${RSYNC_HOST} rsync --version >"$TMP_DIR/rsync_protocol" 2>&1 \
|
||||
- || Error "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]"
|
||||
+ ssh $(rsync_remote_ssh "$BACKUP_URL") rsync --version >"$TMP_DIR/rsync_protocol" 2>&1 \
|
||||
+ || Error "Secure shell connection not setup properly [$(rsync_remote_ssh "$BACKUP_URL")]"
|
||||
if grep -q "protocol version" "$TMP_DIR/rsync_protocol" ; then
|
||||
RSYNC_PROTOCOL_VERSION=$(grep 'protocol version' "$TMP_DIR/rsync_protocol" | awk '{print $6}')
|
||||
else
|
||||
@@ -24,29 +27,29 @@ if [ -z "$RSYNC_PROTOCOL_VERSION" ]; then
|
||||
RSYNC_PROTOCOL_VERSION=29 # being conservative (old rsync)
|
||||
;;
|
||||
esac
|
||||
- Log "Remote rsync system ($RSYNC_HOST) uses rsync protocol version $RSYNC_PROTOCOL_VERSION"
|
||||
+ Log "Remote rsync system ($host) uses rsync protocol version $RSYNC_PROTOCOL_VERSION"
|
||||
|
||||
else
|
||||
|
||||
- Log "Remote rsync system ($RSYNC_HOST) uses rsync protocol version $RSYNC_PROTOCOL_VERSION (overruled by user)"
|
||||
+ Log "Remote rsync system ($host) uses rsync protocol version $RSYNC_PROTOCOL_VERSION (overruled by user)"
|
||||
|
||||
fi
|
||||
|
||||
-if [ "${RSYNC_USER}" != "root" -a $RSYNC_PROTO = "ssh" ]; then
|
||||
+if [ "$(rsync_user "$BACKUP_URL")" != "root" -a $proto = "ssh" ]; then
|
||||
if [ $RSYNC_PROTOCOL_VERSION -gt 29 ]; then
|
||||
if grep -q "no xattrs" "$TMP_DIR/rsync_protocol"; then
|
||||
# no xattrs available in remote rsync, so --fake-super is not possible
|
||||
- Error "rsync --fake-super not possible on system ($RSYNC_HOST) (no xattrs compiled in rsync)"
|
||||
+ Error "rsync --fake-super not possible on system ($host) (no xattrs compiled in rsync)"
|
||||
else
|
||||
# when using --fake-super we must have user_xattr mount options on the remote mntpt
|
||||
- remote_mountpoint=$(ssh ${RSYNC_USER}@${RSYNC_HOST} 'cd ${RSYNC_PATH}; df -P .' 2>/dev/null | tail -1 | awk '{print $6}')
|
||||
- ssh ${RSYNC_USER}@${RSYNC_HOST} "cd ${RSYNC_PATH} && touch .is_xattr_supported && setfattr -n user.comment -v 'File created by ReaR to test if this filesystems supports extended attributes.' .is_xattr_supported && getfattr -n user.comment .is_xattr_supported 1>/dev/null; find .is_xattr_supported -empty -delete" \
|
||||
+ remote_mountpoint=$(ssh $(rsync_remote_ssh "$BACKUP_URL") 'cd ${path}; df -P .' 2>/dev/null | tail -1 | awk '{print $6}')
|
||||
+ ssh $(rsync_remote_ssh "$BACKUP_URL") "cd ${path} && touch .is_xattr_supported && setfattr -n user.comment -v 'File created by ReaR to test if this filesystems supports extended attributes.' .is_xattr_supported && getfattr -n user.comment .is_xattr_supported 1>/dev/null; find .is_xattr_supported -empty -delete" \
|
||||
|| Error "Remote file system $remote_mountpoint does not have user_xattr mount option set!"
|
||||
#BACKUP_RSYNC_OPTIONS+=( --xattrs --rsync-path="rsync --fake-super" )
|
||||
# see issue #366 for explanation of removing --xattrs
|
||||
BACKUP_RSYNC_OPTIONS+=( --rsync-path="rsync --fake-super" )
|
||||
fi
|
||||
else
|
||||
- Error "rsync --fake-super not possible on system ($RSYNC_HOST) (please upgrade rsync to 3.x)"
|
||||
+ Error "rsync --fake-super not possible on system ($host) (please upgrade rsync to 3.x)"
|
||||
fi
|
||||
fi
|
||||
diff --git a/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh b/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh
|
||||
index 993088be..0fa08587 100644
|
||||
--- a/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh
|
||||
+++ b/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh
|
||||
@@ -7,7 +7,11 @@ get_size() {
|
||||
local backup_prog_rc
|
||||
local restore_log_message
|
||||
|
||||
-LogPrint "Restoring $BACKUP_PROG backup from '${RSYNC_HOST}:${RSYNC_PATH}'"
|
||||
+local host path
|
||||
+host="$(rsync_host "$BACKUP_URL")"
|
||||
+path="$(rsync_path "$BACKUP_URL")"
|
||||
+
|
||||
+LogPrint "Restoring $BACKUP_PROG backup from '${host}:${path}'"
|
||||
|
||||
ProgressStart "Restore operation"
|
||||
(
|
||||
@@ -15,18 +19,18 @@ ProgressStart "Restore operation"
|
||||
|
||||
(rsync)
|
||||
|
||||
- case $RSYNC_PROTO in
|
||||
+ case $(rsync_proto "$BACKUP_URL") in
|
||||
|
||||
(ssh)
|
||||
- Log $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/backup"/ $TARGET_FS_ROOT/
|
||||
+ Log $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" "$(rsync_remote_full "$BACKUP_URL")/backup"/ $TARGET_FS_ROOT/
|
||||
$BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" \
|
||||
- "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/backup"/ \
|
||||
+ "$(rsync_remote_full "$BACKUP_URL")/backup"/ \
|
||||
$TARGET_FS_ROOT/
|
||||
;;
|
||||
|
||||
(rsync)
|
||||
$BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" \
|
||||
- "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup"/ $TARGET_FS_ROOT/
|
||||
+ "$(rsync_remote_full "$BACKUP_URL")/backup"/ $TARGET_FS_ROOT/
|
||||
;;
|
||||
|
||||
esac
|
||||
diff --git a/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh b/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh
|
||||
index b2fb72f5..76132794 100644
|
||||
--- a/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh
|
||||
+++ b/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh
|
||||
@@ -1,14 +1,14 @@
|
||||
# check the backup archive on remote rsync server
|
||||
|
||||
-case $RSYNC_PROTO in
|
||||
+case $(rsync_proto "$BACKUP_URL") in
|
||||
|
||||
(ssh)
|
||||
- ssh ${RSYNC_USER}@${RSYNC_HOST} "ls -ld ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1 \
|
||||
- || Error "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]"
|
||||
+ ssh $(rsync_remote_ssh "$BACKUP_URL") "ls -ld $(rsync_path_full "$BACKUP_URL")/backup" >/dev/null 2>&1 \
|
||||
+ || Error "Archive not found on [$(rsync_remote_full "$BACKUP_URL")]"
|
||||
;;
|
||||
|
||||
(rsync)
|
||||
- $BACKUP_PROG "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1 \
|
||||
- || Error "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]"
|
||||
+ $BACKUP_PROG "$(rsync_remote_full "$BACKUP_URL")/backup" >/dev/null 2>&1 \
|
||||
+ || Error "Archive not found on [$(rsync_remote_full "$BACKUP_URL")]"
|
||||
;;
|
||||
esac
|
Loading…
Reference in new issue