Compare commits
No commits in common. 'c9' and 'c9-beta' have entirely different histories.
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,74 @@
|
|||||||
|
diff --git a/usr/share/rear/build/default/990_verify_rootfs.sh b/usr/share/rear/build/default/990_verify_rootfs.sh
|
||||||
|
index 76a4f1f4b..1b76d8019 100644
|
||||||
|
--- a/usr/share/rear/build/default/990_verify_rootfs.sh
|
||||||
|
+++ b/usr/share/rear/build/default/990_verify_rootfs.sh
|
||||||
|
@@ -69,6 +69,11 @@ fi
|
||||||
|
Log "Testing each binary (except links) with ldd and look for 'not found' libraries within the recovery system"
|
||||||
|
local binary=""
|
||||||
|
local broken_binaries=""
|
||||||
|
+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:
|
||||||
|
@@ -151,7 +156,6 @@ test $old_LD_LIBRARY_PATH && export LD_LIBRARY_PATH=$old_LD_LIBRARY_PATH || unse
|
||||||
|
# Report binaries with 'not found' shared object dependencies:
|
||||||
|
local fatal_missing_library=""
|
||||||
|
if contains_visible_char "$broken_binaries" ; then
|
||||||
|
- LogPrintError "There are binaries or libraries in the ReaR recovery system that need additional libraries"
|
||||||
|
local ldd_output=""
|
||||||
|
for binary in $broken_binaries ; do
|
||||||
|
# Only for programs (i.e. files in a .../bin/... or .../sbin/... directory) treat a missing library as fatal
|
||||||
|
@@ -161,26 +165,43 @@ if contains_visible_char "$broken_binaries" ; then
|
||||||
|
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 where 'ldd' shows 'not found' (specified as non-fatal)"
|
||||||
|
else
|
||||||
|
- LogPrintError "$binary requires additional libraries (fatal error)"
|
||||||
|
+ LogPrint "$binary requires libraries where 'ldd' shows 'not found' (fatal error)"
|
||||||
|
fatal_missing_library="yes"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
- LogPrintError "$binary requires additional libraries (fatal error)"
|
||||||
|
+ LogPrint "$binary requires libraries where 'ldd' shows 'not found' (fatal by default)"
|
||||||
|
fatal_missing_library="yes"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
- LogPrintError "$binary requires additional libraries"
|
||||||
|
+ LogPrint "$binary requires libraries where 'ldd' shows 'not found'"
|
||||||
|
fi
|
||||||
|
# Run the same ldd call as above but now keep its whole output:
|
||||||
|
ldd_output="$( chroot $ROOTFS_DIR /bin/ldd $binary )"
|
||||||
|
# Have the whole ldd output only in the log:
|
||||||
|
Log "$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:
|
||||||
|
- PrintError "$( grep 'not found' <<<"$ldd_output" )"
|
||||||
|
+ LogPrintError "$binary requires $not_found_library which could not be found in the ReaR recovery system"
|
||||||
|
+ fi
|
||||||
|
+ done <<<"$not_found_output"
|
||||||
|
done
|
||||||
|
- 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
|
||||||
|
fi
|
||||||
|
|
@ -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
|
@ -0,0 +1,84 @@
|
|||||||
|
diff --git a/usr/share/rear/format/USB/default/300_format_usb_disk.sh b/usr/share/rear/format/USB/default/300_format_usb_disk.sh
|
||||||
|
index 0e0a2e080..fa6496b23 100644
|
||||||
|
--- a/usr/share/rear/format/USB/default/300_format_usb_disk.sh
|
||||||
|
+++ b/usr/share/rear/format/USB/default/300_format_usb_disk.sh
|
||||||
|
@@ -94,7 +94,13 @@ sleep 5
|
||||||
|
|
||||||
|
if is_true "$EFI" ; then
|
||||||
|
LogPrint "Creating vfat filesystem on EFI system partition on '${RAW_USB_DEVICE}1'"
|
||||||
|
- if ! mkfs.vfat $v -F 16 -n REAR-EFI ${RAW_USB_DEVICE}1 >&2 ; then
|
||||||
|
+ # Make a FAT filesystem on the EFI system partition
|
||||||
|
+ # cf. https://github.com/rear/rear/issues/2575
|
||||||
|
+ # and output/ISO/Linux-i386/700_create_efibootimg.sh
|
||||||
|
+ # and output/RAWDISK/Linux-i386/280_create_bootable_disk_image.sh
|
||||||
|
+ # Let mkfs.vfat automatically select the FAT type based on the size.
|
||||||
|
+ # I.e. do not use a '-F 16' or '-F 32' option and hope for the best:
|
||||||
|
+ if ! mkfs.vfat $v -n REAR-EFI ${RAW_USB_DEVICE}1 >&2 ; then
|
||||||
|
Error "Failed to create vfat filesystem on '${RAW_USB_DEVICE}1'"
|
||||||
|
fi
|
||||||
|
# create link for EFI partition in /dev/disk/by-label
|
||||||
|
diff --git a/usr/share/rear/output/ISO/Linux-i386/700_create_efibootimg.sh b/usr/share/rear/output/ISO/Linux-i386/700_create_efibootimg.sh
|
||||||
|
index 0eb5350f8..39bbebad8 100644
|
||||||
|
--- a/usr/share/rear/output/ISO/Linux-i386/700_create_efibootimg.sh
|
||||||
|
+++ b/usr/share/rear/output/ISO/Linux-i386/700_create_efibootimg.sh
|
||||||
|
@@ -13,13 +13,33 @@ StopIfError "Failed to determine disk usage of EFI virtual image content directo
|
||||||
|
|
||||||
|
# prepare EFI virtual image aligned to 32MiB blocks:
|
||||||
|
dd if=/dev/zero of=$TMP_DIR/efiboot.img count=$efi_img_sz bs=32M
|
||||||
|
-mkfs.vfat $v -F 16 $TMP_DIR/efiboot.img >&2
|
||||||
|
-mkdir -p $v $TMP_DIR/efi_virt >&2
|
||||||
|
-mount $v -o loop -t vfat -o fat=16 $TMP_DIR/efiboot.img $TMP_DIR/efi_virt >&2
|
||||||
|
|
||||||
|
-# copy files from staging directory
|
||||||
|
+# Make a FAT filesystem on the efiboot.img file and loop mount it
|
||||||
|
+# cf. https://github.com/rear/rear/issues/2575
|
||||||
|
+# See output/RAWDISK/Linux-i386/280_create_bootable_disk_image.sh
|
||||||
|
+# Having a small EFI System Partition (ESP) might introduce problems:
|
||||||
|
+# - The UEFI spec seems to require a FAT32 EFI System Partition (ESP).
|
||||||
|
+# - syslinux/Legacy BIOS fails to install on small FAT32 partitions with "syslinux: zero FAT sectors (FAT12/16)".
|
||||||
|
+# - Some firmwares fail to boot from small FAT32 partitions.
|
||||||
|
+# - Some firmwares fail to boot from FAT16 partitions.
|
||||||
|
+# See:
|
||||||
|
+# - http://www.rodsbooks.com/efi-bootloaders/principles.html
|
||||||
|
+# - http://lists.openembedded.org/pipermail/openembedded-core/2012-January/055999.html
|
||||||
|
+# Let mkfs.vfat automatically select the FAT type based on the size.
|
||||||
|
+# See what "man mkfs.vfat" reads for the '-F' option:
|
||||||
|
+# "If nothing is specified, mkfs.fat will automatically select
|
||||||
|
+# between 12, 16 and 32 bit, whatever fits better for the filesystem size"
|
||||||
|
+# I.e. do not use a '-F 16' or '-F 32' option and hope for the best:
|
||||||
|
+mkfs.vfat $v $TMP_DIR/efiboot.img
|
||||||
|
+mkdir -p $v $TMP_DIR/efi_virt
|
||||||
|
+# Do not specify '-o fat=16' or '-o fat=32' when loop mounting the efiboot.img FAT file
|
||||||
|
+# but rely on the automatic FAT type detection (see what "man 8 mount" reads for 'fat=...'):
|
||||||
|
+mount $v -o loop -t vfat $TMP_DIR/efiboot.img $TMP_DIR/efi_virt || Error "Failed to loop mount efiboot.img"
|
||||||
|
+
|
||||||
|
+# Copy files from staging directory into efiboot.img
|
||||||
|
cp $v -r $TMP_DIR/mnt/. $TMP_DIR/efi_virt
|
||||||
|
|
||||||
|
-umount $v $TMP_DIR/efiboot.img >&2
|
||||||
|
-mv $v -f $TMP_DIR/efiboot.img $TMP_DIR/isofs/boot/efiboot.img >&2
|
||||||
|
-StopIfError "Could not move efiboot.img file"
|
||||||
|
+umount $v $TMP_DIR/efiboot.img
|
||||||
|
+
|
||||||
|
+# Move efiboot.img into ISO directory:
|
||||||
|
+mv $v -f $TMP_DIR/efiboot.img $TMP_DIR/isofs/boot/efiboot.img || Error "Failed to move efiboot.img to isofs/boot/efiboot.img"
|
||||||
|
diff --git a/usr/share/rear/output/ISO/Linux-ia64/200_mount_bootimg.sh b/usr/share/rear/output/ISO/Linux-ia64/200_mount_bootimg.sh
|
||||||
|
index b5f603ec5..716d7d383 100644
|
||||||
|
--- a/usr/share/rear/output/ISO/Linux-ia64/200_mount_bootimg.sh
|
||||||
|
+++ b/usr/share/rear/output/ISO/Linux-ia64/200_mount_bootimg.sh
|
||||||
|
@@ -1,6 +1,11 @@
|
||||||
|
# 200_mount_bootimg.sh
|
||||||
|
dd if=/dev/zero of=$TMP_DIR/boot.img count=64000 bs=1024
|
||||||
|
-# make sure we select FAT16 instead of FAT12 as size >30MB
|
||||||
|
-mkfs.vfat $v -F 16 $TMP_DIR/boot.img >&2
|
||||||
|
-mkdir -p $v $TMP_DIR/mnt >&2
|
||||||
|
-mount $v -o loop -t vfat -o fat=16 $TMP_DIR/boot.img $TMP_DIR/mnt >&2
|
||||||
|
+# Make a FAT filesystem on the boot.img file and loop mount it
|
||||||
|
+# cf. https://github.com/rear/rear/issues/2575
|
||||||
|
+# and output/ISO/Linux-i386/700_create_efibootimg.sh
|
||||||
|
+# and output/RAWDISK/Linux-i386/280_create_bootable_disk_image.sh
|
||||||
|
+# Let mkfs.vfat automatically select the FAT type based on the size.
|
||||||
|
+# I.e. do not use a '-F 16' or '-F 32' option and hope for the best:
|
||||||
|
+mkfs.vfat $v $TMP_DIR/boot.img
|
||||||
|
+mkdir -p $v $TMP_DIR/mnt
|
||||||
|
+mount $v -o loop -t vfat $TMP_DIR/boot.img $TMP_DIR/mnt || Error "Failed to loop mount boot.img"
|
@ -0,0 +1,21 @@
|
|||||||
|
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 0e402b017..9e1810c9a 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
|
||||||
|
@@ -117,10 +117,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
|
@ -0,0 +1,60 @@
|
|||||||
|
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 da6ce64c4..ab14ec83f 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
|
||||||
|
@@ -395,6 +395,10 @@ Log "Saving disk 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/})
|
||||||
|
+ 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 " ")
|
||||||
|
if [ "$disktype" != "dasd" ]; then
|
||||||
|
echo "# Disk $devname"
|
||||||
|
diff --git a/usr/share/rear/lib/layout-functions.sh b/usr/share/rear/lib/layout-functions.sh
|
||||||
|
index f5fc7538e..90b16cb20 100644
|
||||||
|
--- a/usr/share/rear/lib/layout-functions.sh
|
||||||
|
+++ b/usr/share/rear/lib/layout-functions.sh
|
||||||
|
@@ -834,6 +834,40 @@ 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
|
||||||
|
+# (without the device name) 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
|
||||||
|
+ else
|
||||||
|
+ return 1
|
||||||
|
+ fi
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
function is_multipath_path {
|
||||||
|
# Return 'false' if there is no device as argument:
|
||||||
|
test "$1" || return 1
|
@ -0,0 +1,63 @@
|
|||||||
|
diff --git a/usr/sbin/rear b/usr/sbin/rear
|
||||||
|
index d2cb6c070..ea66f0a98 100755
|
||||||
|
--- a/usr/sbin/rear
|
||||||
|
+++ b/usr/sbin/rear
|
||||||
|
@@ -376,6 +376,10 @@ fi
|
||||||
|
# and fd6 to get input from the user regardless where to STDIN is redirected:
|
||||||
|
source $SHARE_DIR/lib/_input-output-functions.sh
|
||||||
|
|
||||||
|
+# Used to determine whether TMPDIR has been changed in user config.
|
||||||
|
+# Save the current value to detect changes.
|
||||||
|
+saved_tmpdir="${TMPDIR-}"
|
||||||
|
+
|
||||||
|
# Keep old log file:
|
||||||
|
test -r "$RUNTIME_LOGFILE" && mv -f "$RUNTIME_LOGFILE" "$RUNTIME_LOGFILE".old 2>/dev/null
|
||||||
|
|
||||||
|
@@ -446,6 +450,14 @@ for config in site local rescue ; do
|
||||||
|
test "$( tr -d -c '\r' < $CONFIG_DIR/$config.conf )" && Error "Carriage return character in $CONFIG_DIR/$config.conf (perhaps DOS or Mac format)"
|
||||||
|
Source "$CONFIG_DIR/$config.conf" || true
|
||||||
|
fi
|
||||||
|
+ if [ "$config" == local ] ; then
|
||||||
|
+ # changing TMPDIR in rescue.conf is expected for now, see
|
||||||
|
+ # rescue/GNU/Linux/600_unset_TMPDIR_in_rescue_conf.sh,
|
||||||
|
+ # so perform the check after reading local.conf but before rescue.conf
|
||||||
|
+ if [ "$saved_tmpdir" != "${TMPDIR-}" ] ; then
|
||||||
|
+ LogPrintError "Warning: Setting TMPDIR in a configuration file is deprecated. To specify a working area directory prefix, export TMPDIR before executing '$PROGRAM'"
|
||||||
|
+ fi
|
||||||
|
+ fi
|
||||||
|
done
|
||||||
|
# Finally source additional configuration files if specified on the command line:
|
||||||
|
if test "$CONFIG_APPEND_FILES" ; then
|
||||||
|
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
|
||||||
|
index d5fe6dcc4..4e67e38c9 100644
|
||||||
|
--- a/usr/share/rear/conf/default.conf
|
||||||
|
+++ b/usr/share/rear/conf/default.conf
|
||||||
|
@@ -50,12 +50,9 @@
|
||||||
|
# which usually results /tmp/rear.XXXXXXXXXXXXXXX or $TMPDIR/rear.XXXXXXXXXXXXXXX
|
||||||
|
# the latter when the canonical Linux/Unix environment variable TMPDIR
|
||||||
|
# is set in the environment where /usr/sbin/rear is called.
|
||||||
|
-# To have a specific working area directory prefix for Relax-and-Recover
|
||||||
|
-# specify in /etc/rear/local.conf something like
|
||||||
|
-#
|
||||||
|
+# To have a specific working area directory prefix for Relax-and-Recover call
|
||||||
|
# export TMPDIR="/prefix/for/rear/working/directory"
|
||||||
|
-#
|
||||||
|
-# where /prefix/for/rear/working/directory must already exist.
|
||||||
|
+# before calling 'rear' (/prefix/for/rear/working/directory must already exist).
|
||||||
|
# This is useful for example when there is not sufficient free space
|
||||||
|
# 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
|
||||||
|
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
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000..84d0cabb2
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/usr/share/rear/rescue/GNU/Linux/600_unset_TMPDIR_in_rescue_conf.sh
|
||||||
|
@@ -0,0 +1,8 @@
|
||||||
|
+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
|
Loading…
Reference in new issue