import rear-2.4-12.el8

This commit is contained in:
CentOS Sources 2020-01-21 17:20:10 -05:00 committed by Andrew Lukoshko
commit 1fb3af268f
23 changed files with 3274 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
SOURCES/rear-2.4.tar.gz

1
.rear.metadata Normal file
View File

@ -0,0 +1 @@
9f6037ea582635ed78f1dffaa8a7cc5cdc7db37a SOURCES/rear-2.4.tar.gz

View File

@ -0,0 +1,15 @@
diff --git a/usr/share/rear/output/ISO/Linux-i386/249_check_rhel_grub2_efi_package.sh b/usr/share/rear/output/ISO/Linux-i386/249_check_rhel_grub2_efi_package.sh
new file mode 100644
index 00000000..4c4ded08
--- /dev/null
+++ b/usr/share/rear/output/ISO/Linux-i386/249_check_rhel_grub2_efi_package.sh
@@ -0,0 +1,9 @@
+# 249_check_rhel_grub2_efi_package.sh
+
+is_true $USING_UEFI_BOOTLOADER || return # empty or 0 means NO UEFI
+
+(
+ VERBOSE=1
+ test -r /usr/lib/grub/x86_64-efi/moddep.lst
+ PrintIfError "WARNING: /usr/lib/grub/x86_64-efi/moddep.lst not found, grub2-mkimage will likely fail. Please install the grub2-efi-x64-modules package to fix this."
+)

View File

@ -0,0 +1,275 @@
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 47266910..7170cda6 100644
--- a/usr/share/rear/backup/NETFS/default/500_make_backup.sh
+++ b/usr/share/rear/backup/NETFS/default/500_make_backup.sh
@@ -67,49 +67,99 @@ else
SPLIT_COMMAND="dd of=$backuparchive"
fi
+# Used by "tar" method to record which pipe command failed
+FAILING_BACKUP_PROG_FILE="$TMP_DIR/failing_backup_prog"
+FAILING_BACKUP_PROG_RC_FILE="$TMP_DIR/failing_backup_prog_rc"
+
LogPrint "Creating $BACKUP_PROG archive '$backuparchive'"
ProgressStart "Preparing archive operation"
(
case "$(basename ${BACKUP_PROG})" in
- # tar compatible programs here
- (tar)
- set_tar_features
- Log $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_CRYPT_OPTIONS BACKUP_PROG_CRYPT_KEY \| $SPLIT_COMMAND
- $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_CRYPT_OPTIONS $BACKUP_PROG_CRYPT_KEY | $SPLIT_COMMAND
- ;;
- (rsync)
- # make sure that the target is a directory
- 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"
- $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
- ;;
- (*)
- 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
- $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
- ;;
+ # tar compatible programs here
+ (tar)
+ set_tar_features
+ Log $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_CRYPT_OPTIONS BACKUP_PROG_CRYPT_KEY \| $SPLIT_COMMAND
+
+ # Variable used to record the short name of piped commands in case of
+ # error, e.g. ( "tar" "cat" "dd" ) in case of unencrypted and unsplit backup.
+ backup_prog_shortnames=(
+ "$(basename $(echo "$BACKUP_PROG" | awk '{ print $1 }'))"
+ "$(basename $(echo "$BACKUP_PROG_CRYPT_OPTIONS" | awk '{ print $1 }'))"
+ "$(basename $(echo "$SPLIT_COMMAND" | awk '{ print $1 }'))"
+ )
+ for index in ${!backup_prog_shortnames[@]} ; do
+ [ -n "${backup_prog_shortnames[$index]}" ] || BugError "No computed shortname for pipe component $index"
+ done
+
+ $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_CRYPT_OPTIONS $BACKUP_PROG_CRYPT_KEY | \
+ \
+ $SPLIT_COMMAND
+ pipes_rc=( ${PIPESTATUS[@]} )
+
+ # Exit code logic:
+ # - never return rc=1 (this is reserved for "tar" warning about modified files)
+ # - process exit code in pipe's reverse order
+ # - if last command failed (e.g. "dd"), return an error
+ # - otherwise if previous command failed (e.g. "encrypt"), return an error
+ # ...
+ # - otherwise return "tar" exit code
+ #
+ # When an error occurs, record the program name in $FAILING_BACKUP_PROG_FILE
+ # and real exit code in $FAILING_BACKUP_PROG_RC_FILE.
+
+ let index=${#pipes_rc[@]}-1
+ while [ $index -ge 0 ] ; do
+ rc=${pipes_rc[$index]}
+ if [ $rc -ne 0 ] ; then
+ echo "${backup_prog_shortnames[$index]}" > $FAILING_BACKUP_PROG_FILE
+ echo "$rc" > $FAILING_BACKUP_PROG_RC_FILE
+ if [ $rc -eq 1 ] && [ "${backup_prog_shortnames[$index]}" != "tar" ] ; then
+ rc=2
+ fi
+ exit $rc
+ fi
+ # This pipe command succeeded, check the previous one
+ let index--
+ done
+ # This was a success
+ exit 0
+ ;;
+ (rsync)
+ # make sure that the target is a directory
+ 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"
+ $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
+ ;;
+ (*)
+ 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
+ $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
+ ;;
esac 2> "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log"
# important trick: the backup prog is the last in each case entry and the case .. esac is the last command
# in the (..) subshell. As a result the return code of the subshell is the return code of the backup prog!
@@ -121,44 +171,44 @@ sleep 1 # Give the backup software a good chance to start working
# return disk usage in bytes
function get_disk_used() {
- let "$(stat -f -c 'used=(%b-%f)*%S' $1)"
- echo $used
+ let "$(stat -f -c 'used=(%b-%f)*%S' $1)"
+ echo $used
}
# While the backup runs in a sub-process, display some progress information to the user.
# ProgressInfo texts have a space at the end to get the 'OK' from ProgressStop shown separated.
test "$PROGRESS_WAIT_SECONDS" || PROGRESS_WAIT_SECONDS=1
case "$( basename $BACKUP_PROG )" in
- (tar)
- while sleep $PROGRESS_WAIT_SECONDS ; kill -0 $BackupPID 2>/dev/null; do
- #blocks="$(stat -c %b ${backuparchive})"
- #size="$((blocks*512))"
- size="$(stat -c %s ${backuparchive}* | awk '{s+=$1} END {print s}')"
- ProgressInfo "Archived $((size/1024/1024)) MiB [avg $((size/1024/(SECONDS-starttime))) KiB/sec] "
- done
- ;;
- (rsync)
- # since we do not want to do a $(du -s) run every second we count disk usage instead
- # this obviously leads to wrong results in case something else is writing to the same
- # disk at the same time as is very likely with a networked file system. For local disks
- # this should be good enough and in any case this is only some eye candy.
- # TODO: Find a fast way to count the actual transfer data, preferrable getting the info from rsync.
- let old_disk_used="$(get_disk_used "$backuparchive")"
- while sleep $PROGRESS_WAIT_SECONDS ; kill -0 $BackupPID 2>/dev/null; do
- let disk_used="$(get_disk_used "$backuparchive")" size=disk_used-old_disk_used
- ProgressInfo "Archived $((size/1024/1024)) MiB [avg $((size/1024/(SECONDS-starttime))) KiB/sec] "
- done
- ;;
- (*)
- while sleep $PROGRESS_WAIT_SECONDS ; kill -0 $BackupPID 2>/dev/null; do
- size="$(stat -c "%s" "$backuparchive")" || {
- kill -9 $BackupPID
- ProgressError
- Error "$(basename $BACKUP_PROG) failed to create the archive file"
- }
- ProgressInfo "Archived $((size/1024/1024)) MiB [avg $((size/1024/(SECONDS-starttime))) KiB/sec] "
- done
- ;;
+ (tar)
+ while sleep $PROGRESS_WAIT_SECONDS ; kill -0 $BackupPID 2>/dev/null; do
+ #blocks="$(stat -c %b ${backuparchive})"
+ #size="$((blocks*512))"
+ size="$(stat -c %s ${backuparchive}* | awk '{s+=$1} END {print s}')"
+ ProgressInfo "Archived $((size/1024/1024)) MiB [avg $((size/1024/(SECONDS-starttime))) KiB/sec] "
+ done
+ ;;
+ (rsync)
+ # since we do not want to do a $(du -s) run every second we count disk usage instead
+ # this obviously leads to wrong results in case something else is writing to the same
+ # disk at the same time as is very likely with a networked file system. For local disks
+ # this should be good enough and in any case this is only some eye candy.
+ # TODO: Find a fast way to count the actual transfer data, preferrable getting the info from rsync.
+ let old_disk_used="$(get_disk_used "$backuparchive")"
+ while sleep $PROGRESS_WAIT_SECONDS ; kill -0 $BackupPID 2>/dev/null; do
+ let disk_used="$(get_disk_used "$backuparchive")" size=disk_used-old_disk_used
+ ProgressInfo "Archived $((size/1024/1024)) MiB [avg $((size/1024/(SECONDS-starttime))) KiB/sec] "
+ done
+ ;;
+ (*)
+ while sleep $PROGRESS_WAIT_SECONDS ; kill -0 $BackupPID 2>/dev/null; do
+ size="$(stat -c "%s" "$backuparchive")" || {
+ kill -9 $BackupPID
+ ProgressError
+ Error "$(basename $BACKUP_PROG) failed to create the archive file"
+ }
+ ProgressInfo "Archived $((size/1024/1024)) MiB [avg $((size/1024/(SECONDS-starttime))) KiB/sec] "
+ done
+ ;;
esac
ProgressStop
transfertime="$((SECONDS-starttime))"
@@ -177,10 +227,12 @@ sleep 1
# everyone should see this warning, even if not verbose
case "$(basename $BACKUP_PROG)" in
(tar)
- if (( $backup_prog_rc == 1 )); then
- LogPrint "WARNING: $(basename $BACKUP_PROG) ended with return code $backup_prog_rc and below output:
+ if (( $backup_prog_rc != 0 )); then
+ prog="$(cat $FAILING_BACKUP_PROG_FILE)"
+ if (( $backup_prog_rc == 1 )); then
+ LogUserOutput "WARNING: $prog ended with return code 1 and below output:
---snip---
-$(grep '^tar: ' $RUNTIME_LOGFILE | sed -e 's/^/ /' | tail -n3)
+$(grep '^tar: ' "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log" | sed -e 's/^/ /' | tail -n3)
----------
This means that files have been modified during the archiving
process. As a result the backup may not be completely consistent
@@ -188,16 +240,19 @@ or may not be a perfect copy of the system. Relax-and-Recover
will continue, however it is highly advisable to verify the
backup in order to be sure to safely recover this system.
"
- elif (( $backup_prog_rc > 1 )); then
- Error "$(basename $BACKUP_PROG) failed with return code $backup_prog_rc and below output:
+ else
+ rc=$(cat $FAILING_BACKUP_PROG_RC_FILE)
+ Error "$prog failed with return code $rc and below output:
---snip---
-$(grep '^tar: ' $RUNTIME_LOGFILE | sed -e 's/^/ /' | tail -n3)
+$(grep "^$prog: " "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log" | sed -e 's/^/ /' | tail -n3)
----------
This means that the archiving process ended prematurely, or did
not even start. As a result it is unlikely you can recover this
system properly. Relax-and-Recover is therefore aborting execution.
"
- fi;;
+ fi
+ fi
+ ;;
(*)
if (( $backup_prog_rc > 0 )) ; then
Error "$(basename $BACKUP_PROG) failed with return code $backup_prog_rc
@@ -212,10 +267,12 @@ esac
tar_message="$(tac $RUNTIME_LOGFILE | grep -m1 '^Total bytes written: ')"
if [ $backup_prog_rc -eq 0 -a "$tar_message" ] ; then
- LogPrint "$tar_message in $transfertime seconds."
+ LogPrint "$tar_message in $transfertime seconds."
elif [ "$size" ]; then
- LogPrint "Archived $((size/1024/1024)) MiB in $((transfertime)) seconds [avg $((size/1024/transfertime)) KiB/sec]"
+ LogPrint "Archived $((size/1024/1024)) MiB in $((transfertime)) seconds [avg $((size/1024/transfertime)) KiB/sec]"
fi
### Copy progress log to backup media
cp $v "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log" "${opath}/${BACKUP_PROG_ARCHIVE}.log" >&2
+
+# vim: set et ts=4 sw=4:

1487
SOURCES/rear-bz1639705.patch Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,156 @@
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 9c4212ae..873e244e 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
@@ -54,9 +54,13 @@ Log "copy_as_is_executables = ${copy_as_is_executables[@]}"
# add them to the LIBS list if they are not yet included in the copied files:
Log "Adding required libraries of executables in all the copied files to LIBS"
local required_library=""
-for required_library in $( RequiredSharedOjects "${copy_as_is_executables[@]}" ) ; do
- # Skip when the required library was already actually copied by 'tar' above:
- grep -q "$required_library" $copy_as_is_filelist_file && continue
+for required_library in $( RequiredSharedObjects "${copy_as_is_executables[@]}" ) ; do
+ # Skip when the required library was already actually copied by 'tar' above.
+ # grep for a full line (copy_as_is_filelist_file contains 1 file name per line)
+ # to avoid that libraries get skipped when their library path is a substring
+ # of another already copied library, e.g. do not skip /path/to/lib when
+ # /other/path/to/lib was already copied, cf. https://github.com/rear/rear/pull/1976
+ grep -q "^${required_library}\$" $copy_as_is_filelist_file && continue
# Skip when the required library is already in LIBS:
IsInArray "$required_library" "${LIBS[@]}" && continue
Log "Adding required library '$required_library' to LIBS"
diff --git a/usr/share/rear/build/GNU/Linux/390_copy_binaries_libraries.sh b/usr/share/rear/build/GNU/Linux/390_copy_binaries_libraries.sh
index f7809bc7..ed02dea9 100644
--- a/usr/share/rear/build/GNU/Linux/390_copy_binaries_libraries.sh
+++ b/usr/share/rear/build/GNU/Linux/390_copy_binaries_libraries.sh
@@ -62,16 +62,16 @@ Log "Binaries being copied: ${all_binaries[@]}"
copy_binaries "$ROOTFS_DIR/bin" "${all_binaries[@]}"
# Copy libraries:
-# It is crucial to also have all LIBS itself in all_libs because RequiredSharedOjects()
+# It is crucial to also have all LIBS itself in all_libs because RequiredSharedObjects()
# outputs only those libraries that are required by a library but not the library itself
# so that without all LIBS itself in all_libs those libraries in LIBS are missing that
# are not needed by a binary in all_binaries (all_binaries were already copied above).
-# RequiredSharedOjects outputs the required shared objects on STDOUT.
+# RequiredSharedObjects outputs the required shared objects on STDOUT.
# The output are absolute paths to the required shared objects.
# The output can also be symbolic links (also as absolute paths).
# In case of symbolic links only the link but not the link target is output.
# Therefore for symbolic links also the link target gets copied below.
-local all_libs=( "${LIBS[@]}" $( RequiredSharedOjects "${all_binaries[@]}" "${LIBS[@]}" ) )
+local all_libs=( "${LIBS[@]}" $( RequiredSharedObjects "${all_binaries[@]}" "${LIBS[@]}" ) )
Log "Libraries being copied: ${all_libs[@]}"
local lib=""
diff --git a/usr/share/rear/build/OPALPBA/Linux-i386/391_list_executable_dependencies.sh b/usr/share/rear/build/OPALPBA/Linux-i386/391_list_executable_dependencies.sh
index 9803200d..8cb27d78 100644
--- a/usr/share/rear/build/OPALPBA/Linux-i386/391_list_executable_dependencies.sh
+++ b/usr/share/rear/build/OPALPBA/Linux-i386/391_list_executable_dependencies.sh
@@ -8,7 +8,7 @@ if is_true $KEEP_BUILD_DIR; then
executable_dependencies_list="$TMP_DIR/executable-dependencies"
for executable in "${executables[@]}"; do
- dependents=( $(RequiredSharedOjects "$ROOTFS_DIR/$executable") )
+ dependents=( $(RequiredSharedObjects "$ROOTFS_DIR/$executable") )
echo "$executable: ${dependents[*]}"
done > "$executable_dependencies_list"
diff --git a/usr/share/rear/build/default/980_verify_rootfs.sh b/usr/share/rear/build/default/980_verify_rootfs.sh
index f8b3e8e9..d03e5f34 100644
--- a/usr/share/rear/build/default/980_verify_rootfs.sh
+++ b/usr/share/rear/build/default/980_verify_rootfs.sh
@@ -51,6 +51,11 @@ if test "$BACKUP" = "SESAM" ; then
# related libraries
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SESAM_LD_LIBRARY_PATH
fi
+if test "$BACKUP" = "NBU" ; then
+ # Use a NBU-specific LD_LIBRARY_PATH to find NBU libraries
+ # see https://github.com/rear/rear/issues/1974
+ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NBU_LD_LIBRARY_PATH
+fi
# Actually test all binaries for 'not found' libraries.
# Find all binaries and libraries also e.g. those that are copied via COPY_AS_IS into other paths:
for binary in $( find $ROOTFS_DIR -type f -executable -printf '/%P\n' ); do
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
index 0f0d0675..796f228a 100644
--- a/usr/share/rear/conf/default.conf
+++ b/usr/share/rear/conf/default.conf
@@ -1467,7 +1467,8 @@ OBDR_BLOCKSIZE=2048
##
#
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_EXCLUDE_NBU=( "/usr/openv/netbackup/logs/*" "/usr/openv/netbackup/bin/bpjava*" "/usr/openv/netbackup/bin/xbp" )
+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 )
+NBU_LD_LIBRARY_PATH="/usr/openv/lib"
PROGS_NBU=( )
##
diff --git a/usr/share/rear/lib/_input-output-functions.sh b/usr/share/rear/lib/_input-output-functions.sh
index d5eed43e..bdbf593d 100644
--- a/usr/share/rear/lib/_input-output-functions.sh
+++ b/usr/share/rear/lib/_input-output-functions.sh
@@ -324,10 +324,11 @@ function LogToSyslog () {
# see https://github.com/rear/rear/issues/729
function has_binary () {
for bin in $@ ; do
- # Suppress success output via stdout (but keep failure output via stderr):
- if type $bin 1>/dev/null ; then
- return 0
- fi
+ # Suppress success output via stdout which is crucial when has_binary is called
+ # in other functions that provide their intended function results via stdout
+ # to not pollute intended function results with intermixed has_binary stdout
+ # (e.g. the RequiredSharedObjects function) but keep failure output via stderr:
+ type $bin 1>/dev/null && return 0
done
return 1
}
diff --git a/usr/share/rear/lib/linux-functions.sh b/usr/share/rear/lib/linux-functions.sh
index 6a767367..3fb44e6d 100644
--- a/usr/share/rear/lib/linux-functions.sh
+++ b/usr/share/rear/lib/linux-functions.sh
@@ -100,13 +100,13 @@ function FindStorageDrivers () {
# Determine all required shared objects (shared/dynamic libraries)
# for programs and/or shared objects (binaries) specified in $@.
-# RequiredSharedOjects outputs the required shared objects on STDOUT.
+# RequiredSharedObjects outputs the required shared objects on STDOUT.
# The output are absolute paths to the required shared objects.
# The output can also be symbolic links (also as absolute paths).
# In case of symbolic links only the link but not the link target is output.
-function RequiredSharedOjects () {
- has_binary ldd || Error "Cannot run RequiredSharedOjects() because there is no ldd binary"
- Log "RequiredSharedOjects: Determining required shared objects"
+function RequiredSharedObjects () {
+ has_binary ldd || Error "Cannot run RequiredSharedObjects() because there is no ldd binary"
+ Log "RequiredSharedObjects: Determining required shared objects"
# It uses 'ldd' to determine all required shared objects because 'ldd' outputs
# also transitively required shared objects i.e. libraries needed by libraries,
# e.g. for /usr/sbin/parted also the libraries needed by the libparted library:
@@ -164,10 +164,11 @@ function RequiredSharedOjects () {
# 2. Line: " lib (mem-addr)" -> virtual library
# 3. Line: " lib => not found" -> print error to stderr
# 4. Line: " lib => /path/to/lib (mem-addr)" -> print $3 '/path/to/lib'
- # 5. Line: " /path/to/lib (mem-addr)" -> print $1 '/path/to/lib'
+ # 5. Line: " /path/to/lib => /path/to/lib2 (mem-addr)" -> print $3 '/path/to/lib2'
+ # 6. Line: " /path/to/lib (mem-addr)" -> print $1 '/path/to/lib'
ldd "$@" | awk ' /^\t.+ => not found/ { print "Shared object " $1 " not found" > "/dev/stderr" }
/^\t.+ => \// { print $3 }
- /^\t\// { print $1 } ' | sort -u
+ /^\t\// && !/ => / { print $1 } ' | sort -u
}
# Provide a shell, with custom exit-prompt and history
diff --git a/usr/share/rear/prep/NBU/default/450_check_nbu_client_configured.sh b/usr/share/rear/prep/NBU/default/450_check_nbu_client_configured.sh
index e01dcdbd..3cc29777 100644
--- a/usr/share/rear/prep/NBU/default/450_check_nbu_client_configured.sh
+++ b/usr/share/rear/prep/NBU/default/450_check_nbu_client_configured.sh
@@ -5,5 +5,6 @@
Log "Running: /usr/openv/netbackup/bin/bplist command"
LANG=C /usr/openv/netbackup/bin/bplist -l -s `date -d "-5 days" \
"+%m/%d/%Y"` / >/dev/null
-[ $? -gt 0 ] && LogPrint "WARNING: Netbackup bplist check failed with error code $?.
+rc=$?
+[ $rc -gt 0 ] && LogPrint "WARNING: Netbackup bplist check failed with error code ${rc}.
See $RUNTIME_LOGFILE for more details."

View File

@ -0,0 +1,17 @@
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 4698618c..6b3194bd 100644
--- a/usr/share/rear/rescue/GNU/Linux/310_network_devices.sh
+++ b/usr/share/rear/rescue/GNU/Linux/310_network_devices.sh
@@ -854,7 +854,11 @@ function handle_physdev () {
DebugPrint "$network_interface is a physical device"
- mac="$( cat $sysfspath/address )" || BugError "Could not read a MAC address for '$network_interface'."
+ if [ -e $sysfspath/bonding_slave/perm_hwaddr ] ; then
+ mac="$( cat $sysfspath/bonding_slave/perm_hwaddr )"
+ else
+ mac="$( cat $sysfspath/address )" || BugError "Could not read a MAC address for '$network_interface'."
+ fi
# Skip fake interfaces without MAC address
[ "$mac" != "00:00:00:00:00:00" ] || return $rc_error

View File

@ -0,0 +1,35 @@
diff --git a/usr/sbin/rear b/usr/sbin/rear
index a51f820c..e21156bf 100755
--- a/usr/sbin/rear
+++ b/usr/sbin/rear
@@ -527,6 +527,10 @@ Build date: $( date -R )
if test "$WORKFLOW" != "help" ; then
# Create temporary work area and register removal exit task:
BUILD_DIR="$( mktemp -d -t rear.XXXXXXXXXXXXXXX || Error "Could not create build area '$BUILD_DIR'" )"
+ # Since 'mktemp' doesn't always return a path under /tmp, the build
+ # directory has always to be excluded for safety
+ BACKUP_PROG_EXCLUDE+=( "$BUILD_DIR" )
+
QuietAddExitTask cleanup_build_area_and_end_program
Log "Using build area '$BUILD_DIR'"
ROOTFS_DIR=$BUILD_DIR/rootfs
@@ -582,3 +586,5 @@ if test "$WORKFLOW" != "help" ; then
fi
exit $EXIT_CODE
+
+# vim: set et ts=4 sw=4:
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
index ef118998..52b05eea 100644
--- a/usr/share/rear/conf/default.conf
+++ b/usr/share/rear/conf/default.conf
@@ -47,7 +47,9 @@
# 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
+#
# export TMPDIR="/prefix/for/rear/working/directory"
+#
# 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.

View File

@ -0,0 +1,91 @@
diff --git a/usr/share/rear/skel/default/etc/scripts/system-setup.d/55-migrate-network-devices.sh b/usr/share/rear/skel/default/etc/scripts/system-setup.d/55-migrate-network-devices.sh
index e3ebacce..17cd1dd6 100644
--- a/usr/share/rear/skel/default/etc/scripts/system-setup.d/55-migrate-network-devices.sh
+++ b/usr/share/rear/skel/default/etc/scripts/system-setup.d/55-migrate-network-devices.sh
@@ -26,18 +26,47 @@ ORIGINAL_MACS=()
# The ORIGINAL_DEVICES collects the original device names:
ORIGINAL_DEVICES=()
# The ORIG_MACS_FILE contains lines of the form: network_interface mac_address
+
+# Temporary rear_mappings_mac used when interfaces have been renamed
+tmp_mac_mapping_file=$(mktemp)
+
# TODO: What should happen if there is no ORIG_MACS_FILE or when it is empty?
while read orig_dev orig_mac junk ; do
ORIGINAL_DEVICES=( "${ORIGINAL_DEVICES[@]}" "$orig_dev")
ORIGINAL_MACS=( "${ORIGINAL_MACS[@]}" "$orig_mac" )
- # Continue with the next original MAC address if it is found on the current system:
- ip link show | grep -q "$orig_mac" && continue
- MIGRATE_DEVNAMES=( "${MIGRATE_DEVNAMES[@]}" "$orig_dev" )
- MIGRATE_MACS=( "${MIGRATE_MACS[@]}" "$orig_mac" )
+ # Continue with the next original MAC address if it is found on the current
+ # system, otherwise we consider it needs migration:
+ new_dev=$( get_device_by_hwaddr "$orig_mac" )
+ if [ -n "$new_dev" ] ; then
+ [ "$new_dev" = "$orig_dev" ] && continue
+ # The device was found but has been renamed (it was customized in
+ # source system).
+ # Create a temporary mac mapping, we don't want finalize() to update
+ # the ifcfg-* files!
+ echo "$orig_mac $orig_mac $orig_dev" >> $tmp_mac_mapping_file
+ else
+ MIGRATE_MACS+=( "$orig_mac" )
+ fi
done < $ORIG_MACS_FILE
-# Skip this process if all MACs and network interfacs (devices) are accounted for:
-test ${#MIGRATE_MACS[@]} -eq 0 && test ${#MIGRATE_DEVNAMES[@]} -eq 0 && return 0
+
+if [ ${#MIGRATE_MACS[@]} -ne 0 ] ; then
+ # If some MACs were not found (MIGRATE_MACS not empty) then, we need a migration
+ :
+elif [ -s $tmp_mac_mapping_file ] ; then
+ # Else, if some devices were renamed, we also need a migration, but it will
+ # be automatic thanks to the $tmp_mac_mapping_file mapping file
+
+ # We do not need the $MAC_MAPPING_FILE file from the user, just overwrite it
+ # Later, we will remove that file to not have finalize() modify the ifcfg-*
+ # files.
+ mkdir -p $(dirname $MAC_MAPPING_FILE)
+ cp $tmp_mac_mapping_file $MAC_MAPPING_FILE
+else
+ # Skip this process if all MACs and network interfaces (devices) are accounted for
+ unset tmp_mac_mapping_file
+ return 0
+fi
# Find the MAC addresses that are now available.
# This is an array with values of the form "$dev $mac $driver"
@@ -74,7 +103,7 @@ done
# so that it is shown to the user what MAC address mappings will be done:
if read_and_strip_file $MAC_MAPPING_FILE ; then
while read orig_dev orig_mac junk ; do
- read_and_strip_file $MAC_MAPPING_FILE | grep -q "$orig_mac" && MANUAL_MAC_MAPPING=true
+ read_and_strip_file $MAC_MAPPING_FILE | grep -qw "^$orig_mac" && MANUAL_MAC_MAPPING=true
done < $ORIG_MACS_FILE
fi
@@ -237,7 +266,7 @@ if is_true $reload_udev ; then
echo -n "Reloading udev ... "
# Force udev to reload rules (as they were just changed)
# Failback to "udevadm control --reload" in case of problem (as specify in udevadm manpage in SLES12)
- # If nothing work, then wait 1 seconf delay. It should let the time for udev to detect changes in the rules files.
+ # If nothing work, then wait 1 second delay. It should let the time for udev to detect changes in the rules files.
udevadm control --reload-rules || udevadm control --reload || sleep 1
my_udevtrigger
sleep 1
@@ -252,5 +281,13 @@ if is_true $reload_udev ; then
fi
# A later script in finalize/* will also go over the MAC mappings file and
-# apply them to the files in the recovered system.
+# apply them to the files in the recovered system, unless we did the mapping
+# automatically, which means some device has been renamed and will probably
+# gets its name back upon reboot.
+if [ -s $tmp_mac_mapping_file ] ; then
+ rm $MAC_MAPPING_FILE $tmp_mac_mapping_file
+fi
+
+unset tmp_mac_mapping_file
+# vim: set et ts=4 sw=4:

View File

@ -0,0 +1,17 @@
diff --git a/usr/share/rear/lib/uefi-functions.sh b/usr/share/rear/lib/uefi-functions.sh
index e40f2ab0..95e6292d 100644
--- a/usr/share/rear/lib/uefi-functions.sh
+++ b/usr/share/rear/lib/uefi-functions.sh
@@ -46,6 +46,11 @@ function build_bootx86_efi {
Log "Did not find grub-mkimage (cannot build bootx86.efi)"
return
fi
- $gmkimage $v -O x86_64-efi -c $TMP_DIR/mnt/EFI/BOOT/embedded_grub.cfg -o $TMP_DIR/mnt/EFI/BOOT/BOOTX64.efi -p "/EFI/BOOT" part_gpt part_msdos fat ext2 normal chain boot configfile linux linuxefi multiboot jfs iso9660 usb usbms usb_keyboard video udf ntfs all_video gzio efi_gop reboot search test echo btrfs
+ # as not all Linux distro's have the same grub modules present we verify what we have (see also https://github.com/rear/rear/pull/2001)
+ grub_modules=""
+ for grub_module in part_gpt part_msdos fat ext2 normal chain boot configfile linux linuxefi multiboot jfs iso9660 usb usbms usb_keyboard video udf ntfs all_video gzio efi_gop reboot search test echo btrfs ; do
+ test "$( find /boot -type f -name "$grub_module.mod" 2>/dev/null )" && grub_modules="$grub_modules $grub_module"
+ done
+ $gmkimage $v -O x86_64-efi -c $TMP_DIR/mnt/EFI/BOOT/embedded_grub.cfg -o $TMP_DIR/mnt/EFI/BOOT/BOOTX64.efi -p "/EFI/BOOT" $grub_modules
StopIfError "Error occurred during $gmkimage of BOOTX64.efi"
}

View File

@ -0,0 +1,94 @@
diff --git a/usr/share/rear/lib/layout-functions.sh b/usr/share/rear/lib/layout-functions.sh
index aa6fc938..4bc59131 100644
--- a/usr/share/rear/lib/layout-functions.sh
+++ b/usr/share/rear/lib/layout-functions.sh
@@ -478,6 +478,9 @@ get_sysfs_name() {
### /dev/dm-3 -> /dev/mapper/system-tmp
### /dev/dm-4 -> /dev/mapper/oralun
### /dev/dm-5 -> /dev/mapper/oralunp1
+### /dev/sda -> /dev/sda
+###
+### Returns 0 on success, 1 if device is not existing
get_device_name() {
### strip common prefixes
local name=${1#/dev/}
@@ -485,47 +488,39 @@ get_device_name() {
contains_visible_char "$name" || BugError "Empty string passed to get_device_name"
- ### Translate dm-8 -> mapper/test
- local device dev_number mapper_number
- if [[ -d /sys/block/$name ]] ; then
+ if [[ "$name" =~ ^mapper/ ]]; then
+ echo "/dev/$name"
+ return 0
+ fi
+
+ if [[ -L "/dev/$name" ]] ; then
+ # Map vg/lv into dm-X, which will then be resolved later
+ name="$( basename $(readlink -f /dev/$name) )"
+ fi
+
+ if [[ "$name" =~ ^dm- ]] ; then
+ local device
if [[ -r /sys/block/$name/dm/name ]] ; then
### recent kernels have a dm subfolder
- echo "/dev/mapper/$( < /sys/block/$name/dm/name)";
- return 0
+ device="$( < /sys/block/$name/dm/name )"
else
- ### loop over all block devices
- dev_number=$( < /sys/block/$name/dev)
- for device in /dev/mapper/* ; do
- mapper_number=$(dmsetup info -c --noheadings -o major,minor ${device#/dev/mapper/} 2>/dev/null )
- if [ "$dev_number" = "$mapper_number" ] ; then
- echo "$device"
- return 0
- fi
- done
+ local dev_number=$( < /sys/block/$name/dev)
+ if [[ ! -r "$TMP_DIR/dmsetup_info.txt" ]] ; then
+ dmsetup info --noheadings -c -o name,major,minor > "$TMP_DIR/dmsetup_info.txt"
+ fi
+ device="$( awk -F ':' "/$dev_number\$/ { print \$1 }" < "$TMP_DIR/dmsetup_info.txt" )"
+ [[ -n "$device" ]] || BugError "No device returned for major/minor $dev_number"
fi
- fi
-
- ### Translate device name to mapper name. ex: vg/lv -> mapper/vg-lv
- if [[ "$name" =~ ^mapper/ ]]; then
- echo "/dev/$name"
+ echo "/dev/mapper/$device"
return 0
fi
- if my_dm=`readlink /dev/$name`; then
- for mapper_dev in /dev/mapper/*; do
- if mapper_dm=`readlink $mapper_dev`; then
- if [ "$my_dm" = "$mapper_dm" ]; then
- echo $mapper_dev
- return 0
- fi
- fi
- done
- fi
### handle cciss sysfs naming
name=${name//!//}
### just return the possibly nonexisting name
echo "/dev/$name"
+ [[ -r "/dev/$name" ]] && return 0
return 1
}
diff --git a/usr/share/rear/rescue/GNU/Linux/270_fc_transport_info.sh b/usr/share/rear/rescue/GNU/Linux/270_fc_transport_info.sh
index 0de4f60b..64276dfe 100644
--- a/usr/share/rear/rescue/GNU/Linux/270_fc_transport_info.sh
+++ b/usr/share/rear/rescue/GNU/Linux/270_fc_transport_info.sh
@@ -1,3 +1,6 @@
+# don't collect this anymore, this can be very slow
+return 0
+
# collect output from production SAN disks
find /sys/class/fc_transport -follow -maxdepth 6 \( -name model -o -name vendor -o -name rev -name state -o -name model_name -o -name size -o -name node_name \) 2>/dev/null| egrep -v 'driver|rport|power|drivers|devices' | xargs grep '.' > $VAR_DIR/recovery/fc_transport.info >&2

View File

@ -0,0 +1,40 @@
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 6b3194bd..57e8777a 100644
--- a/usr/share/rear/rescue/GNU/Linux/310_network_devices.sh
+++ b/usr/share/rear/rescue/GNU/Linux/310_network_devices.sh
@@ -562,7 +562,12 @@ function handle_team () {
local network_interface=$1
local sysfspath=/sys/class/net/$network_interface
- if [ "$( ethtool -i $network_interface | awk '$1 == "driver:" { print $2 }' )" != "team" ] ; then
+ if has_binary ethtool ; then
+ if [ "$( ethtool -i $network_interface | awk '$1 == "driver:" { print $2 }' )" != "team" ] ; then
+ return $rc_error
+ fi
+ else
+ LogPrintError "Couldn't determine if network interface '$network_interface' is a Team, skipping."
return $rc_error
fi
@@ -854,10 +859,17 @@ function handle_physdev () {
DebugPrint "$network_interface is a physical device"
- if [ -e $sysfspath/bonding_slave/perm_hwaddr ] ; then
- mac="$( cat $sysfspath/bonding_slave/perm_hwaddr )"
- else
- mac="$( cat $sysfspath/address )" || BugError "Could not read a MAC address for '$network_interface'."
+ local mac=""
+
+ if has_binary ethtool ; then
+ mac="$( ethtool -P $network_interface 2>/dev/null | awk '{ print $NF }' )"
+ fi
+ if [ -z "$mac" ] ; then
+ if [ -e $sysfspath/bonding_slave/perm_hwaddr ] ; then
+ mac="$( cat $sysfspath/bonding_slave/perm_hwaddr )"
+ else
+ mac="$( cat $sysfspath/address )" || BugError "Could not read a MAC address for '$network_interface'."
+ fi
fi
# Skip fake interfaces without MAC address
[ "$mac" != "00:00:00:00:00:00" ] || return $rc_error

View File

@ -0,0 +1,33 @@
diff -up rear-2.4/usr/share/rear/conf/GNU/Linux.conf.empty rear-2.4/usr/share/rear/conf/GNU/Linux.conf
--- rear-2.4/usr/share/rear/conf/GNU/Linux.conf.empty 2019-09-10 09:45:50.381285069 +0200
+++ rear-2.4/usr/share/rear/conf/GNU/Linux.conf 2019-09-10 09:45:50.421284309 +0200
@@ -276,6 +276,6 @@ COPY_AS_IS_EXCLUDE=( "${COPY_AS_IS_EXCLU
# some stuff for the Linux command line
KERNEL_CMDLINE="$KERNEL_CMDLINE selinux=0"
# common users and groups
-CLONE_USERS=( "${CLONE_USERS[@]:-}" daemon rpc usbmuxd usbmux vcsa nobody dbus )
-CLONE_GROUPS=( "${CLONE_GROUPS[@]:-}" tty usbmuxd usbmux fuse kvm oinstall dbus )
+CLONE_USERS+=( daemon rpc usbmuxd usbmux vcsa nobody dbus )
+CLONE_GROUPS+=( tty usbmuxd usbmux fuse kvm oinstall dbus )
diff -up rear-2.4/usr/share/rear/rescue/default/900_clone_users_and_groups.sh.empty rear-2.4/usr/share/rear/rescue/default/900_clone_users_and_groups.sh
--- rear-2.4/usr/share/rear/rescue/default/900_clone_users_and_groups.sh.empty 2018-06-21 10:40:53.000000000 +0200
+++ rear-2.4/usr/share/rear/rescue/default/900_clone_users_and_groups.sh 2019-09-10 09:45:50.421284309 +0200
@@ -40,6 +40,8 @@ local group=""
# because it should succeed when there is any non-empty array member, not necessarily the first one:
test "${CLONE_USERS[*]}" && Log "Cloning users: ${CLONE_USERS[@]}"
for user in "${CLONE_USERS[@]}" ; do
+ # Skip empty user values, cf. https://github.com/rear/rear/issues/2220
+ test $user || continue
# Skip if the user exists already in the ReaR recovery system:
grep -q "^$user:" $ROOTFS_DIR/etc/passwd && continue
# Skip if the user does not exist in the current system:
@@ -78,6 +80,8 @@ done
# because it should succeed when there is any non-empty array member, not necessarily the first one:
test "${CLONE_GROUPS[*]}" && Log "Cloning groups: ${CLONE_GROUPS[@]}"
for group in "${CLONE_GROUPS[@]}" ; do
+ # Skip empty group values, cf. https://github.com/rear/rear/issues/2220
+ test $group || continue
# Skip if the group exists already in the ReaR recovery system:
grep -q "^$group:" $ROOTFS_DIR/etc/group && continue
# Skip if the group does not exist in the current system:

View File

@ -0,0 +1,113 @@
diff -up rear-2.4/usr/share/rear/build/default/980_verify_rootfs.sh.build rear-2.4/usr/share/rear/build/default/980_verify_rootfs.sh
--- rear-2.4/usr/share/rear/build/default/980_verify_rootfs.sh.build 2019-09-10 09:31:05.971102125 +0200
+++ rear-2.4/usr/share/rear/build/default/980_verify_rootfs.sh 2019-09-10 09:31:06.002101535 +0200
@@ -3,6 +3,33 @@
# i.e. test that the ReaR recovery system will be usable
# to avoid issues like https://github.com/rear/rear/issues/1494
+if test "$KEEP_BUILD_DIR" = "errors"; then
+ local keep_build_dir_on_errors=1
+else
+ # KEEP_BUILD_DIR does not say to keep it on errors
+ # - effective value depends on whether we are running interactively
+ if tty -s ; then
+ local keep_build_dir_on_errors=1
+ else
+ local keep_build_dir_on_errors=0
+ fi
+fi
+
+function keep_build_dir() {
+ if ! is_true "$KEEP_BUILD_DIR" && ! is_false "$KEEP_BUILD_DIR"; then
+ # is either empty or equal to "errors" ... or some garbage value
+ local orig_keep_build_dir="$KEEP_BUILD_DIR"
+ KEEP_BUILD_DIR="${keep_build_dir_on_errors}"
+ fi
+ if is_true "$KEEP_BUILD_DIR" ; then
+ LogPrintError "Build area kept for investigation in $BUILD_DIR, remove it when not needed"
+ elif ! is_false "$orig_keep_build_dir" ; then
+ # if users disabled preserving the build dir explicitly, let's not bother them with messages
+ LogPrintError "Build area $BUILD_DIR will be removed"
+ LogPrintError "To preserve it for investigation set KEEP_BUILD_DIR=errors or run ReaR with -d"
+ fi
+}
+
# In case the filesystem that contains the ROOTFS_DIR is mounted 'noexec' we cannot do the 'chroot' tests.
# The filesystem_name function in linux-functions.sh returns the mountpoint (not a filesystem name like 'ext4'):
local rootfs_dir_fs_mountpoint=$( filesystem_name $ROOTFS_DIR )
@@ -16,7 +43,7 @@ Log "Testing that $ROOTFS_DIR contains a
# The bash test ensures that we have a working bash in the ReaR recovery system:
if ! chroot $ROOTFS_DIR /bin/bash -c true ; then
- KEEP_BUILD_DIR=1
+ keep_build_dir
BugError "ReaR recovery system in '$ROOTFS_DIR' is broken: 'bash -c true' failed"
fi
@@ -25,7 +52,7 @@ fi
# First test is 'ldd /bin/bash' to ensure 'ldd' works:
Log "Testing 'ldd /bin/bash' to ensure 'ldd' works for the subsequent 'ldd' tests"
if ! chroot $ROOTFS_DIR /bin/ldd /bin/bash 1>&2 ; then
- KEEP_BUILD_DIR=1
+ keep_build_dir
BugError "ReaR recovery system in '$ROOTFS_DIR' is broken: 'ldd /bin/bash' failed"
fi
# Now test each binary (except links) with ldd and look for 'not found' libraries.
@@ -83,7 +110,7 @@ test $old_LD_LIBRARY_PATH && export LD_L
# Report binaries with 'not found' shared object dependencies:
if contains_visible_char "$broken_binaries" ; then
LogPrintError "There are binaries or libraries in the ReaR recovery system that need additional libraries"
- KEEP_BUILD_DIR=1
+ keep_build_dir
local fatal_missing_library=""
local ldd_output=""
for binary in $broken_binaries ; do
@@ -113,9 +140,10 @@ if contains_visible_char "$broken_binari
# 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" )"
done
+ LogPrintError "ReaR recovery system in '$ROOTFS_DIR' needs additional libraries, check $RUNTIME_LOGFILE for details"
+ is_true "$fatal_missing_library" && keep_build_dir
# Usually it should be no BugError when there are libraries missing for particular binaries because probably
# the reason is that the user added only the plain binaries with COPY_AS_IS (instead of using REQUIRED_PROGS):
is_true "$fatal_missing_library" && Error "ReaR recovery system in '$ROOTFS_DIR' not usable"
- LogPrintError "ReaR recovery system in '$ROOTFS_DIR' needs additional libraries, check $RUNTIME_LOGFILE for details"
fi
diff -up rear-2.4/usr/share/rear/conf/default.conf.build rear-2.4/usr/share/rear/conf/default.conf
--- rear-2.4/usr/share/rear/conf/default.conf.build 2019-09-10 09:31:05.996101649 +0200
+++ rear-2.4/usr/share/rear/conf/default.conf 2019-09-10 09:31:06.002101535 +0200
@@ -125,9 +125,19 @@ OS_VERSION=none
# supported values that could make it work even for your system.
# See the SetOSVendorAndVersion function in the config-functions.sh script.
-# Keep the build area after we are done (BOOL).
+# Keep the build area after we are done (ternary).
# Useful to inspect the ReaR recovery system content in $TMPDIR/rear.XXXXXXXXXXXXXXX/rootfs/
-# directly without the need to extract it from the initramfs/initrd in the ISO image:
+# directly without the need to extract it from the initramfs/initrd in the ISO image.
+# Set to "y", "Yes", etc. to always keep the build area, to "n", "No", etc. to never keep it.
+# KEEP_BUILD_DIR is automatically set to true in debug mode (-d) and in debugscript mode (-D).
+# In addition to true (any value that is recognized as 'yes' by the is_true function)
+# and false (any value that is recognized as 'no' by the is_false function) it can be set
+# to several special values:
+# - "errors" to obtain the old behaviour where KEEP_BUILD_DIR was always set
+# to true to keep the build area when errors in the ReaR recovery system were detected.
+# - empty (KEEP_BUILD_DIR="") which means that the build area will be kept on errors
+# if running interactively (in a terminal) and not otherwise (to avoid cluttering
+# /tmp by cron or other automated jobs in case of errors).
KEEP_BUILD_DIR=""
# No default workflows. This variable is filled in where the workflows are defined
diff -up rear-2.4/usr/share/rear/lib/framework-functions.sh.build rear-2.4/usr/share/rear/lib/framework-functions.sh
--- rear-2.4/usr/share/rear/lib/framework-functions.sh.build 2018-06-21 10:40:53.000000000 +0200
+++ rear-2.4/usr/share/rear/lib/framework-functions.sh 2019-09-10 09:31:06.002101535 +0200
@@ -106,7 +106,7 @@ function SourceStage () {
function cleanup_build_area_and_end_program () {
# Cleanup build area
Log "Finished in $((SECONDS-STARTTIME)) seconds"
- if test "$KEEP_BUILD_DIR" ; then
+ if is_true "$KEEP_BUILD_DIR" ; then
LogPrint "You should also rm -Rf $BUILD_DIR"
else
Log "Removing build area $BUILD_DIR"

View File

@ -0,0 +1,12 @@
diff -up rear-2.4/usr/share/rear/conf/default.conf.nbu rear-2.4/usr/share/rear/conf/default.conf
--- rear-2.4/usr/share/rear/conf/default.conf.nbu 2019-09-10 09:37:56.619290929 +0200
+++ rear-2.4/usr/share/rear/conf/default.conf 2019-09-10 09:37:56.621290891 +0200
@@ -1480,7 +1480,7 @@ OBDR_BLOCKSIZE=2048
#
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_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 )
-NBU_LD_LIBRARY_PATH="/usr/openv/lib"
+NBU_LD_LIBRARY_PATH="/usr/openv/lib:/usr/openv/netbackup/sec/at/lib/"
PROGS_NBU=( )
##

View File

@ -0,0 +1,87 @@
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 2fc8ccd3..60306718 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
@@ -50,13 +50,28 @@ fi
# so that in particular what is mounted at '/' is output before other stuff.
read_filesystems_command="$read_filesystems_command | sort -t ' ' -k 1,1 -u"
-# docker daemon mounts file systems for its docker containers
-# see also https://docs.docker.com/storage/storagedriver/device-mapper-driver/#configure-direct-lvm-mode-for-production
-# As it is for container usage only we do not to backup these up or recreate as this disk device is completely under
-# control by docker itself (even the recreation of it incl, the creation of the volume group). Usually this is
-# done via a kind of cookbook (Chef, puppet or ansible)
+# The Docker daemon mounts file systems for its Docker containers, see also
+# https://docs.docker.com/storage/storagedriver/device-mapper-driver/#configure-direct-lvm-mode-for-production
+# As it is for container usage only we do not to backup these up or recreate as this disk device is completely
+# under control by Docker itself (even the recreation of it incl, the creation of the volume group).
+# Usually this is done via a kind of cookbook (Chef, puppet or ansible).
docker_is_running=""
-service docker status >/dev/null 2>&1 && docker_is_running="yes"
+docker_root_dir=""
+if service docker status &>/dev/null ; then
+ docker_is_running="yes"
+ # When the Docker daemon/service is running, try to get its 'Docker Root Dir':
+ # Kill 'docker info' with SIGTERM after 5 seconds and with SIGKILL after additional 2 seconds
+ # because there are too many crippled Docker installations, cf. https://github.com/rear/rear/pull/2021
+ docker_root_dir=$( timeout -k 2s 5s docker info | grep 'Docker Root Dir' | awk '{print $4}' )
+ # Things may go wrong in the 'Docker specific exclude part' below
+ # when Docker is used but its 'Docker Root Dir' cannot be determined
+ # cf. https://github.com/rear/rear/issues/1989
+ if test "$docker_root_dir" ; then
+ LogPrint "Docker is running, skipping filesystems mounted below Docker Root Dir $docker_root_dir"
+ else
+ LogPrintError "Cannot determine Docker Root Dir - things may go wrong - check $DISKLAYOUT_FILE"
+ fi
+fi
# Begin writing output to DISKLAYOUT_FILE:
(
@@ -64,9 +79,10 @@ service docker status >/dev/null 2>&1 && docker_is_running="yes"
echo "# Format: fs <device> <mountpoint> <fstype> [uuid=<uuid>] [label=<label>] [<attributes>]"
# Read the output of the read_filesystems_command:
while read device mountpoint fstype options junk ; do
+ Log "Processing filesystem '$fstype' on '$device' mounted at '$mountpoint'"
# Empty device or mountpoint or fstype may may indicate an error. In this case be verbose and inform the user:
if test -z "$device" -o -z "$mountpoint" -o -z "$fstype" ; then
- LogPrint "Empty device='$device' or mountpoint='$mountpoint' or fstype='$fstype', skipping saving filesystem layout for it."
+ LogPrintError "Empty device='$device' or mountpoint='$mountpoint' or fstype='$fstype', skipping saving filesystem layout for it."
continue
fi
# FIXME: I (jsmeix@suse.de) have no idea what the reason for the following is.
@@ -88,15 +104,18 @@ service docker status >/dev/null 2>&1 && docker_is_running="yes"
Log "$device is CD/DVD type device [fstype=$fstype], skipping."
continue
fi
- # docker specific exclude part
+ # Docker specific exclude part:
if is_true $docker_is_running ; then
- # docker daemon/service is running
- docker_root_dir=$( docker info 2>/dev/null | grep 'Docker Root Dir' | awk '{print $4}' )
- # If $docker_root_dir is in the beginning of the $mountpoint string then FS is under docker control
- # and we better exclude from saving the layout,
- # see https://github.com/rear/rear/issues/1749
- Log "$device is mounted below $docker_root_dir (mount point $mountpoint is under docker control), skipping."
- echo "$mountpoint" | grep -q "^$docker_root_dir" && continue
+ # If docker_root_dir is the beginning of the mountpoint string then the filesystem is under Docker control
+ # and we better exclude it from saving the layout, see https://github.com/rear/rear/issues/1749
+ # but ensure docker_root_dir is not empty (otherwise any mountpoint string matches "^" which
+ # would skip all mountpoints), see https://github.com/rear/rear/issues/1989#issuecomment-456054278
+ if test "$docker_root_dir" ; then
+ if echo "$mountpoint" | grep -q "^$docker_root_dir" ; then
+ Log "Filesystem $fstype on $device mounted at $mountpoint is below Docker Root Dir $docker_root_dir, skipping."
+ continue
+ fi
+ fi
fi
# Replace a symbolic link /dev/disk/by-uuid/a1b2c3 -> ../../sdXn
# by the fully canonicalized target of the link e.g. /dev/sdXn
@@ -232,7 +251,7 @@ service docker status >/dev/null 2>&1 && docker_is_running="yes"
test -z "$btrfs_default_subvolume_path" && btrfs_default_subvolume_path="/"
# Empty btrfs_default_subvolume_ID may may indicate an error. In this case be verbose and inform the user:
if test -z "$btrfs_default_subvolume_ID" ; then
- LogPrint "Empty btrfs_default_subvolume_ID, no btrfs default subvolume stored for $btrfs_device at $btrfs_mountpoint"
+ LogPrintError "Empty btrfs_default_subvolume_ID, no btrfs default subvolume stored for $btrfs_device at $btrfs_mountpoint"
else
echo "btrfsdefaultsubvol $btrfs_device $btrfs_mountpoint $btrfs_default_subvolume_ID $btrfs_default_subvolume_path"
fi

View File

@ -0,0 +1,17 @@
diff --git a/usr/share/rear/restore/BACULA/default/400_restore_backup.sh b/usr/share/rear/restore/BACULA/default/400_restore_backup.sh
index eac4d275..d21af71c 100644
--- a/usr/share/rear/restore/BACULA/default/400_restore_backup.sh
+++ b/usr/share/rear/restore/BACULA/default/400_restore_backup.sh
@@ -110,7 +110,11 @@ WARNING: The new root is mounted under '$TARGET_FS_ROOT'.
Press ENTER to start bconsole"
read
- bconsole
+ if bconsole 0<&6 1>&7 2>&8 ; then
+ Log "bconsole finished with zero exit code"
+ else
+ Log "bconsole finished with non-zero exit code $?"
+ fi
LogPrint "
Please verify that the backup has been restored correctly to '$TARGET_FS_ROOT'

View File

@ -0,0 +1,119 @@
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 e43ff896..a9730435 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
@@ -53,6 +53,7 @@ Log "Saving LVM layout."
done
header_printed=0
+ already_processed_lvs=""
## Get all logical volumes
# format: lvmvol <volume_group> <name> <size(bytes)> <layout> [key:value ...]
@@ -61,7 +62,7 @@ Log "Saving LVM layout."
if lvm lvs -o lv_layout >/dev/null 2>&1; then
- lvm 8>&- 7>&- lvs --separator=":" --noheadings --units b --nosuffix -o origin,lv_name,vg_name,lv_size,lv_layout,pool_lv,chunk_size,stripes,stripe_size | while read line ; do
+ lvm 8>&- 7>&- lvs --separator=":" --noheadings --units b --nosuffix -o origin,lv_name,vg_name,lv_size,lv_layout,pool_lv,chunk_size,stripes,stripe_size,seg_size | while read line ; do
if [ $header_printed -eq 0 ] ; then
echo "# Format for LVM LVs"
@@ -72,7 +73,7 @@ Log "Saving LVM layout."
origin="$(echo "$line" | awk -F ':' '{ print $1 }')"
# Skip snapshots (useless) or caches (dont know how to handle that)
if [ -n "$origin" ] ; then
- echo "# Skipped snapshot of cache information '$line'"
+ echo "# Skipped snapshot or cache information '$line'"
continue
fi
@@ -84,25 +85,45 @@ Log "Saving LVM layout."
chunksize="$(echo "$line" | awk -F ':' '{ print $7 }')"
stripes="$(echo "$line" | awk -F ':' '{ print $8 }')"
stripesize="$(echo "$line" | awk -F ':' '{ print $9 }')"
+ segmentsize="$(echo "$line" | awk -F ':' '{ print $10 }')"
kval=""
+ infokval=""
[ -z "$thinpool" ] || kval="${kval:+$kval }thinpool:$thinpool"
[ $chunksize -eq 0 ] || kval="${kval:+$kval }chunksize:${chunksize}b"
[ $stripesize -eq 0 ] || kval="${kval:+$kval }stripesize:${stripesize}b"
+ [ $segmentsize -eq $size ] || infokval="${infokval:+$infokval }segmentsize:${segmentsize}b"
if [[ ,$layout, == *,mirror,* ]] ; then
kval="${kval:+$kval }mirrors:$(($stripes - 1))"
elif [[ ,$layout, == *,striped,* ]] ; then
kval="${kval:+$kval }stripes:$stripes"
fi
- echo "lvmvol /dev/$vg $lv ${size}b $layout $kval"
+ if [[ " $already_processed_lvs " == *\ $vg/$lv\ * ]] ; then
+ # The LV has multiple segments; the create_lvmvol() function in
+ # 110_include_lvm_code.sh is not able to recreate this, but
+ # keep the information for the administrator anyway.
+ echo "#lvmvol /dev/$vg $lv ${size}b $layout $kval"
+ if [ -n "$infokval" ] ; then
+ echo "# extra parameters for the line above not taken into account when restoring using 'lvcreate': $infokval"
+ fi
+ else
+ if [ $segmentsize -ne $size ] ; then
+ echo "# WARNING: Volume $vg/$lv has multiple segments. Restoring it in Migration Mode using 'lvcreate' won't preserve segments and properties of the other segments as well!"
+ fi
+ echo "lvmvol /dev/$vg $lv ${size}b $layout $kval"
+ if [ -n "$infokval" ] ; then
+ echo "# extra parameters for the line above not taken into account when restoring using 'lvcreate': $infokval"
+ fi
+ already_processed_lvs="${already_processed_lvs:+$already_processed_lvs }$vg/$lv"
+ fi
done
else
# Compatibility with older LVM versions (e.g. <= 2.02.98)
# No support for 'lv_layout', too bad, do our best!
- lvm 8>&- 7>&- lvs --separator=":" --noheadings --units b --nosuffix -o origin,lv_name,vg_name,lv_size,modules,pool_lv,chunk_size,stripes,stripe_size | while read line ; do
+ lvm 8>&- 7>&- lvs --separator=":" --noheadings --units b --nosuffix -o origin,lv_name,vg_name,lv_size,modules,pool_lv,chunk_size,stripes,stripe_size,seg_size | while read line ; do
if [ $header_printed -eq 0 ] ; then
echo "# Format for LVM LVs"
@@ -125,11 +146,14 @@ Log "Saving LVM layout."
chunksize="$(echo "$line" | awk -F ':' '{ print $7 }')"
stripes="$(echo "$line" | awk -F ':' '{ print $8 }')"
stripesize="$(echo "$line" | awk -F ':' '{ print $9 }')"
+ segmentsize="$(echo "$line" | awk -F ':' '{ print $10 }')"
kval=""
+ infokval=""
[ -z "$thinpool" ] || kval="${kval:+$kval }thinpool:$thinpool"
[ $chunksize -eq 0 ] || kval="${kval:+$kval }chunksize:${chunksize}b"
[ $stripesize -eq 0 ] || kval="${kval:+$kval }stripesize:${stripesize}b"
+ [ $segmentsize -eq $size ] || infokval="${infokval:+$infokval }segmentsize:${segmentsize}b"
if [[ "$modules" == "" ]] ; then
layout="linear"
[ $stripes -eq 0 ] || kval="${kval:+$kval }stripes:$stripes"
@@ -148,7 +172,24 @@ Log "Saving LVM layout."
kval="${kval:+$kval }stripes:$stripes"
fi
- echo "lvmvol /dev/$vg $lv ${size}b $layout $kval"
+ if [[ " $already_processed_lvs " == *\ $vg/$lv\ * ]]; then
+ # The LV has multiple segments; the create_lvmvol() function in
+ # 110_include_lvm_code.sh is not able to recreate this, but
+ # keep the information for the administrator anyway.
+ echo "#lvmvol /dev/$vg $lv ${size}b $layout $kval"
+ if [ -n "$infokval" ] ; then
+ echo "# extra parameters for the line above not taken into account when restoring using 'lvcreate': $infokval"
+ fi
+ else
+ if [ $segmentsize -ne $size ] ; then
+ echo "# WARNING: Volume $vg/$lv has multiple segments. Restoring it in Migration Mode using 'lvcreate' won't preserve segments and properties of the other segments as well!"
+ fi
+ echo "lvmvol /dev/$vg $lv ${size}b $layout $kval"
+ if [ -n "$infokval" ] ; then
+ echo "# extra parameters for the line above not taken into account when restoring using 'lvcreate': $infokval"
+ fi
+ already_processed_lvs="${already_processed_lvs:+$already_processed_lvs }$vg/$lv"
+ fi
done
fi

View File

@ -0,0 +1,194 @@
diff --git a/usr/share/rear/lib/uefi-functions.sh b/usr/share/rear/lib/uefi-functions.sh
index 95e6292d..c583e044 100644
--- a/usr/share/rear/lib/uefi-functions.sh
+++ b/usr/share/rear/lib/uefi-functions.sh
@@ -37,20 +37,76 @@ function trim {
}
function build_bootx86_efi {
- local gmkimage
- if has_binary grub-mkimage; then
- gmkimage=grub-mkimage
- elif has_binary grub2-mkimage; then
- gmkimage=grub2-mkimage
+ local outfile="$1"
+ local embedded_config=""
+ local gmkstandalone=""
+ local gprobe=""
+ local dirs=()
+ # modules is the list of modules to load
+ local modules=()
+
+ # Configuration file is optional for image creation.
+ shift
+ if [[ -n "$1" ]] ; then
+ # graft point syntax. $1 will appear as /boot/grub/grub.cfg in the image
+ embedded_config="/boot/grub/grub.cfg=$1"
+ shift
+ # directories that should be accessible by GRUB2 (e.g. because they contain the kernel)
+ dirs=( ${@:+"$@"} )
+ fi
+
+ if has_binary grub-mkstandalone ; then
+ gmkstandalone=grub-mkstandalone
+ elif has_binary grub2-mkstandalone ; then
+ # At least SUSE systems use 'grub2' prefixed names for GRUB2 programs:
+ gmkstandalone=grub2-mkstandalone
else
- Log "Did not find grub-mkimage (cannot build bootx86.efi)"
- return
+ # This build_bootx86_efi function is only called in output/ISO/Linux-i386/250_populate_efibootimg.sh
+ # which runs only if UEFI is used so that we simply error out here if we cannot make a bootable EFI image of GRUB2
+ # (normally a function should not exit out but return to its caller with a non-zero return code):
+ Error "Cannot make bootable EFI image of GRUB2 (neither grub-mkstandalone nor grub2-mkstandalone found)"
+ fi
+
+ # Determine what modules need to be loaded in order to access given directories
+ # (if the list of modules is not overriden by GRUB2_MODULES_LOAD)
+ if (( ${#dirs[@]} )) && ! (( ${#modules[@]} )) ; then
+ if has_binary grub-probe ; then
+ gprobe=grub-probe
+ elif has_binary grub2-probe ; then
+ # At least SUSE systems use 'grub2' prefixed names for GRUB2 programs:
+ gprobe=grub2-probe
+ else
+ LogWarn "Neither grub-probe nor grub2-probe found"
+ if test /usr/lib/grub*/x86_64-efi/partmap.lst ; then
+ LogWarn "including all partition modules"
+ modules=( $(cat /usr/lib/grub*/x86_64-efi/partmap.lst) )
+ else
+ Error "Can not determine partition modules, ${dirs[*]} would be likely inaccessible in GRUB2"
+ fi
+ fi
+
+ if [ -n "$gprobe" ]; then
+ # this is unfortunately only a crude approximation of the Grub internal probe_mods() function
+ modules=( $( for p in "${dirs[@]}" ; do
+ $gprobe --target=fs "$p"
+ $gprobe --target=partmap "$p" | sed -e 's/^/part_/'
+ $gprobe --target=abstraction "$p"
+ done | sort -u ) )
+ fi
+ fi
+
+ # grub-mkimage needs /usr/lib/grub/x86_64-efi/moddep.lst (cf. https://github.com/rear/rear/issues/1193)
+ # and at least on SUSE systems grub2-mkimage needs /usr/lib/grub2/x86_64-efi/moddep.lst (in 'grub2' directory)
+ # so that we error out if grub-mkimage or grub2-mkimage would fail when its moddep.lst is missing.
+ # Careful: usr/sbin/rear sets nullglob so that /usr/lib/grub*/x86_64-efi/moddep.lst gets empty if nothing matches
+ # and 'test -f' succeeds with empty argument so that we cannot use 'test -f /usr/lib/grub*/x86_64-efi/moddep.lst'
+ # also 'test -n' succeeds with empty argument but (fortunately/intentionally?) plain 'test' fails with empty argument:
+ test /usr/lib/grub*/x86_64-efi/moddep.lst || Error "$gmkstandalone would not make bootable EFI image of GRUB2 (no /usr/lib/grub*/x86_64-efi/moddep.lst file)"
+
+ (( ${#modules[@]} )) && LogPrint "GRUB2 modules to load: ${modules[*]}"
+
+ if ! $gmkstandalone $v ${modules:+"--modules=${modules[*]}"} -O x86_64-efi -o $outfile $embedded_config ; then
+ Error "Failed to make bootable EFI image of GRUB2 (error during $gmkstandalone of $outfile)"
fi
- # as not all Linux distro's have the same grub modules present we verify what we have (see also https://github.com/rear/rear/pull/2001)
- grub_modules=""
- for grub_module in part_gpt part_msdos fat ext2 normal chain boot configfile linux linuxefi multiboot jfs iso9660 usb usbms usb_keyboard video udf ntfs all_video gzio efi_gop reboot search test echo btrfs ; do
- test "$( find /boot -type f -name "$grub_module.mod" 2>/dev/null )" && grub_modules="$grub_modules $grub_module"
- done
- $gmkimage $v -O x86_64-efi -c $TMP_DIR/mnt/EFI/BOOT/embedded_grub.cfg -o $TMP_DIR/mnt/EFI/BOOT/BOOTX64.efi -p "/EFI/BOOT" $grub_modules
- StopIfError "Error occurred during $gmkimage of BOOTX64.efi"
}
+
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 fdf66039..e9325012 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
@@ -2,6 +2,9 @@
is_true $USING_UEFI_BOOTLOADER || return 0 # empty or 0 means NO UEFI
+local boot_dir="/boot"
+local efi_boot_tmp_dir="$TMP_DIR/mnt/EFI/BOOT"
+
mkdir $v -p $TMP_DIR/mnt/EFI/BOOT >&2
StopIfError "Could not create $TMP_DIR/mnt/EFI/BOOT"
@@ -56,14 +59,8 @@ title Relax-and-Recover (no Secure Boot)
EOF
else
-# create small embedded grub.cfg file for grub-mkimage
-cat > $TMP_DIR/mnt/EFI/BOOT/embedded_grub.cfg <<EOF
-set prefix=(cd0)/EFI/BOOT
-configfile /EFI/BOOT/grub.cfg
-EOF
-
-# create a grub.cfg
- create_grub2_cfg > $TMP_DIR/mnt/EFI/BOOT/grub.cfg
+ # create a grub.cfg
+ create_grub2_cfg > $efi_boot_tmp_dir/grub.cfg
fi
# Create BOOTX86.efi but only if we are NOT secure booting.
@@ -72,15 +69,15 @@ fi
# See issue #1374
# build_bootx86_efi () can be safely used for other scenarios.
if ! test -f "$SECURE_BOOT_BOOTLOADER" ; then
- build_bootx86_efi
+ build_bootx86_efi $TMP_DIR/mnt/EFI/BOOT/BOOTX64.efi $efi_boot_tmp_dir/grub.cfg "$boot_dir" "$UEFI_BOOTLOADER"
fi
# We will be using grub-efi or grub2 (with efi capabilities) to boot from ISO.
# Because usr/sbin/rear sets 'shopt -s nullglob' the 'echo -n' command
# outputs nothing if nothing matches the bash globbing pattern '/boot/grub*'
-local grubdir="$( echo -n /boot/grub* )"
+local grubdir="$( echo -n ${boot_dir}/grub* )"
# Use '/boot/grub' as fallback if nothing matches '/boot/grub*'
-test -d "$grubdir" || grubdir='/boot/grub'
+test -d "$grubdir" || grubdir="${boot_dir}/grub"
if [ -d $(dirname ${UEFI_BOOTLOADER})/fonts ]; then
cp $v $(dirname ${UEFI_BOOTLOADER})/fonts/* $TMP_DIR/mnt/EFI/BOOT/fonts/ >&2
diff --git a/usr/share/rear/output/default/940_grub2_rescue.sh b/usr/share/rear/output/default/940_grub2_rescue.sh
index a94957de..fbbd7074 100644
--- a/usr/share/rear/output/default/940_grub2_rescue.sh
+++ b/usr/share/rear/output/default/940_grub2_rescue.sh
@@ -144,13 +144,18 @@ if is_true $USING_UEFI_BOOTLOADER ; then
# probably a bug, as I was able to boot with value set to root=anything
root_uuid=$(mount | grep -w 'on /' | awk '{print $1}' | xargs blkid -s UUID -o value)
- # Grub2 modules that will be used for booting "Relax-and-Recover"
- # It might be useful to make this variable global in the future
- grub2_modules="linux echo all_video part_gpt ext2 btrfs search configfile"
-
# Create configuration file for "Relax-and-Recover" UEFI boot entry.
# This file will not interact with existing Grub2 configuration in any way.
- ( echo "menuentry '$grub_rear_menu_entry_name' --class os {"
+ ( echo "set btrfs_relative_path=y"
+ echo "insmod efi_gop"
+ echo "insmod efi_uga"
+ echo "insmod video_bochs"
+ echo "insmod video_cirrus"
+ echo "insmod all_video"
+ echo ""
+ echo "set gfxpayload=keep"
+ echo ""
+ echo "menuentry '$grub_rear_menu_entry_name' --class os {"
echo " search --no-floppy --fs-uuid --set=root $grub_boot_uuid"
echo " echo 'Loading kernel $boot_kernel_file ...'"
echo " linux $grub_boot_dir/$boot_kernel_name root=UUID=$root_uuid $KERNEL_CMDLINE"
@@ -159,19 +164,8 @@ if is_true $USING_UEFI_BOOTLOADER ; then
echo "}"
) > $grub_config_dir/rear.cfg
- # Tell rear.efi which configuration file to load
- ( echo "search --no-floppy --fs-uuid --set=root $grub_boot_uuid"
- echo ""
- echo "set btrfs_relative_path=y"
- echo "set prefix=(\$root)${grub_boot_dir}/grub${grub_num}"
- echo ""
- echo "configfile (\$root)${grub_boot_dir}/grub${grub_num}/rear.cfg"
- ) > $grub_config_dir/rear_embed.cfg
-
# Create rear.efi at UEFI default boot directory location.
- if ! grub${grub_num}-mkimage -o $boot_dir/efi/EFI/BOOT/rear.efi -O x86_64-efi -c $grub_config_dir/rear_embed.cfg -p /EFI/BOOT $grub2_modules ; then
- Error "Could not create UEFI boot image"
- fi
+ build_bootx86_efi $boot_dir/efi/EFI/BOOT/rear.efi $grub_config_dir/rear.cfg "$boot_dir" "$UEFI_BOOTLOADER"
# If UEFI boot entry for "Relax-and-Recover" does not exist, create it.
# This will also add "Relax-and-Recover" to boot order because if UEFI entry is not listed in BootOrder,

View File

@ -0,0 +1,85 @@
diff --git a/usr/share/rear/conf/GNU/Linux.conf b/usr/share/rear/conf/GNU/Linux.conf
index 5b9343b9..f0c44381 100644
--- a/usr/share/rear/conf/GNU/Linux.conf
+++ b/usr/share/rear/conf/GNU/Linux.conf
@@ -184,6 +184,8 @@ env
w
dosfslabel
sysctl
+blockdev
+lsblk
)
# the lib* serves to cover both 32bit and 64bit libraries!
diff --git a/usr/share/rear/lib/layout-functions.sh b/usr/share/rear/lib/layout-functions.sh
index eb45115b..af1069ea 100644
--- a/usr/share/rear/lib/layout-functions.sh
+++ b/usr/share/rear/lib/layout-functions.sh
@@ -365,7 +365,9 @@ get_partition_start() {
local disk_name=$1
local start_block start
- local block_size=$(get_block_size ${disk_name%/*})
+ # When reading /sys/block/.../start or "dmsetup table", output is always in
+ # 512 bytes blocks
+ local block_size=512
if [[ -r /sys/block/$disk_name/start ]] ; then
start_block=$(< $path/start)
@@ -548,11 +550,32 @@ get_device_mapping() {
}
# Get the size in bytes of a disk/partition.
+# For disks, use "sda" as argument.
# For partitions, use "sda/sda1" as argument.
get_disk_size() {
local disk_name=$1
+ # When a partition is specified (e.g. sda/sda1)
+ # then it has to read /sys/block/sda/sda1/size in the old code below.
+ # In contrast the get_block_size() function below is different
+ # because it is non-sense asking for block size of a partition,
+ # so that the get_block_size() function below is stripping everything
+ # in front of the blockdev basename (e.g. /some/path/sda -> sda)
+ # cf. https://github.com/rear/rear/pull/1885#discussion_r207900308
+
+ # Preferably use blockdev, see https://github.com/rear/rear/issues/1884
+ if has_binary blockdev; then
+ # ${disk_name##*/} translates 'sda/sda1' into 'sda1' and 'sda' into 'sda'
+ blockdev --getsize64 /dev/${disk_name##*/} && return
+ # If blockdev fails do not error out but fall through to the old code below
+ # because blockdev fails e.g. for a CDROM device when no DVD or ISO is attached to
+ # cf. https://github.com/rear/rear/pull/1885#issuecomment-410676283
+ # and https://github.com/rear/rear/pull/1885#issuecomment-410697398
+ fi
- local block_size=$(get_block_size ${disk_name%/*})
+ # Linux always considers sectors to be 512 bytes long. See the note in the
+ # kernel source, specifically, include/linux/types.h regarding the sector_t
+ # type for details.
+ local block_size=512
retry_command test -r /sys/block/$disk_name/size || Error "Could not determine size of disk $disk_name"
@@ -565,9 +588,20 @@ get_disk_size() {
# Get the block size of a disk.
get_block_size() {
+ local disk_name="${1##*/}" # /some/path/sda -> sda
+
+ # Preferably use blockdev, see https://github.com/rear/rear/issues/1884
+ if has_binary blockdev; then
+ blockdev --getss /dev/$disk_name && return
+ # If blockdev fails do not error out but fall through to the old code below
+ # because blockdev fails e.g. for a CDROM device when no DVD or ISO is attached to
+ # cf. https://github.com/rear/rear/pull/1885#issuecomment-410676283
+ # and https://github.com/rear/rear/pull/1885#issuecomment-410697398
+ fi
+
# Only newer kernels have an interface to get the block size
- if [ -r /sys/block/$1/queue/logical_block_size ] ; then
- echo $( < /sys/block/$1/queue/logical_block_size)
+ if [ -r /sys/block/$disk_name/queue/logical_block_size ] ; then
+ echo $( < /sys/block/$disk_name/queue/logical_block_size)
else
echo "512"
fi

View File

@ -0,0 +1,50 @@
diff --git a/usr/share/rear/finalize/Linux-ppc64le/680_install_PPC_bootlist.sh b/usr/share/rear/finalize/Linux-ppc64le/680_install_PPC_bootlist.sh
index bf1db404..3a07580a 100644
--- a/usr/share/rear/finalize/Linux-ppc64le/680_install_PPC_bootlist.sh
+++ b/usr/share/rear/finalize/Linux-ppc64le/680_install_PPC_bootlist.sh
@@ -9,9 +9,12 @@ if grep -q "PowerNV" /proc/cpuinfo || grep -q "emulated by qemu" /proc/cpuinfo ;
fi
# Look for the PPC PReP Boot Partition.
-part=$( awk -F ' ' '/^part / {if ($6 ~ /prep/) {print $7}}' $LAYOUT_FILE )
+part_list=$( awk -F ' ' '/^part / {if ($6 ~ /prep/) {print $7}}' $LAYOUT_FILE )
-if [ -n "$part" ]; then
+# All the possible boot devices
+boot_list=()
+
+for part in $part_list ; do
LogPrint "PPC PReP Boot partition found: $part"
# Using $LAYOUT_DEPS file to find the disk device containing the partition.
@@ -29,14 +32,23 @@ if [ -n "$part" ]; then
# If yes, get the list of path which are part of the multipath device.
# Limit to the first 5 PATH (see #876)
if dmsetup ls --target multipath | grep -w ${bootdev#/dev/mapper/} >/dev/null 2>&1; then
- LogPrint "Limiting bootlist to 5 entries..."
- bootlist_path=$(dmsetup deps $bootdev -o devname | awk -F: '{gsub (" ",""); gsub("\\(","/dev/",$2) ; gsub("\\)"," ",$2) ; print $2}' | cut -d" " -f-5)
- LogPrint "Set LPAR bootlist to $bootlist_path"
- bootlist -m normal $bootlist_path
+ LogPrint "Limiting bootlist to 5 entries as a maximum..."
+ boot_list+=( $(dmsetup deps $bootdev -o devname | awk -F: '{gsub (" ",""); gsub("\\(","/dev/",$2) ; gsub("\\)"," ",$2) ; print $2}' | cut -d" " -f-5) )
else
# Single Path device found
- LogPrint "Set LPAR bootlist to $bootdev"
- bootlist -m normal $bootdev
+ boot_list+=( $bootdev )
fi
- LogIfError "Unable to set bootlist. You will have to start in SMS to set it up manually."
+done
+
+if [[ ${#boot_list[@]} -gt 5 ]]; then
+ LogPrint "Too many entries for bootlist command, limiting to first 5 entries..."
+ boot_list=( ${boot_list[@]:0:5} )
fi
+
+if [[ ${#boot_list[@]} -gt 0 ]]; then
+ LogPrint "Set LPAR bootlist to '${boot_list[*]}'"
+ bootlist -m normal "${boot_list[@]}"
+ LogPrintIfError "Unable to set bootlist. You will have to start in SMS to set it up manually."
+fi
+
+# vim: set et ts=4 sw=4:

View File

@ -0,0 +1,17 @@
diff -up rear-2.4/usr/share/rear/finalize/Fedora/i386/550_rebuild_initramfs.sh.sfdc02343208 rear-2.4/usr/share/rear/finalize/Fedora/i386/550_rebuild_initramfs.sh
--- rear-2.4/usr/share/rear/finalize/Fedora/i386/550_rebuild_initramfs.sh.sfdc02343208 2019-04-09 09:14:05.000000000 +0200
+++ rear-2.4/usr/share/rear/finalize/Fedora/i386/550_rebuild_initramfs.sh 2019-04-09 09:14:53.000000000 +0200
@@ -65,6 +65,7 @@ WITH_INITRD_MODULES=$( printf '%s\n' ${I
mount -t proc none $TARGET_FS_ROOT/proc
mount -t sysfs none $TARGET_FS_ROOT/sys
+mount -o bind /run $TARGET_FS_ROOT/run
# Recreate any initrd or initramfs image under $TARGET_FS_ROOT/boot/ with new drivers
# Images ignored:
@@ -109,4 +110,4 @@ and decide yourself, whether the system
fi
done
-umount $TARGET_FS_ROOT/proc $TARGET_FS_ROOT/sys
+umount $TARGET_FS_ROOT/proc $TARGET_FS_ROOT/sys $TARGET_FS_ROOT/run

318
SPECS/rear.spec Normal file
View File

@ -0,0 +1,318 @@
%define debug_package %{nil}
Summary: Relax-and-Recover is a Linux disaster recovery and system migration tool
Name: rear
Version: 2.4
Release: 12%{?dist}
License: GPLv3
Group: Applications/File
URL: http://relax-and-recover.org/
Source0: https://github.com/rear/rear/archive/%{version}.tar.gz#/rear-%{version}.tar.gz
Patch4: rear-bz1492177-warning.patch
Patch6: rear-rhbz1610638.patch
Patch7: rear-rhbz1610647.patch
Patch8: rear-bz1652828-bz1652853.patch
Patch9: rear-bz1631183.patch
Patch10: rear-bz1639705.patch
Patch11: rear-bz1653214.patch
Patch12: rear-bz1659137.patch
patch13: rear-bz1663515.patch
Patch14: rear-bz1672938.patch
Patch15: rear-bz1685166.patch
Patch16: rear-bz1655956.patch
Patch17: rear-bz1732328.patch
Patch18: rear-bz1726982.patch
Patch19: rear-bz1693608.patch
Patch20: rear-bz1700807.patch
Patch21: rear-bz1711123.patch
Patch22: rear-bz1692575.patch
Patch23: rear-sfdc02343208.patch
Patch24: rear-bz1737042.patch
ExcludeArch: s390x
ExcludeArch: s390
### Dependencies on all distributions
BuildRequires: asciidoc
Requires: binutils
Requires: ethtool
Requires: gzip
Requires: iputils
Requires: parted
Requires: tar
Requires: openssl
Requires: gawk
Requires: attr
Requires: bc
### If you require NFS, you may need the below packages
#Requires: nfsclient portmap rpcbind
### We drop LSB requirements because it pulls in too many dependencies
### The OS is hardcoded in /etc/rear/os.conf instead
#Requires: redhat-lsb
### Required for Bacula/MySQL support
#Requires: bacula-mysql
### Required for OBDR
#Requires: lsscsi sg3_utils
### Optional requirement
#Requires: cfg2html
%ifarch x86_64 i686
Requires: syslinux
%endif
%ifarch ppc ppc64
Requires: yaboot
%endif
Requires: crontabs
Requires: iproute
#Requires: mkisofs
Requires: xorriso
# mingetty is not available anymore with RHEL 7 (use agetty instead via systemd)
# Note that CentOS also has rhel defined so there is no need to use centos
%if 0%{?rhel} && 0%{?rhel} > 6
Requires: util-linux
%else
Requires: mingetty
Requires: util-linux
%endif
### The rear-snapshot package is no more
#Obsoletes: rear-snapshot
%description
Relax-and-Recover is the leading Open Source disaster recovery and system
migration solution. It comprises of a modular
frame-work and ready-to-go workflows for many common situations to produce
a bootable image and restore from backup using this image. As a benefit,
it allows to restore to different hardware and can therefore be used as
a migration tool as well.
Currently Relax-and-Recover supports various boot media (incl. ISO, PXE,
OBDR tape, USB or eSATA storage), a variety of network protocols (incl.
sftp, ftp, http, nfs, cifs) as well as a multitude of backup strategies
(incl. IBM TSM, HP DataProtector, Symantec NetBackup, EMC NetWorker,
Bacula, Bareos, BORG, Duplicity, rsync).
Relax-and-Recover was designed to be easy to set up, requires no maintenance
and is there to assist when disaster strikes. Its setup-and-forget nature
removes any excuse for not having a disaster recovery solution implemented.
Professional services and support are available.
%pre
if [ $1 -gt 1 ] ; then
# during upgrade remove obsolete directories
%{__rm} -rf %{_datadir}/rear/output/NETFS
fi
%prep
%setup
%patch4 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
%patch16 -p1
%patch17 -p1
%patch18 -p1
%patch19 -p1
%patch20 -p1
%patch21 -p1
%patch22 -p1
%patch23 -p1
%patch24 -p1
echo "30 1 * * * root /usr/sbin/rear checklayout || /usr/sbin/rear mkrescue" >rear.cron
### Add a specific os.conf so we do not depend on LSB dependencies
%{?fedora:echo -e "OS_VENDOR=Fedora\nOS_VERSION=%{?fedora}" >etc/rear/os.conf}
%{?rhel:echo -e "OS_VENDOR=RedHatEnterpriseServer\nOS_VERSION=%{?rhel}" >etc/rear/os.conf}
%build
# asciidoc writes a timestamp to files it produces, based on the last
# modified date of the source file, but is sensible to the timezone.
# This makes the results differ according to the timezone of the build machine
# and spurious changes will be seen.
# Set the timezone to UTC as a workaround.
# https://wiki.debian.org/ReproducibleBuilds/TimestampsInDocumentationGeneratedByAsciidoc
TZ=UTC %{__make} -C doc
%install
%{__rm} -rf %{buildroot}
%{__make} install DESTDIR="%{buildroot}"
%{__install} -Dp -m0644 rear.cron %{buildroot}%{_sysconfdir}/cron.d/rear
%files
%defattr(-, root, root, 0755)
%doc MAINTAINERS COPYING README.adoc doc/*.txt doc/user-guide/relax-and-recover-user-guide.html
%doc %{_mandir}/man8/rear.8*
%config(noreplace) %{_sysconfdir}/cron.d/rear
%config(noreplace) %{_sysconfdir}/rear/
%config(noreplace) %{_sysconfdir}/rear/cert/
%{_datadir}/rear/
%{_localstatedir}/lib/rear/
%{_sbindir}/rear
%changelog
* Mon Dec 16 2019 Pavel Cahyna <pcahyna@redhat.com> - 2.4-12
- Backport upstream PR #2293 to use grub-mkstandalone instead of
grub-mkimage for UEFI (ISO image and GRUB_RESCUE image generation).
Avoids hardcoded module lists or paths and so is more robust.
Fixes an issue where the generated ISO image had no GRUB2 modules and
was therefore unbootable. The backport does not add new config settings.
Resolves: rhbz1737042
* Mon Nov 18 2019 Pavel Cahyna <pcahyna@redhat.com> - 2.4-11
- Apply upstream PR2122: add additional NBU library path to fix support for
NetBackup 8.
Resolves: rhbz1747393
- Apply upstream PR2021: Be safe against empty docker_root_dir (issue 1989)
Resolves: rhbz1729493, where ReaR can not create a backup in rescue mode,
because it thinks that the Docker daemon is running and hits the problem
with empty docker_root_dir.
- Apply upstream PR2223 and commit 36cf20e to avoid an empty string in the
list of users to clone, which can lead to bash overflow with lots of users
and groups per user and to wrong passwd/group files in the rescue system.
Resolves: rhbz1729495
- Backport of Upstream fix for issue 2035: /run is not mounted in the rescue
chroot, which causes LVM to hang, especially if rebuilding initramfs.
Resolves: rhbz1757488
- Backport upstream PR 2218: avoid keeping build dir on errors
by default when used noninteractively
Resolves: rhbz1729501
- Apply upstream PR2173 - Cannot restore using Bacula method
due to "bconsole" not showing its prompt
Resolves: rhbz1726992
- Backport fix for upstream issue 2187 (disklayout.conf file contains
duplicate lines, breaking recovery in migration mode or when
thin pools are used). PR2194, 2196.
Resolves: rhbz1732308
* Tue Jun 4 2019 Pavel Cahyna <pcahyna@redhat.com> - 2.4-10
- Apply upstream patch PR1993
Automatically exclude $BUILD_DIR from the backup
Resolves: rhbz1677733
* Mon Jun 3 2019 Pavel Cahyna <pcahyna@redhat.com> - 2.4-9
- Update fix for bz#1657725. Previous fix was not correct, bootlist was still
invoked only with one partition argument due to incorrect array expansion.
See upstream PR2096, 2097, 2098.
* Tue May 28 2019 Pavel Cahyna <pcahyna@redhat.com> - 2.4-8
- Apply upstream PR2065 (record permanent MAC address for team members)
Resolves: rhbz1685178
* Tue May 28 2019 Pavel Cahyna <pcahyna@redhat.com> - 2.4-7
- Apply upstream PR2034 (multipath optimizations for lots of devices)
* Mon Jan 14 2019 Pavel Cahyna <pcahyna@redhat.com> - 2.4-6
- Require xorriso instead of genisoimage, it is now the preferred method
and supports files over 4GB in size.
- Apply upstream PR2004 (support for custom network interface naming)
- Backport upstream PR2001 (UEFI support broken on Fedora 29 and RHEL 8)
* Thu Dec 13 2018 Pavel Cahyna <pcahyna@redhat.com> - 2.4-4
- Backport fixes for upstream bugs 1974 and 1975
- Backport fix for upstream bug 1913 (backup succeeds in case of tar error)
- Backport fix for upstream bug 1926 (support for LACP bonding and teaming)
- Apply upstream PR1954 (record permanent MAC address for bond members)
* Thu Aug 09 2018 Pavel Cahyna <pcahyna@redhat.com> - 2.4-3
- Merge some spec changes from Fedora.
- Apply upstream patch PR1887
LPAR/PPC64 bootlist is incorrectly set when having multiple 'prep' partitions
- Apply upstream patch PR1885
Partition information recorded is unexpected when disk has 4K block size
* Wed Jul 18 2018 Pavel Cahyna <pcahyna@redhat.com> - 2.4-2
- Build and install the HTML user guide. #1418459
* Wed Jun 27 2018 Pavel Cahyna <pcahyna@redhat.com> - 2.4-1
- Rebase to version 2.4, drop patches integrated upstream
Resolves #1534646 #1484051 #1498828 #1571266 #1496518
* Wed Feb 14 2018 Pavel Cahyna <pcahyna@redhat.com> - 2.00-6
- Ensure that NetBackup is started automatically upon recovery (PR#1544)
Also do not kill daemons spawned by sysinit.service at the service's end
(PR#1610, applies to NetBackup and also to dhclient)
Resolves #1506231
- Print a warning if grub2-mkimage is about to fail and suggest what to do.
bz#1492177
- Update the patch for #1388653 to the one actually merged upstream (PR1418)
* Fri Jan 12 2018 Pavel Cahyna <pcahyna@redhat.com> - 2.00-5
- cd to the correct directory before md5sum to fix BACKUP_INTEGRITY_CHECK.
Upstream PR#1685, bz1532676
* Mon Oct 23 2017 Pavel Cahyna <pcahyna@redhat.com> - 2.00-4
- Retry get_disk_size to fix upstream #1370, bz1388653
* Wed Sep 13 2017 Pavel Cahyna <pcahyna@redhat.com> - 2.00-3
- Fix rear mkrescue on systems w/o UEFI. Upstream PR#1481 issue#1478
- Resolves: #1479002
* Wed May 17 2017 Jakub Mazanek <jmazanek@redhat.com> - 2.00-2
- Excluding Archs s390 and s390x
- Related #1355667
* Mon Feb 20 2017 Jakub Mazanek <jmazanek@redhat.com> - 2.00-1
- Rebase to version 2.00
- Resolves #1355667
* Tue Jul 19 2016 Petr Hracek <phracek@redhat.com> - 1.17.2-6
- Replace experimental grep -P with grep -E
Resolves: #1290205
* Wed Mar 23 2016 Petr Hracek <phracek@redhat.com> - 1.17.2-5
- Remove backuped patched files
Related: #1283930
* Wed Mar 23 2016 Petr Hracek <phracek@redhat.com> - 1.17.2-4
- Rear recovery over teaming interface will not work
Resolves: #1283930
* Tue Mar 08 2016 Petr Hracek <phracek@redhat.com> - 1.17.2-3
- Replace experimental grep -P with grep -E
Resolves: #1290205
* Tue Feb 23 2016 Petr Hracek <phracek@redhat.com> - 1.17.2-2
- rear does not require syslinux
- changing to arch package so that syslinux is installed
- Resolves: #1283927
* Mon Sep 14 2015 Petr Hracek <phracek@redhat.com> - 1.17.2-1
- New upstream release 1.17.2
Related: #1059196
* Wed May 13 2015 Petr Hracek <phracek@redhat.com> 1.17.0-2
- Fix Source tag
Related: #1059196
* Mon May 04 2015 Petr Hracek <phracek@redhat.com> 1.17.0-1
- Initial package for RHEL 7
Resolves: #1059196
* Fri Oct 17 2014 Gratien D'haese <gratien.dhaese@gmail.com>
- added the suse_version lines to identify the corresponding OS_VERSION
* Fri Jun 20 2014 Gratien D'haese <gratien.dhaese@gmail.com>
- add %%pre section
* Thu Apr 11 2013 Gratien D'haese <gratien.dhaese@gmail.com>
- changes Source
* Thu Jun 03 2010 Dag Wieers <dag@wieers.com>
- Initial package. (using DAR)