Auto sync2gitlab import of rear-2.6-4.el8.src.rpm
This commit is contained in:
parent
db6e34dcaa
commit
5ebf128954
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/rear-2.6.tar.gz
|
584
rear-asciidoc.patch
Normal file
584
rear-asciidoc.patch
Normal file
@ -0,0 +1,584 @@
|
||||
diff --git a/doc/user-guide/12-BLOCKCLONE.adoc b/doc/user-guide/12-BLOCKCLONE.adoc
|
||||
index 061f0f49..2d4e0ed1 100644
|
||||
--- a/doc/user-guide/12-BLOCKCLONE.adoc
|
||||
+++ b/doc/user-guide/12-BLOCKCLONE.adoc
|
||||
@@ -40,17 +40,17 @@ First we need to set some global options in _local.conf_,
|
||||
In our small example backups will be stored in _/mnt/rear_ directory
|
||||
on BACKUP_URL NFS server.
|
||||
|
||||
-```
|
||||
+--------------------------
|
||||
# cat local.conf
|
||||
OUTPUT=ISO
|
||||
BACKUP=NETFS
|
||||
BACKUP_OPTIONS="nfsvers=3,nolock"
|
||||
BACKUP_URL=nfs://<hostname>/mnt/rear
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Now we will define variables that will apply only for targeted block device
|
||||
|
||||
-```
|
||||
+--------------------------
|
||||
# cat alien.conf
|
||||
BACKUP=BLOCKCLONE # Define BLOCKCLONE as backup method
|
||||
BACKUP_PROG_ARCHIVE="alien" # Name of image file
|
||||
@@ -66,16 +66,16 @@ BLOCKCLONE_MBR_FILE="alien_boot_strap.img" # Output filename for b
|
||||
BLOCKCLONE_PARTITIONS_CONF_FILE="alien_partitions.conf" # Output filename for partition configuration
|
||||
|
||||
BLOCKCLONE_ALLOW_MOUNTED="yes" # Device can be mounted during backup (default NO)
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
==== Running backup
|
||||
Save partitions configuration, bootstrap code and create actual backup of /dev/sdc1
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C alien mkbackuponly
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
==== Running restore from ReaR restore/recovery system
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C alien restoreonly
|
||||
Restore alien.dd.img to device: [/dev/sdc1] # User is always prompted for restore destination
|
||||
Device /dev/sdc1 was not found. # If destination does not exist ReaR will try to create it (or fail if BLOCKCLONE_SAVE_MBR_DEV was not set during backup)
|
||||
@@ -102,7 +102,7 @@ Device Boot Start End Sectors Size Id Type
|
||||
The partition table has been altered.
|
||||
Calling ioctl() to re-read partition table.
|
||||
Syncing disks.
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
==== Summary
|
||||
In first example we have run backup of /dev/sdc1 partition and stored it on NFS
|
||||
@@ -127,37 +127,37 @@ In next example we will do backup/restore using BLOCKCLONE and `ntfsclone`
|
||||
of Linux (installed on /dev/sda) and Windows 10 (installed on /dev/sdb).
|
||||
|
||||
TIP: You can locate right disk devices using `df` and `os-prober`
|
||||
-```
|
||||
+--------------------------
|
||||
# df -h /boot
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
/dev/sda1 10G 4.9G 5.2G 49% / # Linux is most probably installed on /dev/sda
|
||||
|
||||
# os-prober
|
||||
/dev/sdb1:Windows 10 (loader):Windows:chain # Windows 10 is most probably installed on /dev/sdb
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
First we will configure some ReaR backup global options
|
||||
(similar to link:12-BLOCKCLONE.adoc#1-backuprestore-of-arbitrary-block-device-with-blockclone-and-dd-on-nfs-server[first example]
|
||||
we will do backup/restore with help of NFS server).
|
||||
|
||||
-```
|
||||
+--------------------------
|
||||
# cat local.conf
|
||||
OUTPUT=ISO
|
||||
BACKUP=NETFS
|
||||
BACKUP_OPTIONS="nfsvers=3,nolock"
|
||||
BACKUP_URL=nfs://<hostname>/mnt/rear
|
||||
REQUIRED_PROGS+=( ntfsclone )
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Now we will define backup parameters for Linux.
|
||||
|
||||
-```
|
||||
+--------------------------
|
||||
# cat base_os.conf
|
||||
this_file_name=$( basename ${BASH_SOURCE[0]} )
|
||||
LOGFILE="$LOG_DIR/rear-$HOSTNAME-$WORKFLOW-${this_file_name%.*}.log"
|
||||
BACKUP_PROG_ARCHIVE="backup-${this_file_name%.*}"
|
||||
BACKUP_PROG_EXCLUDE+=( '/media/*' )
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Our Windows 10 is by default installed on two separate partitions
|
||||
(partition 1 for boot data and partition 2 for disk C:),
|
||||
@@ -165,7 +165,7 @@ Our Windows 10 is by default installed on two separate partitions
|
||||
|
||||
Windows boot partition:
|
||||
|
||||
-```
|
||||
+--------------------------
|
||||
# cat windows_boot.conf
|
||||
BACKUP=BLOCKCLONE
|
||||
BACKUP_PROG_ARCHIVE="windows_boot"
|
||||
@@ -179,10 +179,10 @@ BLOCKCLONE_PROG_OPTS="--quiet"
|
||||
BLOCKCLONE_SAVE_MBR_DEV="/dev/sdb"
|
||||
BLOCKCLONE_MBR_FILE="windows_boot_strap.img"
|
||||
BLOCKCLONE_PARTITIONS_CONF_FILE="windows_partitions.conf"
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Windows data partition (disk C:\):
|
||||
-```
|
||||
+--------------------------
|
||||
# cat windows_data.conf
|
||||
BACKUP=BLOCKCLONE
|
||||
BACKUP_PROG_ARCHIVE="windows_data"
|
||||
@@ -196,35 +196,35 @@ BLOCKCLONE_PROG_OPTS="--quiet"
|
||||
BLOCKCLONE_SAVE_MBR_DEV="/dev/sdb"
|
||||
BLOCKCLONE_MBR_FILE="windows_boot_strap.img"
|
||||
BLOCKCLONE_PARTITIONS_CONF_FILE="windows_partitions.conf"
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
==== Running backup
|
||||
First we will create backup of Linux. `mkbackup` command will create bootable
|
||||
ISO image with ReaR rescue/recovery system that will be later used for
|
||||
booting broken system and consecutive recovery.
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C base_os mkbackup
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Now we create backup of Windows 10 boot partition. Command `mkbackuponly`
|
||||
will ensure that only partition data and partition layout will be saved
|
||||
(ReaR rescue/recovery system will not be created which is exactly what we want).
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C windows_boot mkbackuponly
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Similarly, we create backup of Windows 10 data partition (disk C:\)
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C windows_data mkbackuponly
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
==== Running restore from ReaR restore/recovery system
|
||||
As a first step after ReaR rescue/recovery system booted,
|
||||
we will recover Linux. This step will recover all Linux file systems,
|
||||
OS data and bootloader. Windows disk will remain untouched.
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C base_os recover
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
In second step will recover Windows 10 boot partition. During this step ReaR
|
||||
will detect that destination partition is not present and ask us for device
|
||||
@@ -234,25 +234,25 @@ In second step will recover Windows 10 boot partition. During this step ReaR
|
||||
partition(s) configuration (currently mounted under _/mnt/local_) will
|
||||
remain untouched. Before starting Windows 10 recovery we should identify
|
||||
right disk for recovery, as mentioned earlier disk size could be a good start.
|
||||
-```
|
||||
+--------------------------
|
||||
# fdisk -l /dev/sdb
|
||||
Disk /dev/sdb: 50 GiB, 53687091200 bytes, 104857600 sectors
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
_/dev/sdb_ looks to be right destination, so we can proceed with restore.
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C windows_boot restoreonly
|
||||
Restore windows_boot.img to device: [/dev/sdb1]
|
||||
Device /dev/sdb1 was not found.
|
||||
Restore partition layout to (^c to abort): [/dev/sdb]
|
||||
Checking that no-one is using this disk right now ... OK
|
||||
...
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Last step is to recover Windows 10 OS data (C:\).
|
||||
Partitions on _/dev/sdb_ were already created in previous step,
|
||||
hence ReaR will skip prompt for restoring partition layout.
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C windows_data restoreonly
|
||||
Restore windows_data.img to device: [/dev/sdb2]
|
||||
Ntfsclone image version: 10.1
|
||||
@@ -263,7 +263,7 @@ Space in use : 9396 MB (27.8%)
|
||||
Offset to image data : 56 (0x38) bytes
|
||||
Restoring NTFS from image ...
|
||||
...
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
At this stage Linux together with Windows 10 is successfully restored.
|
||||
|
||||
@@ -286,7 +286,7 @@ In this example we will do backup/restore using BLOCKCLONE and `ntfsclone`
|
||||
Backups will be stored on NFS server.
|
||||
|
||||
First we set global ReaR options
|
||||
-```
|
||||
+--------------------------
|
||||
# cat local.conf
|
||||
OUTPUT=ISO
|
||||
BACKUP=NETFS
|
||||
@@ -300,23 +300,23 @@ BLOCKCLONE_SAVE_MBR_DEV="/dev/sda"
|
||||
BLOCKCLONE_MBR_FILE="boot_strap.img"
|
||||
BLOCKCLONE_PARTITIONS_CONF_FILE="partitions.conf"
|
||||
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
IMPORTANT: BLOCKCLONE_STRICT_PARTITIONING is mandatory if backing up
|
||||
Linux / Windows that shares one disk. Not using this option might result to
|
||||
unbootable Windows 10 installation.
|
||||
|
||||
Linux configuration
|
||||
-```
|
||||
+--------------------------
|
||||
# cat base_os.conf
|
||||
this_file_name=$( basename ${BASH_SOURCE[0]} )
|
||||
LOGFILE="$LOG_DIR/rear-$HOSTNAME-$WORKFLOW-${this_file_name%.*}.log"
|
||||
BACKUP_PROG_ARCHIVE="backup-${this_file_name%.*}"
|
||||
BACKUP_PROG_EXCLUDE+=( '/media/*' )
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Windows 10 boot partition configuration
|
||||
-```
|
||||
+--------------------------
|
||||
# cat windows_boot.conf
|
||||
BACKUP=BLOCKCLONE
|
||||
|
||||
@@ -328,10 +328,10 @@ BLOCKCLONE_PROG=ntfsclone
|
||||
BLOCKCLONE_PROG_OPTS="--quiet"
|
||||
|
||||
BLOCKCLONE_SOURCE_DEV="/dev/sda1"
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Windows 10 data partition configuration
|
||||
-```
|
||||
+--------------------------
|
||||
# cat windows_data.conf
|
||||
BACKUP=BLOCKCLONE
|
||||
BACKUP_PROG_ARCHIVE="windows_data"
|
||||
@@ -342,42 +342,42 @@ BLOCKCLONE_PROG=ntfsclone
|
||||
BLOCKCLONE_PROG_OPTS="--quiet"
|
||||
|
||||
BLOCKCLONE_SOURCE_DEV="/dev/sda2"
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
==== Running backup
|
||||
|
||||
Backup of Linux
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C base_os mkbackup
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Backup of Windows 10 boot partition
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C windows_boot mkbackuponly
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Backup of Windows 10 data partition
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C windows_data mkbackuponly
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
==== Running restore from ReaR restore/recovery system
|
||||
Restore Linux
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C base_os recover
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
During this step ReaR will also create both Windows 10 partitions
|
||||
|
||||
Restore Windows 10 data partition
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C windows_data restoreonly
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Restore Windows 10 boot partition
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C windows_boot restoreonly
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
=== 4. Backup/restore of Linux / Windows 10 dual boot setup sharing same disk with USB as destination
|
||||
|
||||
@@ -389,7 +389,7 @@ In this example we will do backup/restore using BLOCKCLONE and `ntfsclone`
|
||||
Backups will be stored on USB disk drive (_/dev/sdb_ in this example).
|
||||
|
||||
Global options
|
||||
-```
|
||||
+--------------------------
|
||||
# cat local.conf
|
||||
OUTPUT=USB
|
||||
BACKUP=NETFS
|
||||
@@ -407,10 +407,10 @@ BLOCKCLONE_SAVE_MBR_DEV="/dev/sda"
|
||||
|
||||
BLOCKCLONE_MBR_FILE="boot_strap.img"
|
||||
BLOCKCLONE_PARTITIONS_CONF_FILE="partitions.conf"
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Options used during Linux backup/restore.
|
||||
-```
|
||||
+--------------------------
|
||||
# cat local.conf
|
||||
OUTPUT=USB
|
||||
BACKUP=NETFS
|
||||
@@ -428,14 +428,14 @@ BLOCKCLONE_SAVE_MBR_DEV="/dev/sda"
|
||||
|
||||
BLOCKCLONE_MBR_FILE="boot_strap.img"
|
||||
BLOCKCLONE_PARTITIONS_CONF_FILE="partitions.conf"
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
IMPORTANT: USB_SUFFIX option is mandatory as it avoids ReaR to hold every
|
||||
backup in separate directory, this behavior is essential for BLOCKCLONE
|
||||
backup method to work correctly.
|
||||
|
||||
Windows boot partition options
|
||||
-```
|
||||
+--------------------------
|
||||
# cat windows_boot.conf
|
||||
BACKUP=BLOCKCLONE
|
||||
|
||||
@@ -447,10 +447,10 @@ BLOCKCLONE_PROG=ntfsclone
|
||||
BLOCKCLONE_PROG_OPTS="--quiet"
|
||||
|
||||
BLOCKCLONE_SOURCE_DEV="/dev/sda1"
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Windows data partition options
|
||||
-```
|
||||
+--------------------------
|
||||
# cat windows_data.conf
|
||||
BACKUP=BLOCKCLONE
|
||||
BACKUP_PROG_ARCHIVE="windows_data"
|
||||
@@ -461,11 +461,11 @@ BLOCKCLONE_PROG=ntfsclone
|
||||
BLOCKCLONE_PROG_OPTS="--quiet"
|
||||
|
||||
BLOCKCLONE_SOURCE_DEV="/dev/sda2"
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
==== Running backup
|
||||
First we need to format target USB device, with `rear format` command
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -v format /dev/sdb
|
||||
Relax-and-Recover 2.00 / Git
|
||||
Using log file: /var/log/rear/rear-centosd.log
|
||||
@@ -477,15 +477,15 @@ Creating ReaR data partition up to 100% of '/dev/sdb'
|
||||
Setting 'boot' flag on /dev/sdb
|
||||
Creating ext3 filesystem with label 'REAR-000' on '/dev/sdb1'
|
||||
Adjusting filesystem parameters on '/dev/sdb1'
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Backup of Linux
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C base_os mkbackup
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Backup of Windows 10 boot partition
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C windows_boot mkbackuponly
|
||||
NTFS volume version: 3.1
|
||||
Cluster size : 4096 bytes
|
||||
@@ -496,10 +496,10 @@ Accounting clusters ...
|
||||
Space in use : 338 MB (64.4%)
|
||||
Saving NTFS to image ...
|
||||
Syncing ...
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Backup of Windows 10 data partition
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C windows_data mkbackuponly
|
||||
NTFS volume version: 3.1
|
||||
Cluster size : 4096 bytes
|
||||
@@ -510,7 +510,7 @@ Accounting clusters ...
|
||||
Space in use : 9833 MB (54.3%)
|
||||
Saving NTFS to image ...
|
||||
Syncing ...
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
==== Running restore from ReaR restore/recovery system
|
||||
For sake of this demonstration I've purposely used ReaR's rescue/recovery media
|
||||
@@ -519,7 +519,7 @@ For sake of this demonstration I've purposely used ReaR's rescue/recovery media
|
||||
demonstrate possibility of ReaR to recover backup to arbitrary disk. +
|
||||
As first step Linux will be restored, this will create all the partitions
|
||||
needed, even those used by Windows 10.
|
||||
-```
|
||||
+--------------------------
|
||||
RESCUE centosd:~ # rear -C base_os recover
|
||||
Relax-and-Recover 2.00 / Git
|
||||
Using log file: /var/log/rear/rear-centosd.log
|
||||
@@ -541,13 +541,13 @@ Original disk /dev/sda does not exist in the target system. Please choose an app
|
||||
2) /dev/sdb
|
||||
3) Do not map disk.
|
||||
#?
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Now ReaR recover command stops as it detected that disk layout is not identical.
|
||||
As our desired restore target is _/dev/sdb_ we choose right disk and continue
|
||||
recovery. ReaR will ask to check created restore scripts, but this is not
|
||||
needed in our scenario.
|
||||
-```
|
||||
+--------------------------
|
||||
#? 2
|
||||
2017-01-25 20:54:01 Disk /dev/sdb chosen as replacement for /dev/sda.
|
||||
Disk /dev/sdb chosen as replacement for /dev/sda.
|
||||
@@ -607,11 +607,11 @@ Skip installing GRUB Legacy boot loader because GRUB 2 is installed (grub-probe
|
||||
Installing GRUB2 boot loader
|
||||
Finished recovering your system. You can explore it under '/mnt/local'.
|
||||
Saving /var/log/rear/rear-centosd.log as /var/log/rear/rear-centosd-recover-base_os.log
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Now we have Linux part restored, GRUB installed and partitions created, hence
|
||||
we can continue with Windows 10 boot partition recovery.
|
||||
-```
|
||||
+--------------------------
|
||||
RESCUE centosd:~ # rear -C windows_boot restoreonly
|
||||
Restore windows_boot.nc.img to device: [/dev/sda1] /dev/sdb1
|
||||
Ntfsclone image version: 10.1
|
||||
@@ -622,12 +622,12 @@ Space in use : 338 MB (64.4%)
|
||||
Offset to image data : 56 (0x38) bytes
|
||||
Restoring NTFS from image ...
|
||||
Syncing ...
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Similarly to Linux restore, we were prompted for restore destination, which
|
||||
is /dev/sdb1 in our case. +
|
||||
As the last step we will recover Windows 10 data partition
|
||||
-```
|
||||
+--------------------------
|
||||
RESCUE centosd:~ # rear -C windows_data restoreonly
|
||||
Restore windows_data.nc.img to device: [/dev/sda2] /dev/sdb2
|
||||
Ntfsclone image version: 10.1
|
||||
@@ -638,7 +638,7 @@ Space in use : 9867 MB (54.5%)
|
||||
Offset to image data : 56 (0x38) bytes
|
||||
Restoring NTFS from image ...
|
||||
Syncing ...
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Again after restoreonly command is launched, ReaR prompts for restore
|
||||
destination. +
|
||||
@@ -662,25 +662,25 @@ The _BLOCKCLONE_TRY_UNMOUNT_ is important here: it will attempt to unmount the
|
||||
run the risk that the data may be inconsistent.
|
||||
|
||||
Global options
|
||||
-```
|
||||
+--------------------------
|
||||
# cat site.conf
|
||||
OUTPUT=ISO
|
||||
KEEP_OLD_OUTPUT_COPY=1
|
||||
BACKUP_URL="nfs://<hostname>/Stations_bkup/rear/"
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Options used for the base OS backup:
|
||||
-```
|
||||
+--------------------------
|
||||
# cat base_system.conf
|
||||
this_file_name=$( basename ${BASH_SOURCE[0]} )
|
||||
LOGFILE="$LOG_DIR/rear-$HOSTNAME-$WORKFLOW-${this_file_name%.*}.log"
|
||||
BACKUP_PROG_EXCLUDE+=( '/products/*' )
|
||||
BACKUP_PROG_ARCHIVE="backup-${this_file_name%.*}"
|
||||
BACKUP=NETFS
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Options used to take the encrypted filesystem image:
|
||||
-```
|
||||
+--------------------------
|
||||
this_file_name=$( basename ${BASH_SOURCE[0]} )
|
||||
LOGFILE="$LOG_DIR/rear-$HOSTNAME-$WORKFLOW-${this_file_name%.*}.log"
|
||||
BACKUP=BLOCKCLONE
|
||||
@@ -694,18 +694,18 @@ BLOCKCLONE_SOURCE_DEV="/dev/vg00/lvol4"
|
||||
|
||||
BLOCKCLONE_ALLOW_MOUNTED="yes"
|
||||
BLOCKCLONE_TRY_UNMOUNT="yes"
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
==== Running backup
|
||||
Base OS backup:
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C base_system mkbackup
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Create image of encrypted filesystem:
|
||||
-```
|
||||
+--------------------------
|
||||
# rear -C products_backup mkbackuponly
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
==== Running restore from ReaR restore/recovery system
|
||||
First recover the base OS. This will create all the partitions needed, including
|
||||
@@ -713,7 +713,7 @@ First recover the base OS. This will create all the partitions needed, including
|
||||
As illustrated below, you will be prompted to chose a new encryption passphrase.
|
||||
Please provide one, but you need not care about its value as it will get overwritten
|
||||
during the next phase:
|
||||
-```
|
||||
+--------------------------
|
||||
RESCUE pc-pan:~ # rear -C base_system.conf recover
|
||||
[...]
|
||||
Please enter the password for LUKS device cr_vg00-lvol4 (/dev/mapper/vg00-lvol4):
|
||||
@@ -724,7 +724,7 @@ Creating filesystem of type xfs with mount point /products on /dev/mapper/cr_vg0
|
||||
Mounting filesystem /products
|
||||
Disk layout created.
|
||||
[...]
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Now we can proceed and restore the encrypted filesystem image. The target filesystem
|
||||
will have been mounted by ReaR during the previous phase, but this will be
|
||||
@@ -732,12 +732,12 @@ Now we can proceed and restore the encrypted filesystem image. The target filesy
|
||||
to "yes". +
|
||||
As illustrated below, you will be prompted for the target block device to use.
|
||||
Confirm by pressing Enter or type in another value:
|
||||
-```
|
||||
+--------------------------
|
||||
RESCUE pc-pan:~ # rear -C products_backup.conf restoreonly
|
||||
[...]
|
||||
Restore backup-products_backup.dd.img to device: [/dev/vg00/lvol4]
|
||||
[...]
|
||||
-```
|
||||
+--------------------------
|
||||
|
||||
Please note that the target device will not be re-mounted by the script at the end
|
||||
of the restore phase. If needed, this should be done manually. +
|
||||
diff --git a/doc/user-guide/16-Rubrik-CDM.adoc b/doc/user-guide/16-Rubrik-CDM.adoc
|
||||
index 41f37d20..3ac23b7b 100644
|
||||
--- a/doc/user-guide/16-Rubrik-CDM.adoc
|
||||
+++ b/doc/user-guide/16-Rubrik-CDM.adoc
|
||||
@@ -84,7 +84,7 @@ To make CentOS v8.0 work the following line was needed:
|
||||
== Test Matrix
|
||||
|
||||
.Test Matrix
|
||||
-[%header,format=csv]
|
||||
+[options="header",format="csv"]
|
||||
|===
|
||||
Operating System,DHCP,Static IP,Virtual,Physical,LVM Root Disk,Plain Root Disk,EXT3,EXT4,XFS,BTRFS,Original Cluster,Replication Cluster
|
||||
CentOS 7.3,,pass,Pass,,Pass,,,,Pass,,Pass,
|
15
rear-bz1492177-warning.patch
Normal file
15
rear-bz1492177-warning.patch
Normal 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."
|
||||
+)
|
112
rear-bz1747468.patch
Normal file
112
rear-bz1747468.patch
Normal file
@ -0,0 +1,112 @@
|
||||
diff --git a/usr/share/rear/layout/prepare/GNU/Linux/110_include_lvm_code.sh b/usr/share/rear/layout/prepare/GNU/Linux/110_include_lvm_code.sh
|
||||
index 7cfdfcf2..1be17ba8 100644
|
||||
--- a/usr/share/rear/layout/prepare/GNU/Linux/110_include_lvm_code.sh
|
||||
+++ b/usr/share/rear/layout/prepare/GNU/Linux/110_include_lvm_code.sh
|
||||
@@ -68,9 +68,9 @@ create_lvmgrp() {
|
||||
local vg=${vgrp#/dev/}
|
||||
|
||||
cat >> "$LAYOUT_CODE" <<EOF
|
||||
-create_volume_group=1
|
||||
-create_logical_volumes=1
|
||||
-create_thin_volumes_only=0
|
||||
+create_volume_group+=( "$vg" )
|
||||
+create_logical_volumes+=( "$vg" )
|
||||
+create_thin_volumes_only=( \$( RmInArray "$vg" "\${create_thin_volumes_only[@]}" ) )
|
||||
|
||||
EOF
|
||||
|
||||
@@ -83,7 +83,7 @@ EOF
|
||||
# '--mirrorlog', etc.
|
||||
# Also, we likely do not support every layout yet (e.g. 'cachepool').
|
||||
|
||||
- if ! is_true "$MIGRATION_MODE" ; then
|
||||
+ if ! is_true "$MIGRATION_MODE" && lvmgrp_supports_vgcfgrestore "$vgrp" ; then
|
||||
cat >> "$LAYOUT_CODE" <<EOF
|
||||
LogPrint "Restoring LVM VG '$vg'"
|
||||
if [ -e "$vgrp" ] ; then
|
||||
@@ -97,9 +97,12 @@ if lvm vgcfgrestore -f "$VAR_DIR/layout/lvm/${vg}.cfg" $vg >&2 ; then
|
||||
|
||||
LogPrint "Sleeping 3 seconds to let udev or systemd-udevd create their devices..."
|
||||
sleep 3 >&2
|
||||
- create_volume_group=0
|
||||
- create_logical_volumes=0
|
||||
+ create_volume_group=( \$( RmInArray "$vg" "\${create_volume_group[@]}" ) )
|
||||
+ create_logical_volumes=( \$( RmInArray "$vg" "\${create_logical_volumes[@]}" ) )
|
||||
|
||||
+EOF
|
||||
+ if is_true "${FORCE_VGCFGRESTORE-no}"; then
|
||||
+ cat >> "$LAYOUT_CODE" <<EOF
|
||||
#
|
||||
# It failed ... restore layout using 'vgcfgrestore --force', but then remove Thin volumes, they are broken
|
||||
#
|
||||
@@ -121,9 +124,12 @@ elif lvm vgcfgrestore --force -f "$VAR_DIR/layout/lvm/${vg}.cfg" $vg >&2 ; then
|
||||
sleep 3 >&2
|
||||
|
||||
# All logical volumes have been created, except Thin volumes and pools
|
||||
- create_volume_group=0
|
||||
- create_thin_volumes_only=1
|
||||
+ create_volume_group=( \$( RmInArray "$vg" "\${create_volume_group[@]}" ) )
|
||||
+ create_thin_volumes_only+=( "$vg" )
|
||||
|
||||
+EOF
|
||||
+ fi
|
||||
+ cat >> "$LAYOUT_CODE" <<EOF
|
||||
#
|
||||
# It failed also ... restore using 'vgcreate/lvcreate' commands
|
||||
#
|
||||
@@ -138,7 +144,7 @@ EOF
|
||||
local -a devices=($(awk "\$1 == \"lvmdev\" && \$2 == \"$vgrp\" { print \$3 }" "$LAYOUT_FILE"))
|
||||
|
||||
cat >> "$LAYOUT_CODE" <<EOF
|
||||
-if [ \$create_volume_group -eq 1 ] ; then
|
||||
+if IsInArray $vg "\${create_volume_group[@]}" ; then
|
||||
LogPrint "Creating LVM VG '$vg'; Warning: some properties may not be preserved..."
|
||||
if [ -e "$vgrp" ] ; then
|
||||
rm -rf "$vgrp"
|
||||
@@ -240,9 +246,9 @@ create_lvmvol() {
|
||||
local warnraidline
|
||||
|
||||
if [ $is_thin -eq 0 ] ; then
|
||||
- ifline="if [ \"\$create_logical_volumes\" -eq 1 ] && [ \"\$create_thin_volumes_only\" -eq 0 ] ; then"
|
||||
+ ifline="if IsInArray $vg \"\${create_logical_volumes[@]}\" && ! \$IsInArray $vg \"\${create_thin_volumes_only[@]}\" ; then"
|
||||
else
|
||||
- ifline="if [ \"\$create_logical_volumes\" -eq 1 ] ; then"
|
||||
+ ifline="if IsInArray $vg \"\${create_logical_volumes[@]}\" ; then"
|
||||
fi
|
||||
|
||||
if [ $is_raidunknown -eq 1 ]; then
|
||||
diff --git a/usr/share/rear/lib/layout-functions.sh b/usr/share/rear/lib/layout-functions.sh
|
||||
index 54ddb50f..ae62d666 100644
|
||||
--- a/usr/share/rear/lib/layout-functions.sh
|
||||
+++ b/usr/share/rear/lib/layout-functions.sh
|
||||
@@ -1308,4 +1308,30 @@ delete_dummy_partitions_and_resize_real_ones() {
|
||||
last_partition_number=0
|
||||
}
|
||||
|
||||
+# vgcfgrestore can properly restore only volume groups that do not use
|
||||
+# any kernel metadata. All volume types except linear and striped use
|
||||
+# kernel metadata.
|
||||
+# Check whether a VG (given as /dev/<vgname> in the first argument)
|
||||
+# doesn't contain any LVs that use kernel metadata.
|
||||
+# If the function returns true, we can safely use vgcfgrestore to restore the VG.
|
||||
+function lvmgrp_supports_vgcfgrestore() {
|
||||
+ if is_true "${FORCE_VGCFGRESTORE-no}"; then
|
||||
+ # If we are willing to use vgcfgrestore --force and then remove broken volumes,
|
||||
+ # then everything can be considered supported. Don't do it by default though.
|
||||
+ return 0
|
||||
+ fi
|
||||
+
|
||||
+ local lvmvol vgrp lvname size layout kval
|
||||
+
|
||||
+ local supported_layouts=("linear" "striped")
|
||||
+
|
||||
+ while read lvmvol vgrp lvname size layout kval; do
|
||||
+ [ "$vgrp" == "$1" ] || BugError "vgrp '$vgrp' != '$1'"
|
||||
+ if ! IsInArray $layout "${supported_layouts[@]}"; then
|
||||
+ LogPrint "Layout '$layout' of LV '$lvname' in VG '$vgrp' not supported by vgcfgrestore"
|
||||
+ return 1
|
||||
+ fi
|
||||
+ done < <(grep "^lvmvol $1 " "$LAYOUT_FILE")
|
||||
+}
|
||||
+
|
||||
# vim: set et ts=4 sw=4:
|
351
rear-bz1832394.patch
Normal file
351
rear-bz1832394.patch
Normal file
@ -0,0 +1,351 @@
|
||||
diff --git a/doc/user-guide/06-layout-configuration.adoc b/doc/user-guide/06-layout-configuration.adoc
|
||||
index f59384db..88ba0420 100644
|
||||
--- a/doc/user-guide/06-layout-configuration.adoc
|
||||
+++ b/doc/user-guide/06-layout-configuration.adoc
|
||||
@@ -630,7 +630,7 @@ lvmvol <volume_group> <name> <size(bytes)> <layout> [key:value ...]
|
||||
|
||||
=== LUKS Devices ===
|
||||
----------------------------------
|
||||
-crypt /dev/mapper/<name> <device> [cipher=<cipher>] [key_size=<key size>] [hash=<hash function>] [uuid=<uuid>] [keyfile=<keyfile>] [password=<password>]
|
||||
+crypt /dev/mapper/<name> <device> [type=<type>] [cipher=<cipher>] [key_size=<key size>] [hash=<hash function>] [uuid=<uuid>] [keyfile=<keyfile>] [password=<password>]
|
||||
----------------------------------
|
||||
|
||||
=== DRBD ===
|
||||
diff --git a/usr/share/rear/layout/prepare/GNU/Linux/160_include_luks_code.sh b/usr/share/rear/layout/prepare/GNU/Linux/160_include_luks_code.sh
|
||||
index 05279bc8..0c662f67 100644
|
||||
--- a/usr/share/rear/layout/prepare/GNU/Linux/160_include_luks_code.sh
|
||||
+++ b/usr/share/rear/layout/prepare/GNU/Linux/160_include_luks_code.sh
|
||||
@@ -1,35 +1,75 @@
|
||||
+
|
||||
# Code to recreate and/or open LUKS volumes.
|
||||
|
||||
create_crypt() {
|
||||
+ # See the create_device() function in lib/layout-functions.sh what "device type" means:
|
||||
+ local device_type="$1"
|
||||
+ if ! grep -q "^crypt $device_type " "$LAYOUT_FILE" ; then
|
||||
+ LogPrintError "Skip recreating LUKS volume $device_type (no 'crypt $device_type' entry in $LAYOUT_FILE)"
|
||||
+ # FIXME: The return code is ignored in the create_device() function in lib/layout-functions.sh:
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
local crypt target_device source_device options
|
||||
- read crypt target_device source_device options < <(grep "^crypt $1 " "$LAYOUT_FILE")
|
||||
+ local mapping_name option key value
|
||||
+ local cryptsetup_options="" keyfile="" password=""
|
||||
|
||||
- local target_name=${target_device#/dev/mapper/}
|
||||
+ read crypt target_device source_device options < <( grep "^crypt $device_type " "$LAYOUT_FILE" )
|
||||
+
|
||||
+ # Careful! One cannot 'test -b $source_device' here at the time when this code is run
|
||||
+ # because the source device is usually a disk partition block device like /dev/sda2
|
||||
+ # but disk partition block devices usually do not yet exist (in particular not on a new clean disk)
|
||||
+ # because partitions are actually created later when the diskrestore.sh script is run
|
||||
+ # but not here when this code is run which only generates the diskrestore.sh script:
|
||||
+ if ! test $source_device ; then
|
||||
+ LogPrintError "Skip recreating LUKS volume $device_type: No source device (see the 'crypt $device_type' entry in $LAYOUT_FILE)"
|
||||
+ # FIXME: The return code is ignored in the create_device() function in lib/layout-functions.sh:
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ mapping_name=${target_device#/dev/mapper/}
|
||||
+ if ! test $mapping_name ; then
|
||||
+ LogPrintError "Skip recreating LUKS volume $device_type on $source_device: No /dev/mapper/... mapping name (see the 'crypt $device_type' entry in $LAYOUT_FILE)"
|
||||
+ # FIXME: The return code is ignored in the create_device() function in lib/layout-functions.sh:
|
||||
+ return 1
|
||||
+ fi
|
||||
|
||||
- local cryptsetup_options="" keyfile="" password=""
|
||||
- local option key value
|
||||
for option in $options ; do
|
||||
- key=${option%=*}
|
||||
+ # $option is of the form keyword=value and
|
||||
+ # we assume keyword has no '=' character but value could be anything that may have a '=' character
|
||||
+ # so we split keyword=value at the leftmost '=' character so that
|
||||
+ # e.g. keyword=foo=bar gets split into key="keyword" and value="foo=bar":
|
||||
+ key=${option%%=*}
|
||||
value=${option#*=}
|
||||
-
|
||||
+ # The "cryptseup luksFormat" command does not require any of the type, cipher, key-size, hash, uuid option values
|
||||
+ # because if omitted a cryptseup default value is used so we treat those values as optional.
|
||||
+ # Using plain test to ensure the value is a single non empty and non blank word
|
||||
+ # without quoting because test " " would return zero exit code
|
||||
+ # cf. "Beware of the emptiness" in https://github.com/rear/rear/wiki/Coding-Style
|
||||
case "$key" in
|
||||
- cipher)
|
||||
- cryptsetup_options+=" --cipher $value"
|
||||
+ (type)
|
||||
+ test $value && cryptsetup_options+=" --type $value"
|
||||
+ ;;
|
||||
+ (cipher)
|
||||
+ test $value && cryptsetup_options+=" --cipher $value"
|
||||
+ ;;
|
||||
+ (key_size)
|
||||
+ test $value && cryptsetup_options+=" --key-size $value"
|
||||
;;
|
||||
- key_size)
|
||||
- cryptsetup_options+=" --key-size $value"
|
||||
+ (hash)
|
||||
+ test $value && cryptsetup_options+=" --hash $value"
|
||||
;;
|
||||
- hash)
|
||||
- cryptsetup_options+=" --hash $value"
|
||||
+ (uuid)
|
||||
+ test $value && cryptsetup_options+=" --uuid $value"
|
||||
;;
|
||||
- uuid)
|
||||
- cryptsetup_options+=" --uuid $value"
|
||||
+ (keyfile)
|
||||
+ test $value && keyfile=$value
|
||||
;;
|
||||
- keyfile)
|
||||
- keyfile=$value
|
||||
+ (password)
|
||||
+ test $value && password=$value
|
||||
;;
|
||||
- password)
|
||||
- password=$value
|
||||
+ (*)
|
||||
+ LogPrintError "Skipping unsupported LUKS cryptsetup option '$key' in 'crypt $target_device $source_device' entry in $LAYOUT_FILE"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
@@ -37,26 +77,25 @@ create_crypt() {
|
||||
cryptsetup_options+=" $LUKS_CRYPTSETUP_OPTIONS"
|
||||
|
||||
(
|
||||
- echo "Log \"Creating LUKS device $target_name on $source_device\""
|
||||
+ echo "LogPrint \"Creating LUKS volume $mapping_name on $source_device\""
|
||||
if [ -n "$keyfile" ] ; then
|
||||
# Assign a temporary keyfile at this stage so that original keyfiles do not leak onto the rescue medium.
|
||||
# The original keyfile will be restored from the backup and then re-assigned to the LUKS device in the
|
||||
# 'finalize' stage.
|
||||
# The scheme for generating a temporary keyfile path must be the same here and in the 'finalize' stage.
|
||||
- keyfile="${TMPDIR:-/tmp}/LUKS-keyfile-$target_name"
|
||||
+ keyfile="$TMP_DIR/LUKS-keyfile-$mapping_name"
|
||||
dd bs=512 count=4 if=/dev/urandom of="$keyfile"
|
||||
chmod u=rw,go=- "$keyfile"
|
||||
-
|
||||
echo "cryptsetup luksFormat --batch-mode $cryptsetup_options $source_device $keyfile"
|
||||
- echo "cryptsetup luksOpen --key-file $keyfile $source_device $target_name"
|
||||
+ echo "cryptsetup luksOpen --key-file $keyfile $source_device $mapping_name"
|
||||
elif [ -n "$password" ] ; then
|
||||
echo "echo \"$password\" | cryptsetup luksFormat --batch-mode $cryptsetup_options $source_device"
|
||||
- echo "echo \"$password\" | cryptsetup luksOpen $source_device $target_name"
|
||||
+ echo "echo \"$password\" | cryptsetup luksOpen $source_device $mapping_name"
|
||||
else
|
||||
- echo "LogPrint \"Please enter the password for LUKS device $target_name ($source_device):\""
|
||||
+ echo "LogUserOutput \"Set the password for LUKS volume $mapping_name (for 'cryptsetup luksFormat' on $source_device):\""
|
||||
echo "cryptsetup luksFormat --batch-mode $cryptsetup_options $source_device"
|
||||
- echo "LogPrint \"Please re-enter the password for LUKS device $target_name ($source_device):\""
|
||||
- echo "cryptsetup luksOpen $source_device $target_name"
|
||||
+ echo "LogUserOutput \"Enter the password for LUKS volume $mapping_name (for 'cryptsetup luksOpen' on $source_device):\""
|
||||
+ echo "cryptsetup luksOpen $source_device $mapping_name"
|
||||
fi
|
||||
echo ""
|
||||
) >> "$LAYOUT_CODE"
|
||||
@@ -64,38 +103,61 @@ create_crypt() {
|
||||
|
||||
# Function open_crypt() is meant to be used by the 'mountonly' workflow
|
||||
open_crypt() {
|
||||
+ # See the do_mount_device() function in lib/layout-functions.sh what "device type" means:
|
||||
+ local device_type="$1"
|
||||
+ if ! grep -q "^crypt $device_type " "$LAYOUT_FILE" ; then
|
||||
+ LogPrintError "Skip opening LUKS volume $device_type (no 'crypt $device_type' entry in $LAYOUT_FILE)"
|
||||
+ # FIXME: The return code is ignored in the do_mount_device() function in lib/layout-functions.sh:
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
local crypt target_device source_device options
|
||||
- read crypt target_device source_device options < <(grep "^crypt $1 " "$LAYOUT_FILE")
|
||||
+ local mapping_name option key value
|
||||
+ local cryptsetup_options="" keyfile="" password=""
|
||||
|
||||
- local target_name=${target_device#/dev/mapper/}
|
||||
+ read crypt target_device source_device options < <( grep "^crypt $device_type " "$LAYOUT_FILE" )
|
||||
+
|
||||
+ if ! test -b "$source_device" ; then
|
||||
+ LogPrintError "Skip opening LUKS volume $device_type on device '$source_device' that is no block device (see the 'crypt $device_type' entry in $LAYOUT_FILE)"
|
||||
+ # FIXME: The return code is ignored in the do_mount_device() function in lib/layout-functions.sh:
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ mapping_name=${target_device#/dev/mapper/}
|
||||
+ if ! test $mapping_name ; then
|
||||
+ LogPrintError "Skip opening LUKS volume $device_type on $source_device: No /dev/mapper/... mapping name (see the 'crypt $device_type' entry in $LAYOUT_FILE)"
|
||||
+ # FIXME: The return code is ignored in the do_mount_device() function in lib/layout-functions.sh:
|
||||
+ return 1
|
||||
+ fi
|
||||
|
||||
- local cryptsetup_options="" keyfile="" password=""
|
||||
- local option key value
|
||||
for option in $options ; do
|
||||
- key=${option%=*}
|
||||
+ # $option is of the form keyword=value and
|
||||
+ # we assume keyword has no '=' character but value could be anything that may have a '=' character
|
||||
+ # so we split keyword=value at the leftmost '=' character so that
|
||||
+ # e.g. keyword=foo=bar gets split into key="keyword" and value="foo=bar":
|
||||
+ key=${option%%=*}
|
||||
value=${option#*=}
|
||||
-
|
||||
case "$key" in
|
||||
- keyfile)
|
||||
- keyfile=$value
|
||||
+ (keyfile)
|
||||
+ test $value && keyfile=$value
|
||||
;;
|
||||
- password)
|
||||
- password=$value
|
||||
+ (password)
|
||||
+ test $value && password=$value
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
(
|
||||
- echo "Log \"Opening LUKS device $target_name on $source_device\""
|
||||
+ echo "LogPrint \"Opening LUKS volume $mapping_name on $source_device\""
|
||||
if [ -n "$keyfile" ] ; then
|
||||
# During a 'mountonly' workflow, the original keyfile is supposed to be
|
||||
# available at this point.
|
||||
- echo "cryptsetup luksOpen --key-file $keyfile $source_device $target_name"
|
||||
+ echo "cryptsetup luksOpen --key-file $keyfile $source_device $mapping_name"
|
||||
elif [ -n "$password" ] ; then
|
||||
- echo "echo \"$password\" | cryptsetup luksOpen $source_device $target_name"
|
||||
+ echo "echo \"$password\" | cryptsetup luksOpen $source_device $mapping_name"
|
||||
else
|
||||
- echo "LogPrint \"Please enter the password for LUKS device $target_name ($source_device):\""
|
||||
- echo "cryptsetup luksOpen $source_device $target_name"
|
||||
+ echo "LogUserOutput \"Enter the password for LUKS volume $mapping_name (for 'cryptsetup luksOpen' on $source_device):\""
|
||||
+ echo "cryptsetup luksOpen $source_device $mapping_name"
|
||||
fi
|
||||
echo ""
|
||||
) >> "$LAYOUT_CODE"
|
||||
diff --git a/usr/share/rear/layout/save/GNU/Linux/260_crypt_layout.sh b/usr/share/rear/layout/save/GNU/Linux/260_crypt_layout.sh
|
||||
index c1e1cfd5..afeabf6a 100644
|
||||
--- a/usr/share/rear/layout/save/GNU/Linux/260_crypt_layout.sh
|
||||
+++ b/usr/share/rear/layout/save/GNU/Linux/260_crypt_layout.sh
|
||||
@@ -9,6 +9,8 @@ Log "Saving Encrypted volumes."
|
||||
REQUIRED_PROGS+=( cryptsetup dmsetup )
|
||||
COPY_AS_IS+=( /usr/share/cracklib/\* /etc/security/pwquality.conf )
|
||||
|
||||
+local invalid_cryptsetup_option_value="no"
|
||||
+
|
||||
while read target_name junk ; do
|
||||
# find the target device we're mapping
|
||||
if ! [ -e /dev/mapper/$target_name ] ; then
|
||||
@@ -30,29 +32,96 @@ while read target_name junk ; do
|
||||
source_device="$(get_device_name ${slave##*/})"
|
||||
done
|
||||
|
||||
- if ! cryptsetup isLuks $source_device >/dev/null 2>&1; then
|
||||
+ if ! blkid -p -o export $source_device >$TMP_DIR/blkid.output ; then
|
||||
+ LogPrintError "Error: Cannot get attributes for $target_name ('blkid -p -o export $source_device' failed)"
|
||||
continue
|
||||
fi
|
||||
|
||||
- # gather crypt information
|
||||
- cipher=$(cryptsetup luksDump $source_device | grep "Cipher name" | sed -r 's/^.+:\s*(.+)$/\1/')
|
||||
- mode=$(cryptsetup luksDump $source_device | grep "Cipher mode" | cut -d: -f2- | awk '{printf("%s",$1)};')
|
||||
- key_size=$(cryptsetup luksDump $source_device | grep "MK bits" | sed -r 's/^.+:\s*(.+)$/\1/')
|
||||
- hash=$(cryptsetup luksDump $source_device | grep "Hash spec" | sed -r 's/^.+:\s*(.+)$/\1/')
|
||||
- uuid=$(cryptsetup luksDump $source_device | grep "UUID" | sed -r 's/^.+:\s*(.+)$/\1/')
|
||||
- keyfile_option=$([ -f /etc/crypttab ] && awk '$1 == "'"$target_name"'" && $3 != "none" && $3 != "-" && $3 != "" { print "keyfile=" $3; }' /etc/crypttab)
|
||||
+ if ! grep -q "TYPE=crypto_LUKS" $TMP_DIR/blkid.output ; then
|
||||
+ Log "Skipping $target_name (no 'TYPE=crypto_LUKS' in 'blkid -p -o export $source_device' output)"
|
||||
+ continue
|
||||
+ fi
|
||||
|
||||
- # LUKS version 2 is not yet suppported, see https://github.com/rear/rear/issues/2204
|
||||
- # When LUKS version 2 is used the above code fails at least to determine the hash value
|
||||
- # so we use an empty hash value as a simple test if gathering crypt information was successful:
|
||||
- test "$hash" || Error "No hash value for LUKS device '$target_name' at '$source_device' (only LUKS version 1 is supported)"
|
||||
+ # Detect LUKS version:
|
||||
+ # Remove all non-digits in particular to avoid leading or trailing spaces in the version string
|
||||
+ # cf. "Beware of the emptiness" in https://github.com/rear/rear/wiki/Coding-Style
|
||||
+ # that could happen if the blkid output contains "VERSION = 2" so that 'cut -d= -f2' results " 2".
|
||||
+ version=$( grep "VERSION" $TMP_DIR/blkid.output | cut -d= -f2 | tr -c -d '[:digit:]' )
|
||||
+ if ! test "$version" = "1" -o "$version" = "2" ; then
|
||||
+ LogPrintError "Error: Unsupported LUKS version for $target_name ('blkid -p -o export $source_device' shows 'VERSION=$version')"
|
||||
+ continue
|
||||
+ fi
|
||||
+ luks_type=luks$version
|
||||
|
||||
- echo "crypt /dev/mapper/$target_name $source_device cipher=$cipher-$mode key_size=$key_size hash=$hash uuid=$uuid $keyfile_option" >> $DISKLAYOUT_FILE
|
||||
-done < <( dmsetup ls --target crypt )
|
||||
+ # Gather crypt information:
|
||||
+ if ! cryptsetup luksDump $source_device >$TMP_DIR/cryptsetup.luksDump ; then
|
||||
+ LogPrintError "Error: Cannot get LUKS$version values for $target_name ('cryptsetup luksDump $source_device' failed)"
|
||||
+ continue
|
||||
+ fi
|
||||
+ uuid=$( grep "UUID" $TMP_DIR/cryptsetup.luksDump | sed -r 's/^.+:\s*(.+)$/\1/' )
|
||||
+ keyfile_option=$( [ -f /etc/crypttab ] && awk '$1 == "'"$target_name"'" && $3 != "none" && $3 != "-" && $3 != "" { print "keyfile=" $3; }' /etc/crypttab )
|
||||
+ if test $luks_type = "luks1" ; then
|
||||
+ cipher_name=$( grep "Cipher name" $TMP_DIR/cryptsetup.luksDump | sed -r 's/^.+:\s*(.+)$/\1/' )
|
||||
+ cipher_mode=$( grep "Cipher mode" $TMP_DIR/cryptsetup.luksDump | cut -d: -f2- | awk '{printf("%s",$1)};' )
|
||||
+ cipher=$cipher_name-$cipher_mode
|
||||
+ key_size=$( grep "MK bits" $TMP_DIR/cryptsetup.luksDump | sed -r 's/^.+:\s*(.+)$/\1/' )
|
||||
+ hash=$( grep "Hash spec" $TMP_DIR/cryptsetup.luksDump | sed -r 's/^.+:\s*(.+)$/\1/' )
|
||||
+ elif test $luks_type = "luks2" ; then
|
||||
+ cipher=$( grep "cipher:" $TMP_DIR/cryptsetup.luksDump | sed -r 's/^.+:\s*(.+)$/\1/' )
|
||||
+ # More than one keyslot may be defined - use key_size from the first slot.
|
||||
+ # Depending on the version the "cryptsetup luksDump" command outputs the key_size value
|
||||
+ # as a line like
|
||||
+ # Key: 512 bits
|
||||
+ # and/or as a line like
|
||||
+ # Cipher key: 512 bits
|
||||
+ # cf. https://github.com/rear/rear/pull/2504#issuecomment-718729198 and subsequent comments
|
||||
+ # so we grep for both lines but use only the first match from the first slot:
|
||||
+ key_size=$( egrep -m 1 "Key:|Cipher key:" $TMP_DIR/cryptsetup.luksDump | sed -r 's/^.+:\s*(.+) bits$/\1/' )
|
||||
+ hash=$( grep "Hash" $TMP_DIR/cryptsetup.luksDump | sed -r 's/^.+:\s*(.+)$/\1/' )
|
||||
+ fi
|
||||
|
||||
-# cryptsetup is required in the recovery system if disklayout.conf contains at least one 'crypt' entry
|
||||
-# see the create_crypt function in layout/prepare/GNU/Linux/160_include_luks_code.sh
|
||||
-# what program calls are written to diskrestore.sh
|
||||
-# cf. https://github.com/rear/rear/issues/1963
|
||||
-grep -q '^crypt ' $DISKLAYOUT_FILE && REQUIRED_PROGS+=( cryptsetup ) || true
|
||||
+ # Basic checks that the cipher key_size hash uuid values exist
|
||||
+ # cf. https://github.com/rear/rear/pull/2504#issuecomment-718729198
|
||||
+ # because some values are needed during "rear recover"
|
||||
+ # to set cryptsetup options in layout/prepare/GNU/Linux/160_include_luks_code.sh
|
||||
+ # and it seems cryptsetup fails when options with empty values are specified
|
||||
+ # cf. https://github.com/rear/rear/pull/2504#issuecomment-719479724
|
||||
+ # For example a LUKS1 crypt entry in disklayout.conf looks like
|
||||
+ # crypt /dev/mapper/luks1test /dev/sda7 type=luks1 cipher=aes-xts-plain64 key_size=256 hash=sha256 uuid=1b4198c9-d9b0-4c57-b9a3-3433e391e706
|
||||
+ # and a LUKS1 crypt entry in disklayout.conf looks like
|
||||
+ # crypt /dev/mapper/luks2test /dev/sda8 type=luks2 cipher=aes-xts-plain64 key_size=256 hash=sha256 uuid=3e874a28-7415-4f8c-9757-b3f28a96c4d2
|
||||
+ # Only the keyfile_option value is optional and the luks_type value is already tested above.
|
||||
+ # Using plain test to ensure a value is a single non empty and non blank word
|
||||
+ # without quoting because test " " would return zero exit code
|
||||
+ # cf. "Beware of the emptiness" in https://github.com/rear/rear/wiki/Coding-Style
|
||||
+ # Do not error out instantly here but only report errors here so the user can see all messages
|
||||
+ # and actually error out at the end of this script if there was one actually invalid value:
|
||||
+ if ! test $cipher ; then
|
||||
+ LogPrint "No 'cipher' value for LUKS$version volume $target_name in $source_device"
|
||||
+ fi
|
||||
+ if test $key_size ; then
|
||||
+ if ! is_positive_integer $key_size ; then
|
||||
+ LogPrintError "Error: 'key_size=$key_size' is no positive integer for LUKS$version volume $target_name in $source_device"
|
||||
+ invalid_cryptsetup_option_value="yes"
|
||||
+ fi
|
||||
+ else
|
||||
+ LogPrint "No 'key_size' value for LUKS$version volume $target_name in $source_device"
|
||||
+ fi
|
||||
+ if ! test $hash ; then
|
||||
+ LogPrint "No 'hash' value for LUKS$version volume $target_name in $source_device"
|
||||
+ fi
|
||||
+ if ! test $uuid ; then
|
||||
+ # Report a missig uuid value as an error to have the user informed
|
||||
+ # but do not error out here because things can be fixed manually during "rear recover"
|
||||
+ # cf. https://github.com/rear/rear/pull/2506#issuecomment-721757810
|
||||
+ # and https://github.com/rear/rear/pull/2506#issuecomment-722315498
|
||||
+ # and https://github.com/rear/rear/issues/2509
|
||||
+ LogPrintError "Error: No 'uuid' value for LUKS$version volume $target_name in $source_device (mounting it or booting the recreated system may fail)"
|
||||
+ fi
|
||||
+
|
||||
+ echo "crypt /dev/mapper/$target_name $source_device type=$luks_type cipher=$cipher key_size=$key_size hash=$hash uuid=$uuid $keyfile_option" >> $DISKLAYOUT_FILE
|
||||
+
|
||||
+done < <( dmsetup ls --target crypt )
|
||||
|
||||
+# Let this script return successfully when invalid_cryptsetup_option_value is not true:
|
||||
+is_true $invalid_cryptsetup_option_value && Error "Invalid or empty LUKS cryptsetup option value(s) in $DISKLAYOUT_FILE" || true
|
693
rear-bz1930662.patch
Normal file
693
rear-bz1930662.patch
Normal file
@ -0,0 +1,693 @@
|
||||
diff --git a/usr/share/rear/backup/NETFS/default/500_make_backup.sh b/usr/share/rear/backup/NETFS/default/500_make_backup.sh
|
||||
index 02c204c5..60c80b5f 100644
|
||||
--- a/usr/share/rear/backup/NETFS/default/500_make_backup.sh
|
||||
+++ b/usr/share/rear/backup/NETFS/default/500_make_backup.sh
|
||||
@@ -16,6 +16,8 @@ function set_tar_features () {
|
||||
FEATURE_TAR_IS_SET=1
|
||||
}
|
||||
|
||||
+local backup_prog_rc
|
||||
+
|
||||
local scheme=$( url_scheme $BACKUP_URL )
|
||||
local path=$( url_path $BACKUP_URL )
|
||||
local opath=$( backup_path $scheme $path )
|
||||
diff --git a/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh b/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh
|
||||
index c560ec94..1692ba4c 100644
|
||||
--- a/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh
|
||||
+++ b/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh
|
||||
@@ -1,5 +1,7 @@
|
||||
# Start SELinux if it was stopped - check presence of $TMP_DIR/selinux.mode
|
||||
|
||||
+local backup_prog_rc
|
||||
+
|
||||
[ -f $TMP_DIR/selinux.mode ] && {
|
||||
touch "${TMP_DIR}/selinux.autorelabel"
|
||||
cat $TMP_DIR/selinux.mode > $SELINUX_ENFORCE
|
||||
@@ -13,19 +15,19 @@
|
||||
ssh $RSYNC_USER@$RSYNC_HOST "chmod $v 755 ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" 2>/dev/null
|
||||
$BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" \
|
||||
"$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel" 2>/dev/null
|
||||
- _rc=$?
|
||||
- if [ $_rc -ne 0 ]; then
|
||||
- LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$_rc]}]"
|
||||
+ backup_prog_rc=$?
|
||||
+ if [ $backup_prog_rc -ne 0 ]; then
|
||||
+ LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]"
|
||||
#StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
|
||||
fi
|
||||
;;
|
||||
|
||||
(rsync)
|
||||
- $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" ${BACKUP_RSYNC_OPTIONS[@]} \
|
||||
+ $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" "${BACKUP_RSYNC_OPTIONS[@]}" \
|
||||
"${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel"
|
||||
- _rc=$?
|
||||
- if [ $_rc -ne 0 ]; then
|
||||
- LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$_rc]}]"
|
||||
+ backup_prog_rc=$?
|
||||
+ if [ $backup_prog_rc -ne 0 ]; then
|
||||
+ LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]"
|
||||
#StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
|
||||
fi
|
||||
;;
|
||||
diff --git a/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh b/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh
|
||||
index cae12e38..9a17d6bb 100644
|
||||
--- a/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh
|
||||
+++ b/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh
|
||||
@@ -1,3 +1,5 @@
|
||||
+local backup_prog_rc
|
||||
+
|
||||
[ -f $TMP_DIR/force.autorelabel ] && {
|
||||
|
||||
> "${TMP_DIR}/selinux.autorelabel"
|
||||
@@ -11,19 +13,19 @@
|
||||
ssh $RSYNC_USER@$RSYNC_HOST "chmod $v 755 ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" 2>/dev/null
|
||||
$BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" \
|
||||
"$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel" 2>/dev/null
|
||||
- _rc=$?
|
||||
- if [ $_rc -ne 0 ]; then
|
||||
- LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$_rc]}]"
|
||||
+ backup_prog_rc=$?
|
||||
+ if [ $backup_prog_rc -ne 0 ]; then
|
||||
+ LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]"
|
||||
#StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
|
||||
fi
|
||||
;;
|
||||
|
||||
(rsync)
|
||||
- $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" ${BACKUP_RSYNC_OPTIONS[@]} \
|
||||
+ $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" "${BACKUP_RSYNC_OPTIONS[@]}" \
|
||||
"${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel"
|
||||
- _rc=$?
|
||||
- if [ $_rc -ne 0 ]; then
|
||||
- LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$_rc]}]"
|
||||
+ backup_prog_rc=$?
|
||||
+ if [ $backup_prog_rc -ne 0 ]; then
|
||||
+ LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]"
|
||||
#StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
|
||||
fi
|
||||
;;
|
||||
@@ -35,8 +37,7 @@
|
||||
# probably using the BACKUP=NETFS workflow instead
|
||||
if [ -d "${opath}" ]; then
|
||||
if [ ! -f "${opath}/selinux.autorelabel" ]; then
|
||||
- > "${opath}/selinux.autorelabel"
|
||||
- StopIfError "Failed to create selinux.autorelabel on ${opath}"
|
||||
+ > "${opath}/selinux.autorelabel" || Error "Failed to create selinux.autorelabel on ${opath}"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
diff --git a/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh b/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh
|
||||
index 60330007..cedee9ce 100644
|
||||
--- a/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh
|
||||
+++ b/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh
|
||||
@@ -4,7 +4,7 @@
|
||||
# check for the --relative option in BACKUP_RSYNC_OPTIONS array
|
||||
# for the default values see the standard definition in conf/default.conf file
|
||||
|
||||
-if ! grep -q relative <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then
|
||||
+if ! grep -q relative <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then
|
||||
BACKUP_RSYNC_OPTIONS+=( --relative )
|
||||
Log "Added option '--relative' to the BACKUP_RSYNC_OPTIONS array during $WORKFLOW workflow"
|
||||
fi
|
||||
diff --git a/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh b/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh
|
||||
index 0d67d362..750a04ca 100644
|
||||
--- a/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh
|
||||
+++ b/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh
|
||||
@@ -2,6 +2,9 @@
|
||||
# This file is part of Relax-and-Recover, licensed under the GNU General
|
||||
# Public License. Refer to the included COPYING for full text of license.
|
||||
|
||||
+local backup_prog_rc
|
||||
+local backup_log_message
|
||||
+
|
||||
Log "Include list:"
|
||||
while read -r ; do
|
||||
Log " $REPLY"
|
||||
@@ -11,9 +14,9 @@ while read -r ; do
|
||||
Log " $REPLY"
|
||||
done < $TMP_DIR/backup-exclude.txt
|
||||
|
||||
-LogPrint "Creating $BACKUP_PROG archive on '${RSYNC_HOST}:${RSYNC_PATH}'"
|
||||
+LogPrint "Creating $BACKUP_PROG backup on '${RSYNC_HOST}:${RSYNC_PATH}'"
|
||||
|
||||
-ProgressStart "Running archive operation"
|
||||
+ProgressStart "Running backup operation"
|
||||
(
|
||||
case "$(basename $BACKUP_PROG)" in
|
||||
|
||||
@@ -37,7 +40,7 @@ ProgressStart "Running archive operation"
|
||||
;;
|
||||
|
||||
(*)
|
||||
- # no other backup programs foreseen then rsync so far
|
||||
+ # no other backup programs foreseen than rsync so far
|
||||
:
|
||||
;;
|
||||
|
||||
@@ -96,7 +99,7 @@ case "$(basename $BACKUP_PROG)" in
|
||||
;;
|
||||
esac
|
||||
|
||||
- ProgressInfo "Archived $((size/1024/1024)) MiB [avg $((size/1024/(SECONDS-starttime))) KiB/sec]"
|
||||
+ ProgressInfo "Backed up $((size/1024/1024)) MiB [avg $((size/1024/(SECONDS-starttime))) KiB/sec]"
|
||||
done
|
||||
;;
|
||||
|
||||
@@ -113,24 +116,23 @@ ProgressStop
|
||||
wait $BackupPID
|
||||
|
||||
transfertime="$((SECONDS-starttime))"
|
||||
-_rc="$(cat $TMP_DIR/retval)"
|
||||
+backup_prog_rc="$(cat $TMP_DIR/retval)"
|
||||
|
||||
sleep 1
|
||||
# everyone should see this warning, even if not verbose
|
||||
-test "$_rc" -gt 0 && VERBOSE=1 LogPrint "WARNING !
|
||||
-There was an error (${rsync_err_msg[$_rc]}) during archive creation.
|
||||
-Please check the archive and see '$RUNTIME_LOGFILE' for more information.
|
||||
+test "$backup_prog_rc" -gt 0 && Error "
|
||||
+There was an error (${rsync_err_msg[$backup_prog_rc]}) during backup creation.
|
||||
+Please check the destination and see '$RUNTIME_LOGFILE' for more information.
|
||||
|
||||
-Since errors are often related to files that cannot be saved by
|
||||
-$BACKUP_PROG, we will continue the $WORKFLOW process. However, you MUST
|
||||
-verify the backup yourself before trusting it !
|
||||
+If the error is related to files that cannot and should not be saved by
|
||||
+$BACKUP_PROG, they should be excluded from the backup.
|
||||
|
||||
"
|
||||
|
||||
-_message="$(tail -14 ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log)"
|
||||
-if [ $_rc -eq 0 -a "$_message" ] ; then
|
||||
- LogPrint "$_message in $transfertime seconds."
|
||||
+backup_log_message="$(tail -14 ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log)"
|
||||
+if [ $backup_prog_rc -eq 0 -a "$backup_log_message" ] ; then
|
||||
+ LogPrint "$backup_log_message in $transfertime seconds."
|
||||
elif [ "$size" ]; then
|
||||
- LogPrint "Archived $((size/1024/1024)) MiB in $((transfertime)) seconds [avg $((size/1024/transfertime)) KiB/sec]"
|
||||
+ LogPrint "Backed up $((size/1024/1024)) MiB in $((transfertime)) seconds [avg $((size/1024/transfertime)) KiB/sec]"
|
||||
fi
|
||||
|
||||
diff --git a/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh b/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh
|
||||
index 01801a4e..b90d459b 100644
|
||||
--- a/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh
|
||||
+++ b/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh
|
||||
@@ -1,6 +1,8 @@
|
||||
|
||||
# copy the backup.log & rear.log file to remote destination with timestamp added
|
||||
-Timestamp=$( date +%Y%m%d.%H%M )
|
||||
+local timestamp
|
||||
+
|
||||
+timestamp=$( date +%Y%m%d.%H%M )
|
||||
|
||||
# compress the log file first
|
||||
gzip "$TMP_DIR/$BACKUP_PROG_ARCHIVE.log" || Error "Failed to 'gzip $TMP_DIR/$BACKUP_PROG_ARCHIVE.log'"
|
||||
@@ -10,15 +12,15 @@ case $RSYNC_PROTO in
|
||||
# FIXME: Add an explanatory comment why "2>/dev/null" is useful here
|
||||
# or remove it according to https://github.com/rear/rear/issues/1395
|
||||
$BACKUP_PROG -a "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log.gz" \
|
||||
- "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${Timestamp}.log.gz" 2>/dev/null
|
||||
+ "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${timestamp}.log.gz" 2>/dev/null
|
||||
|
||||
- $BACKUP_PROG -a "$RUNTIME_LOGFILE" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/rear-${Timestamp}.log" 2>/dev/null
|
||||
+ $BACKUP_PROG -a "$RUNTIME_LOGFILE" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/rear-${timestamp}.log" 2>/dev/null
|
||||
;;
|
||||
(rsync)
|
||||
- $BACKUP_PROG -a "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log.gz" ${BACKUP_RSYNC_OPTIONS[@]} \
|
||||
- "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${Timestamp}.log.gz"
|
||||
+ $BACKUP_PROG -a "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log.gz" "${BACKUP_RSYNC_OPTIONS[@]}" \
|
||||
+ "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${timestamp}.log.gz"
|
||||
|
||||
- $BACKUP_PROG -a "$RUNTIME_LOGFILE" ${BACKUP_RSYNC_OPTIONS[@]} "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}//rear-${Timestamp}.log"
|
||||
+ $BACKUP_PROG -a "$RUNTIME_LOGFILE" "${BACKUP_RSYNC_OPTIONS[@]}" "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}//rear-${timestamp}.log"
|
||||
;;
|
||||
esac
|
||||
|
||||
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
|
||||
index 455aa3ce..0c230f38 100644
|
||||
--- a/usr/share/rear/conf/default.conf
|
||||
+++ b/usr/share/rear/conf/default.conf
|
||||
@@ -1106,7 +1106,8 @@ BACKUP_ONLY_EXCLUDE="no"
|
||||
MANUAL_INCLUDE=NO
|
||||
# Disable SELinux policy during backup with NETFS or RSYNC (default yes)
|
||||
BACKUP_SELINUX_DISABLE=1
|
||||
-# Enable integrity check of the backup archive (only with BACKUP=NETFS and BACKUP_PROG=tar)
|
||||
+# Enable integrity check of the backup archive (full check only with BACKUP=NETFS and BACKUP_PROG=tar,
|
||||
+# with BACKUP=rsync or BACKUP_PROG=rsync it only checks whether rsync completed the restore successfully)
|
||||
BACKUP_INTEGRITY_CHECK=
|
||||
# Define BACKUP_TYPE.
|
||||
# By default BACKUP_TYPE is empty which means "rear mkbackup" will create a full backup.
|
||||
diff --git a/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh b/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh
|
||||
index 32ac391d..519febf5 100644
|
||||
--- a/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh
|
||||
+++ b/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh
|
||||
@@ -2,21 +2,19 @@
|
||||
# RSYNC_PREFIX=$HOSTNAME as set in default.conf
|
||||
|
||||
# create temporary local work-spaces to collect files (we already make the remote backup dir with the correct mode!!)
|
||||
-mkdir -p $v -m0750 "${TMP_DIR}/rsync/${RSYNC_PREFIX}" >&2
|
||||
-StopIfError "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}'"
|
||||
-mkdir -p $v -m0755 "${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup" >&2
|
||||
-StopIfError "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup'"
|
||||
+mkdir -p $v -m0750 "${TMP_DIR}/rsync/${RSYNC_PREFIX}" >&2 || Error "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}'"
|
||||
+mkdir -p $v -m0755 "${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup" >&2 || Error "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup'"
|
||||
|
||||
case $RSYNC_PROTO in
|
||||
|
||||
(ssh)
|
||||
- $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}" >/dev/null 2>&1
|
||||
- StopIfError "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}"
|
||||
+ $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}" >/dev/null 2>&1 \
|
||||
+ || Error "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}"
|
||||
;;
|
||||
|
||||
(rsync)
|
||||
- $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" ${BACKUP_RSYNC_OPTIONS[@]} "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/" >/dev/null
|
||||
- StopIfError "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}"
|
||||
+ $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${BACKUP_RSYNC_OPTIONS[@]}" "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/" >/dev/null \
|
||||
+ || Error "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}"
|
||||
;;
|
||||
|
||||
esac
|
||||
diff --git a/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh b/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh
|
||||
index c7b430d8..96b62da1 100644
|
||||
--- a/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh
|
||||
+++ b/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh
|
||||
@@ -5,19 +5,19 @@ LogPrint "Copying resulting files to $OUTPUT_URL location"
|
||||
|
||||
# if called as mkbackuponly then we just don't have any result files.
|
||||
if test "$RESULT_FILES" ; then
|
||||
- Log "Copying files '${RESULT_FILES[@]}' to $OUTPUT_URL location"
|
||||
- cp $v "${RESULT_FILES[@]}" "${TMP_DIR}/rsync/${RSYNC_PREFIX}/"
|
||||
- StopIfError "Could not copy files to local rsync location"
|
||||
+ Log "Copying files '${RESULT_FILES[*]}' to $OUTPUT_URL location"
|
||||
+ cp $v "${RESULT_FILES[@]}" "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" \
|
||||
+ || Error "Could not copy files to local rsync location"
|
||||
fi
|
||||
|
||||
-echo "$VERSION_INFO" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/VERSION"
|
||||
-StopIfError "Could not create VERSION file on local rsync location"
|
||||
+echo "$VERSION_INFO" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/VERSION" \
|
||||
+ || Error "Could not create VERSION file on local rsync location"
|
||||
|
||||
-cp $v $(get_template "RESULT_usage_$OUTPUT.txt") "${TMP_DIR}/rsync/${RSYNC_PREFIX}/README"
|
||||
-StopIfError "Could not copy usage file to local rsync location"
|
||||
+cp $v $(get_template "RESULT_usage_$OUTPUT.txt") "${TMP_DIR}/rsync/${RSYNC_PREFIX}/README" \
|
||||
+ || Error "Could not copy usage file to local rsync location"
|
||||
|
||||
-cat "$RUNTIME_LOGFILE" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/rear.log"
|
||||
-StopIfError "Could not copy $RUNTIME_LOGFILE to local rsync location"
|
||||
+cat "$RUNTIME_LOGFILE" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/rear.log" \
|
||||
+ || Error "Could not copy $RUNTIME_LOGFILE to local rsync location"
|
||||
|
||||
case $RSYNC_PROTO in
|
||||
|
||||
@@ -25,20 +25,20 @@ case $RSYNC_PROTO in
|
||||
Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ ${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/"
|
||||
# FIXME: Add an explanatory comment why "2>/dev/null" is useful here
|
||||
# or remove it according to https://github.com/rear/rear/issues/1395
|
||||
- $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null
|
||||
- StopIfError "Could not copy '${RESULT_FILES[@]}' to $OUTPUT_URL location"
|
||||
+ $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null \
|
||||
+ || Error "Could not copy '${RESULT_FILES[*]}' to $OUTPUT_URL location"
|
||||
;;
|
||||
|
||||
(rsync)
|
||||
- Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ ${BACKUP_RSYNC_OPTIONS[@]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/"
|
||||
+ Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ ${BACKUP_RSYNC_OPTIONS[*]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/"
|
||||
# FIXME: Add an explanatory comment why "2>/dev/null" is useful here
|
||||
# or remove it according to https://github.com/rear/rear/issues/1395
|
||||
- $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" ${BACKUP_RSYNC_OPTIONS[@]} "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null
|
||||
- StopIfError "Could not copy '${RESULT_FILES[@]}' to $OUTPUT_URL location"
|
||||
+ $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "${BACKUP_RSYNC_OPTIONS[@]}" "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null \
|
||||
+ || Error "Could not copy '${RESULT_FILES[*]}' to $OUTPUT_URL location"
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
# cleanup the temporary space (need it for the log file during backup)
|
||||
-rm -rf "${TMP_DIR}/rsync/${RSYNC_PREFIX}/"
|
||||
-LogIfError "Could not cleanup temoprary rsync space: ${TMP_DIR}/rsync/${RSYNC_PREFIX}/"
|
||||
+rm -rf "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" \
|
||||
+ || Log "Could not cleanup temporary rsync space: ${TMP_DIR}/rsync/${RSYNC_PREFIX}/"
|
||||
diff --git a/usr/share/rear/prep/NETFS/default/400_automatic_exclude_recreate.sh b/usr/share/rear/prep/NETFS/default/400_automatic_exclude_recreate.sh
|
||||
index fadf9d72..3c719c44 100644
|
||||
--- a/usr/share/rear/prep/NETFS/default/400_automatic_exclude_recreate.sh
|
||||
+++ b/usr/share/rear/prep/NETFS/default/400_automatic_exclude_recreate.sh
|
||||
@@ -31,7 +31,7 @@ case $scheme in
|
||||
backup_directory_mountpoint=$( df -P "$backup_directory" | tail -1 | awk '{print $6}' )
|
||||
test "/" = "$backup_directory_mountpoint" && Error "URL '$BACKUP_URL' has the backup directory '$backup_directory' in the '/' filesystem which is forbidden."
|
||||
# When the mountpoint of the backup directory is not yet excluded add its mountpoint to the EXCLUDE_RECREATE array:
|
||||
- if ! grep -q "$backup_directory_mountpoint" <<< $( echo ${EXCLUDE_RECREATE[@]} ) ; then
|
||||
+ if ! grep -q "$backup_directory_mountpoint" <<< "${EXCLUDE_RECREATE[*]}" ; then
|
||||
EXCLUDE_RECREATE+=( "fs:$backup_directory_mountpoint" )
|
||||
fi
|
||||
;;
|
||||
diff --git a/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh b/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh
|
||||
index ac26edfa..eb7df29e 100644
|
||||
--- a/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh
|
||||
+++ b/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh
|
||||
@@ -33,7 +33,7 @@ case $(basename $BACKUP_PROG) in
|
||||
touch $TMP_DIR/force.autorelabel # after reboot the restored system do a forced SELinux relabeling
|
||||
else
|
||||
# if --xattrs is already set; no need to do it again
|
||||
- if ! grep -q xattrs <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then
|
||||
+ if ! grep -q xattrs <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then
|
||||
BACKUP_RSYNC_OPTIONS+=( --xattrs )
|
||||
fi
|
||||
RSYNC_SELINUX=1 # variable used in recover mode (means using xattr and not disable SELinux)
|
||||
diff --git a/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh b/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh
|
||||
index b8535352..c964a148 100644
|
||||
--- a/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh
|
||||
+++ b/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh
|
||||
@@ -33,22 +33,20 @@ RSYNC_PORT=873 # default port (of rsync server)
|
||||
RSYNC_PATH=
|
||||
|
||||
|
||||
-echo $BACKUP_URL | egrep -q '(::)' # new style '::' means rsync protocol
|
||||
-if [[ $? -eq 0 ]]; then
|
||||
+if egrep -q '(::)' <<< $BACKUP_URL ; then # new style '::' means rsync protocol
|
||||
RSYNC_PROTO=rsync
|
||||
else
|
||||
RSYNC_PROTO=ssh
|
||||
fi
|
||||
|
||||
-echo $host | grep -q '@'
|
||||
-if [[ $? -eq 0 ]]; then
|
||||
+if grep -q '@' <<< $host ; then
|
||||
RSYNC_USER="${host%%@*}" # grab user name
|
||||
else
|
||||
RSYNC_USER=root
|
||||
fi
|
||||
|
||||
# remove USER@ if present (we don't need it anymore)
|
||||
-tmp2="${host#*@}"
|
||||
+local tmp2="${host#*@}"
|
||||
|
||||
case "$RSYNC_PROTO" in
|
||||
|
||||
@@ -56,8 +54,7 @@ case "$RSYNC_PROTO" in
|
||||
# tmp2=witsbebelnx02::backup or tmp2=witsbebelnx02::
|
||||
RSYNC_HOST="${tmp2%%::*}"
|
||||
# path=/gdhaese1@witsbebelnx02::backup or path=/backup
|
||||
- echo $path | grep -q '::'
|
||||
- if [[ $? -eq 0 ]]; then
|
||||
+ if grep -q '::' <<< $path ; then
|
||||
RSYNC_PATH="${path##*::}"
|
||||
else
|
||||
RSYNC_PATH="${path##*/}"
|
||||
@@ -79,8 +76,7 @@ esac
|
||||
|
||||
# check if host is reachable
|
||||
if test "$PING" ; then
|
||||
- ping -c 2 "$RSYNC_HOST" >/dev/null
|
||||
- StopIfError "Backup host [$RSYNC_HOST] not reachable."
|
||||
+ ping -c 2 "$RSYNC_HOST" >/dev/null || Error "Backup host [$RSYNC_HOST] not reachable."
|
||||
else
|
||||
Log "Skipping ping test"
|
||||
fi
|
||||
@@ -89,15 +85,15 @@ fi
|
||||
case "$RSYNC_PROTO" in
|
||||
|
||||
(rsync)
|
||||
- Log "Test: $BACKUP_PROG ${BACKUP_RSYNC_OPTIONS[@]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/"
|
||||
- $BACKUP_PROG ${BACKUP_RSYNC_OPTIONS[@]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/ >/dev/null
|
||||
- StopIfError "Rsync daemon not running on $RSYNC_HOST"
|
||||
+ Log "Test: $BACKUP_PROG ${BACKUP_RSYNC_OPTIONS[*]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/"
|
||||
+ $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/ >/dev/null \
|
||||
+ || Error "Rsync daemon not running on $RSYNC_HOST"
|
||||
;;
|
||||
|
||||
(ssh)
|
||||
Log "Test: ssh ${RSYNC_USER}@${RSYNC_HOST} /bin/true"
|
||||
- ssh ${RSYNC_USER}@${RSYNC_HOST} /bin/true >/dev/null 2>&1
|
||||
- StopIfError "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]"
|
||||
+ ssh ${RSYNC_USER}@${RSYNC_HOST} /bin/true >/dev/null 2>&1 \
|
||||
+ || Error "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]"
|
||||
;;
|
||||
|
||||
esac
|
||||
diff --git a/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh b/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh
|
||||
index 446dd736..e9103531 100644
|
||||
--- a/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh
|
||||
+++ b/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh
|
||||
@@ -2,15 +2,17 @@
|
||||
# This file is part of Relax-and-Recover, licensed under the GNU General
|
||||
# Public License. Refer to the included COPYING for full text of license.
|
||||
# try to grab the rsync protocol version of rsync on the remote server
|
||||
+
|
||||
+local remote_mountpoint
|
||||
+
|
||||
if [ -z "$RSYNC_PROTOCOL_VERSION" ]; then
|
||||
|
||||
case $RSYNC_PROTO in
|
||||
|
||||
(ssh)
|
||||
- ssh ${RSYNC_USER}@${RSYNC_HOST} rsync --version >"$TMP_DIR/rsync_protocol" 2>&1
|
||||
- StopIfError "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]"
|
||||
- grep -q "protocol version" "$TMP_DIR/rsync_protocol"
|
||||
- if [ $? -eq 0 ]; then
|
||||
+ ssh ${RSYNC_USER}@${RSYNC_HOST} rsync --version >"$TMP_DIR/rsync_protocol" 2>&1 \
|
||||
+ || Error "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]"
|
||||
+ if grep -q "protocol version" "$TMP_DIR/rsync_protocol" ; then
|
||||
RSYNC_PROTOCOL_VERSION=$(grep 'protocol version' "$TMP_DIR/rsync_protocol" | awk '{print $6}')
|
||||
else
|
||||
RSYNC_PROTOCOL_VERSION=29 # being conservative (old rsync version < 3.0)
|
||||
@@ -30,25 +32,21 @@ else
|
||||
|
||||
fi
|
||||
|
||||
-if [ "${RSYNC_USER}" != "root" ]; then
|
||||
+if [ "${RSYNC_USER}" != "root" -a $RSYNC_PROTO = "ssh" ]; then
|
||||
if [ $RSYNC_PROTOCOL_VERSION -gt 29 ]; then
|
||||
if grep -q "no xattrs" "$TMP_DIR/rsync_protocol"; then
|
||||
# no xattrs available in remote rsync, so --fake-super is not possible
|
||||
Error "rsync --fake-super not possible on system ($RSYNC_HOST) (no xattrs compiled in rsync)"
|
||||
else
|
||||
# when using --fake-super we must have user_xattr mount options on the remote mntpt
|
||||
- _mntpt=$(ssh ${RSYNC_USER}@${RSYNC_HOST} 'cd ${RSYNC_PATH}; df -P .' 2>/dev/null | tail -1 | awk '{print $6}')
|
||||
- ssh ${RSYNC_USER}@${RSYNC_HOST} "cd ${RSYNC_PATH} && touch .is_xattr_supported && setfattr -n user.comment -v 'File created by ReaR to test if this filesystems supports extended attributes.' .is_xattr_supported && getfattr -n user.comment .is_xattr_supported 1>/dev/null; find .is_xattr_supported -empty -delete"
|
||||
- StopIfError "Remote file system $_mntpt does not have user_xattr mount option set!"
|
||||
- #BACKUP_RSYNC_OPTIONS+=( --xattrs --rsync-path="""rsync --fake-super""" )
|
||||
+ remote_mountpoint=$(ssh ${RSYNC_USER}@${RSYNC_HOST} 'cd ${RSYNC_PATH}; df -P .' 2>/dev/null | tail -1 | awk '{print $6}')
|
||||
+ ssh ${RSYNC_USER}@${RSYNC_HOST} "cd ${RSYNC_PATH} && touch .is_xattr_supported && setfattr -n user.comment -v 'File created by ReaR to test if this filesystems supports extended attributes.' .is_xattr_supported && getfattr -n user.comment .is_xattr_supported 1>/dev/null; find .is_xattr_supported -empty -delete" \
|
||||
+ || Error "Remote file system $remote_mountpoint does not have user_xattr mount option set!"
|
||||
+ #BACKUP_RSYNC_OPTIONS+=( --xattrs --rsync-path="rsync --fake-super" )
|
||||
# see issue #366 for explanation of removing --xattrs
|
||||
- BACKUP_RSYNC_OPTIONS+=( --rsync-path="""rsync --fake-super""" )
|
||||
+ BACKUP_RSYNC_OPTIONS+=( --rsync-path="rsync --fake-super" )
|
||||
fi
|
||||
else
|
||||
- if [ ${BACKUP_RSYNC_OPTIONS[@]/--fake-super/} != ${BACKUP_RSUNC_OPTIONS[@]} ]; then
|
||||
- Error "rsync --fake-super not possible on system ($RSYNC_HOST) (please upgrade rsync to 3.x)"
|
||||
- else
|
||||
- Log "Warning: rsync --fake-super not possible on system ($RSYNC_HOST) (please upgrade rsync to 3.x)"
|
||||
- fi
|
||||
+ Error "rsync --fake-super not possible on system ($RSYNC_HOST) (please upgrade rsync to 3.x)"
|
||||
fi
|
||||
fi
|
||||
diff --git a/usr/share/rear/restore/DUPLICITY/default/400_restore_duplicity.sh b/usr/share/rear/restore/DUPLICITY/default/400_restore_duplicity.sh
|
||||
index 0a9c9648..220ccc57 100644
|
||||
--- a/usr/share/rear/restore/DUPLICITY/default/400_restore_duplicity.sh
|
||||
+++ b/usr/share/rear/restore/DUPLICITY/default/400_restore_duplicity.sh
|
||||
@@ -5,6 +5,8 @@
|
||||
# Restore from remote backup via DUPLICIY over rsync
|
||||
|
||||
if [ "$BACKUP_PROG" = "duplicity" ]; then
|
||||
+ local backup_prog_rc
|
||||
+ local restore_log_message
|
||||
|
||||
LogPrint "========================================================================"
|
||||
LogPrint "Restoring backup with $BACKUP_PROG from '$BACKUP_DUPLICITY_URL'"
|
||||
@@ -49,7 +51,8 @@ if [ "$BACKUP_PROG" = "duplicity" ]; then
|
||||
LogPrint "with CMD: $DUPLICITY_PROG -v 5 $GPG_KEY --force --tempdir=$DUPLICITY_TEMPDIR $BACKUP_DUPLICITY_URL/$HOSTNAME/ $TARGET_FS_ROOT"
|
||||
$DUPLICITY_PROG -v 5 $GPG_KEY --force --tempdir="$DUPLICITY_TEMPDIR" $BACKUP_DUPLICITY_URL/$HOSTNAME/ $TARGET_FS_ROOT 0<&6 | tee $TMP_DIR/duplicity-restore.log
|
||||
fi
|
||||
- _rc=$?
|
||||
+ # FIXME: this collects the exit code from "tee", not from $DUPLICITY_PROG
|
||||
+ backup_prog_rc=$?
|
||||
|
||||
transfertime="$((SECONDS-$starttime))"
|
||||
sleep 1
|
||||
@@ -65,20 +68,20 @@ if [ "$BACKUP_PROG" = "duplicity" ]; then
|
||||
LogPrint "========================================================================"
|
||||
|
||||
|
||||
- if [ "$_rc" -gt 0 ]; then
|
||||
+ if [ "$backup_prog_rc" -gt 0 ]; then
|
||||
LogPrint "WARNING !
|
||||
There was an error while restoring the archive.
|
||||
Please check '$RUNTIME_LOGFILE' and $TMP_DIR/duplicity-restore.log for more information.
|
||||
You should also manually check the restored system to see whether it is complete.
|
||||
"
|
||||
|
||||
- _message="$(tail -14 ${TMP_DIR}/duplicity-restore.log)"
|
||||
+ restore_log_message="$(tail -14 ${TMP_DIR}/duplicity-restore.log)"
|
||||
|
||||
LogPrint "Last 14 Lines of ${TMP_DIR}/duplicity-restore.log:"
|
||||
- LogPrint "$_message"
|
||||
+ LogPrint "$restore_log_message"
|
||||
fi
|
||||
|
||||
- if [ $_rc -eq 0 ] ; then
|
||||
+ if [ $backup_prog_rc -eq 0 ] ; then
|
||||
LogPrint "Restore completed in $transfertime seconds."
|
||||
fi
|
||||
|
||||
diff --git a/usr/share/rear/restore/RBME/default/400_restore_backup.sh b/usr/share/rear/restore/RBME/default/400_restore_backup.sh
|
||||
index 28a3c354..3e97e16b 100644
|
||||
--- a/usr/share/rear/restore/RBME/default/400_restore_backup.sh
|
||||
+++ b/usr/share/rear/restore/RBME/default/400_restore_backup.sh
|
||||
@@ -2,6 +2,8 @@ if [[ -z "$RBME_BACKUP" ]] ; then
|
||||
Error "No RBME backup selected (BACKUP_URL?). Aborting."
|
||||
fi
|
||||
|
||||
+local backup_prog_rc
|
||||
+
|
||||
scheme=$(url_scheme "$BACKUP_URL")
|
||||
|
||||
LogPrint "Restoring from backup $RBME_BACKUP."
|
||||
@@ -43,11 +45,11 @@ transfertime="$((SECONDS-starttime))"
|
||||
# harvest return code from background job. The kill -0 $BackupPID loop above should
|
||||
# have made sure that this wait won't do any real "waiting" :-)
|
||||
wait $BackupPID
|
||||
-_rc=$?
|
||||
+backup_prog_rc=$?
|
||||
|
||||
sleep 1
|
||||
-test "$_rc" -gt 0 && LogPrint "WARNING !
|
||||
-There was an error (${rsync_err_msg[$_rc]}) while restoring the archive.
|
||||
+test "$backup_prog_rc" -gt 0 && LogPrint "WARNING !
|
||||
+There was an error (${rsync_err_msg[$backup_prog_rc]}) while restoring the archive.
|
||||
Please check '$RUNTIME_LOGFILE' for more information. You should also
|
||||
manually check the restored system to see whether it is complete.
|
||||
"
|
||||
diff --git a/usr/share/rear/restore/RSYNC/default/200_remove_relative_rsync_option.sh b/usr/share/rear/restore/RSYNC/default/200_remove_relative_rsync_option.sh
|
||||
index 53915322..a792f195 100644
|
||||
--- a/usr/share/rear/restore/RSYNC/default/200_remove_relative_rsync_option.sh
|
||||
+++ b/usr/share/rear/restore/RSYNC/default/200_remove_relative_rsync_option.sh
|
||||
@@ -4,11 +4,11 @@
|
||||
# without the --relative option ; my feeling says it is better to remove it from array BACKUP_RSYNC_OPTIONS
|
||||
# If I'm wrong please let us know (use issue mentioned above to comment)
|
||||
|
||||
-if grep -q relative <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then
|
||||
+if grep -q -- "--relative" <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then
|
||||
BACKUP_RSYNC_OPTIONS=( $( RmInArray "--relative" "${BACKUP_RSYNC_OPTIONS[@]}" ) )
|
||||
Log "Removed option '--relative' from the BACKUP_RSYNC_OPTIONS array during $WORKFLOW workflow"
|
||||
fi
|
||||
-if grep -q "-R" <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then
|
||||
+if grep -q -- "-R" <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then
|
||||
BACKUP_RSYNC_OPTIONS=( $( RmInArray "-R" "${BACKUP_RSYNC_OPTIONS[@]}" ) )
|
||||
Log "Removed option '-R' from the BACKUP_RSYNC_OPTIONS array during $WORKFLOW workflow"
|
||||
fi
|
||||
diff --git a/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh b/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh
|
||||
index 2a0bf15e..993088be 100644
|
||||
--- a/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh
|
||||
+++ b/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh
|
||||
@@ -4,10 +4,10 @@ get_size() {
|
||||
echo $( stat --format '%s' "$TARGET_FS_ROOT/$1" )
|
||||
}
|
||||
|
||||
-mkdir -p "${TMP_DIR}/rsync/${NETFS_PREFIX}"
|
||||
-StopIfError "Could not mkdir '$TMP_DIR/rsync/${NETFS_PREFIX}'"
|
||||
+local backup_prog_rc
|
||||
+local restore_log_message
|
||||
|
||||
-LogPrint "Restoring $BACKUP_PROG archive from '${RSYNC_HOST}:${RSYNC_PATH}'"
|
||||
+LogPrint "Restoring $BACKUP_PROG backup from '${RSYNC_HOST}:${RSYNC_PATH}'"
|
||||
|
||||
ProgressStart "Restore operation"
|
||||
(
|
||||
@@ -33,9 +33,10 @@ ProgressStart "Restore operation"
|
||||
;;
|
||||
|
||||
(*)
|
||||
- # no other backup programs foreseen then rsync so far
|
||||
+ # no other backup programs foreseen than rsync so far
|
||||
:
|
||||
;;
|
||||
+
|
||||
esac
|
||||
echo $? >$TMP_DIR/retval
|
||||
) >"${TMP_DIR}/${BACKUP_PROG_ARCHIVE}-restore.log" &
|
||||
@@ -65,6 +66,7 @@ case "$(basename $BACKUP_PROG)" in
|
||||
ProgressStep
|
||||
done
|
||||
;;
|
||||
+
|
||||
esac
|
||||
ProgressStop
|
||||
|
||||
@@ -72,20 +74,28 @@ transfertime="$((SECONDS-starttime))"
|
||||
|
||||
# harvest return code from background job. The kill -0 $BackupPID loop above should
|
||||
# have made sure that this wait won't do any real "waiting" :-)
|
||||
-wait $BackupPID
|
||||
-_rc=$?
|
||||
+wait $BackupPID || LogPrintError "Restore job returned a nonzero exit code $?"
|
||||
+# harvest the actual return code of rsync. Finishing the pipeline with an error code above is actually unlikely,
|
||||
+# because rsync is not the last command in it. But error returns from rsync are common and must be handled.
|
||||
+backup_prog_rc="$(cat $TMP_DIR/retval)"
|
||||
|
||||
sleep 1
|
||||
-test "$_rc" -gt 0 && LogPrint "WARNING !
|
||||
-There was an error (${rsync_err_msg[$_rc]}) while restoring the archive.
|
||||
+if test "$backup_prog_rc" -gt 0 ; then
|
||||
+ # TODO: Shouldn't we tell the user to check ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}-restore.log as well?
|
||||
+ LogPrintError "WARNING !
|
||||
+There was an error (${rsync_err_msg[$backup_prog_rc]}) while restoring the backup.
|
||||
Please check '$RUNTIME_LOGFILE' for more information. You should also
|
||||
manually check the restored system to see whether it is complete.
|
||||
"
|
||||
+ is_true "$BACKUP_INTEGRITY_CHECK" && Error "Integrity check failed, restore aborted because BACKUP_INTEGRITY_CHECK is enabled"
|
||||
+fi
|
||||
|
||||
-_message="$(tail -14 ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}-restore.log)"
|
||||
+restore_log_message="$(tail -14 ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}-restore.log)"
|
||||
|
||||
-if [ $_rc -eq 0 -a "$_message" ] ; then
|
||||
- LogPrint "$_message in $transfertime seconds."
|
||||
+if [ $backup_prog_rc -eq 0 -a "$restore_log_message" ] ; then
|
||||
+ LogPrint "$restore_log_message in $transfertime seconds."
|
||||
elif [ "$size" ]; then
|
||||
LogPrint "Restored $((size/1024/1024)) MiB in $((transfertime)) seconds [avg $((size/1024/transfertime)) KiB/sec]"
|
||||
fi
|
||||
+
|
||||
+return $backup_prog_rc
|
||||
diff --git a/usr/share/rear/verify/RSYNC/GNU/Linux/600_check_rsync_xattr.sh b/usr/share/rear/verify/RSYNC/GNU/Linux/600_check_rsync_xattr.sh
|
||||
index 3622884a..890161f1 100644
|
||||
--- a/usr/share/rear/verify/RSYNC/GNU/Linux/600_check_rsync_xattr.sh
|
||||
+++ b/usr/share/rear/verify/RSYNC/GNU/Linux/600_check_rsync_xattr.sh
|
||||
@@ -3,8 +3,8 @@
|
||||
[[ $RSYNC_SELINUX ]] && {
|
||||
|
||||
# if --xattrs is already set; no need to do it again
|
||||
- if ! grep -q xattrs <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then
|
||||
- RSYNC_OPTIONS=( "${BACKUP_RSYNC_OPTIONS[@]}" --xattrs )
|
||||
+ if ! grep -q xattrs <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then
|
||||
+ BACKUP_RSYNC_OPTIONS+=( --xattrs )
|
||||
fi
|
||||
|
||||
}
|
||||
diff --git a/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh b/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh
|
||||
index 47ed9e02..b2fb72f5 100644
|
||||
--- a/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh
|
||||
+++ b/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh
|
||||
@@ -3,12 +3,12 @@
|
||||
case $RSYNC_PROTO in
|
||||
|
||||
(ssh)
|
||||
- ssh ${RSYNC_USER}@${RSYNC_HOST} "ls -ld ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1
|
||||
- StopIfError "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]"
|
||||
+ ssh ${RSYNC_USER}@${RSYNC_HOST} "ls -ld ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1 \
|
||||
+ || Error "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]"
|
||||
;;
|
||||
|
||||
(rsync)
|
||||
- $BACKUP_PROG "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1
|
||||
- StopIfError "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]"
|
||||
+ $BACKUP_PROG "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1 \
|
||||
+ || Error "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]"
|
||||
;;
|
||||
esac
|
274
rear-bz1945869.patch
Normal file
274
rear-bz1945869.patch
Normal file
@ -0,0 +1,274 @@
|
||||
diff --git a/usr/share/rear/finalize/Linux-i386/670_run_efibootmgr.sh b/usr/share/rear/finalize/Linux-i386/670_run_efibootmgr.sh
|
||||
old mode 100644
|
||||
new mode 100755
|
||||
index cc646359..33d87767
|
||||
--- a/usr/share/rear/finalize/Linux-i386/670_run_efibootmgr.sh
|
||||
+++ b/usr/share/rear/finalize/Linux-i386/670_run_efibootmgr.sh
|
||||
@@ -8,6 +8,10 @@ is_true $USING_UEFI_BOOTLOADER || return 0
|
||||
# (cf. finalize/Linux-i386/610_EFISTUB_run_efibootmgr.sh):
|
||||
is_true $EFI_STUB && return
|
||||
|
||||
+LogPrint "Creating EFI Boot Manager entries..."
|
||||
+
|
||||
+local esp_mountpoint esp_mountpoint_inside boot_efi_parts boot_efi_dev
|
||||
+
|
||||
# When UEFI_BOOTLOADER is not a regular file in the restored target system
|
||||
# (cf. how esp_mountpoint is set below) it means BIOS is used
|
||||
# (cf. rescue/default/850_save_sysfs_uefi_vars.sh)
|
||||
@@ -15,64 +19,80 @@ is_true $EFI_STUB && return
|
||||
# because when UEFI_BOOTLOADER is empty the test below evaluates to
|
||||
# test -f /mnt/local/
|
||||
# which also returns false because /mnt/local/ is a directory
|
||||
-# (cf. https://github.com/rear/rear/pull/2051/files#r258826856):
|
||||
-test -f "$TARGET_FS_ROOT/$UEFI_BOOTLOADER" || return 0
|
||||
+# (cf. https://github.com/rear/rear/pull/2051/files#r258826856)
|
||||
+# but using BIOS conflicts with USING_UEFI_BOOTLOADER is true
|
||||
+# i.e. we should create EFI Boot Manager entries but we cannot:
|
||||
+if ! test -f "$TARGET_FS_ROOT/$UEFI_BOOTLOADER" ; then
|
||||
+ LogPrintError "Failed to create EFI Boot Manager entries (UEFI bootloader '$UEFI_BOOTLOADER' not found under target $TARGET_FS_ROOT)"
|
||||
+ return 1
|
||||
+fi
|
||||
|
||||
# Determine where the EFI System Partition (ESP) is mounted in the currently running recovery system:
|
||||
-esp_mountpoint=$( df -P "$TARGET_FS_ROOT/$UEFI_BOOTLOADER" | tail -1 | awk '{print $6}' )
|
||||
-# Use TARGET_FS_ROOT/boot/efi as fallback ESP mountpoint:
|
||||
-test "$esp_mountpoint" || esp_mountpoint="$TARGET_FS_ROOT/boot/efi"
|
||||
+esp_mountpoint=$( filesystem_name "$TARGET_FS_ROOT/$UEFI_BOOTLOADER" )
|
||||
+# Use TARGET_FS_ROOT/boot/efi as fallback ESP mountpoint (filesystem_name returns "/"
|
||||
+# if mountpoint not found otherwise):
|
||||
+if [ "$esp_mountpoint" = "/" ] ; then
|
||||
+ esp_mountpoint="$TARGET_FS_ROOT/boot/efi"
|
||||
+ LogPrint "Mountpoint of $TARGET_FS_ROOT/$UEFI_BOOTLOADER not found, trying $esp_mountpoint"
|
||||
+fi
|
||||
|
||||
# Skip if there is no esp_mountpoint directory (e.g. the fallback ESP mountpoint may not exist).
|
||||
# Double quotes are mandatory here because 'test -d' without any (possibly empty) argument results true:
|
||||
-test -d "$esp_mountpoint" || return 0
|
||||
-
|
||||
-BootEfiDev="$( mount | grep "$esp_mountpoint" | awk '{print $1}' )"
|
||||
-# /dev/sda1 or /dev/mapper/vol34_part2 or /dev/mapper/mpath99p4
|
||||
-Dev=$( get_device_name $BootEfiDev )
|
||||
-# 1 (must anyway be a low nr <9)
|
||||
-ParNr=$( get_partition_number $Dev )
|
||||
-# /dev/sda or /dev/mapper/vol34_part or /dev/mapper/mpath99p or /dev/mmcblk0p
|
||||
-Disk=$( echo ${Dev%$ParNr} )
|
||||
-
|
||||
-# Strip trailing partition remainders like '_part' or '-part' or 'p'
|
||||
-# if we have 'mapper' in disk device name:
|
||||
-if [[ ${Dev/mapper//} != $Dev ]] ; then
|
||||
- # we only expect mpath_partX or mpathpX or mpath-partX
|
||||
- case $Disk in
|
||||
- (*p) Disk=${Disk%p} ;;
|
||||
- (*-part) Disk=${Disk%-part} ;;
|
||||
- (*_part) Disk=${Disk%_part} ;;
|
||||
- (*) Log "Unsupported kpartx partition delimiter for $Dev"
|
||||
- esac
|
||||
+if ! test -d "$esp_mountpoint" ; then
|
||||
+ LogPrintError "Failed to create EFI Boot Manager entries (no ESP mountpoint directory $esp_mountpoint)"
|
||||
+ return 1
|
||||
fi
|
||||
|
||||
-# For eMMC devices the trailing 'p' in the Disk value
|
||||
-# (as in /dev/mmcblk0p that is derived from /dev/mmcblk0p1)
|
||||
-# needs to be stripped (to get /dev/mmcblk0), otherwise the
|
||||
-# efibootmgr call fails because of a wrong disk device name.
|
||||
-# See also https://github.com/rear/rear/issues/2103
|
||||
-if [[ $Disk = *'/mmcblk'+([0-9])p ]] ; then
|
||||
- Disk=${Disk%p}
|
||||
-fi
|
||||
+# Mount point inside the target system,
|
||||
+# accounting for possible trailing slashes in TARGET_FS_ROOT
|
||||
+esp_mountpoint_inside="${esp_mountpoint#${TARGET_FS_ROOT%%*(/)}}"
|
||||
|
||||
-# For NVMe devices the trailing 'p' in the Disk value
|
||||
-# (as in /dev/nvme0n1p that is derived from /dev/nvme0n1p1)
|
||||
-# needs to be stripped (to get /dev/nvme0n1), otherwise the
|
||||
-# efibootmgr call fails because of a wrong disk device name.
|
||||
-# See also https://github.com/rear/rear/issues/1564
|
||||
-if [[ $Disk = *'/nvme'+([0-9])n+([0-9])p ]] ; then
|
||||
- Disk=${Disk%p}
|
||||
+boot_efi_parts=$( find_partition "fs:$esp_mountpoint_inside" fs )
|
||||
+if ! test "$boot_efi_parts" ; then
|
||||
+ LogPrint "Unable to find ESP $esp_mountpoint_inside in layout"
|
||||
+ LogPrint "Trying to determine device currently mounted at $esp_mountpoint as fallback"
|
||||
+ boot_efi_dev="$( mount | grep "$esp_mountpoint" | awk '{print $1}' )"
|
||||
+ if ! test "$boot_efi_dev" ; then
|
||||
+ LogPrintError "Cannot create EFI Boot Manager entry (unable to find ESP $esp_mountpoint among mounted devices)"
|
||||
+ return 1
|
||||
+ fi
|
||||
+ if test $(get_component_type "$boot_efi_dev") = part ; then
|
||||
+ boot_efi_parts="$boot_efi_dev"
|
||||
+ else
|
||||
+ boot_efi_parts=$( find_partition "$boot_efi_dev" )
|
||||
+ fi
|
||||
+ if ! test "$boot_efi_parts" ; then
|
||||
+ LogPrintError "Cannot create EFI Boot Manager entry (unable to find partition for $boot_efi_dev)"
|
||||
+ return 1
|
||||
+ fi
|
||||
+ LogPrint "Using fallback EFI boot partition(s) $boot_efi_parts (unable to find ESP $esp_mountpoint_inside in layout)"
|
||||
fi
|
||||
|
||||
+local bootloader partition_block_device partition_number disk efipart
|
||||
+
|
||||
# EFI\fedora\shim.efi
|
||||
-BootLoader=$( echo $UEFI_BOOTLOADER | cut -d"/" -f4- | sed -e 's;/;\\;g' )
|
||||
-LogPrint "Creating EFI Boot Manager entry '$OS_VENDOR $OS_VERSION' for '$BootLoader' (UEFI_BOOTLOADER='$UEFI_BOOTLOADER')"
|
||||
-Log efibootmgr --create --gpt --disk ${Disk} --part ${ParNr} --write-signature --label \"${OS_VENDOR} ${OS_VERSION}\" --loader \"\\${BootLoader}\"
|
||||
-if efibootmgr --create --gpt --disk ${Disk} --part ${ParNr} --write-signature --label "${OS_VENDOR} ${OS_VERSION}" --loader "\\${BootLoader}" ; then
|
||||
- # ok, boot loader has been set-up - tell rear we are done using following var.
|
||||
- NOBOOTLOADER=''
|
||||
- return
|
||||
-fi
|
||||
+bootloader=$( echo $UEFI_BOOTLOADER | cut -d"/" -f4- | sed -e 's;/;\\;g' )
|
||||
+
|
||||
+for efipart in $boot_efi_parts ; do
|
||||
+ # /dev/sda1 or /dev/mapper/vol34_part2 or /dev/mapper/mpath99p4
|
||||
+ partition_block_device=$( get_device_name $efipart )
|
||||
+ # 1 or 2 or 4 for the examples above
|
||||
+ partition_number=$( get_partition_number $partition_block_device )
|
||||
+ if ! disk=$( get_device_from_partition $partition_block_device $partition_number ) ; then
|
||||
+ LogPrintError "Cannot create EFI Boot Manager entry for ESP $partition_block_device (unable to find the underlying disk)"
|
||||
+ # do not error out - we may be able to locate other disks if there are more of them
|
||||
+ continue
|
||||
+ fi
|
||||
+ LogPrint "Creating EFI Boot Manager entry '$OS_VENDOR $OS_VERSION' for '$bootloader' (UEFI_BOOTLOADER='$UEFI_BOOTLOADER') "
|
||||
+ Log efibootmgr --create --gpt --disk $disk --part $partition_number --write-signature --label \"${OS_VENDOR} ${OS_VERSION}\" --loader \"\\${bootloader}\"
|
||||
+ if efibootmgr --create --gpt --disk $disk --part $partition_number --write-signature --label "${OS_VENDOR} ${OS_VERSION}" --loader "\\${bootloader}" ; then
|
||||
+ # ok, boot loader has been set-up - continue with other disks (ESP can be on RAID)
|
||||
+ NOBOOTLOADER=''
|
||||
+ else
|
||||
+ LogPrintError "efibootmgr failed to create EFI Boot Manager entry on $disk partition $partition_number (ESP $partition_block_device )"
|
||||
+ fi
|
||||
+done
|
||||
|
||||
-LogPrintError "efibootmgr failed to create EFI Boot Manager entry for '$BootLoader' (UEFI_BOOTLOADER='$UEFI_BOOTLOADER')"
|
||||
+is_true $NOBOOTLOADER || return 0
|
||||
+LogPrintError "efibootmgr failed to create EFI Boot Manager entry for '$bootloader' (UEFI_BOOTLOADER='$UEFI_BOOTLOADER')"
|
||||
+return 1
|
||||
diff --git a/usr/share/rear/lib/layout-functions.sh b/usr/share/rear/lib/layout-functions.sh
|
||||
index 54ddb50f..cdd81a14 100644
|
||||
--- a/usr/share/rear/lib/layout-functions.sh
|
||||
+++ b/usr/share/rear/lib/layout-functions.sh
|
||||
@@ -302,12 +302,20 @@ get_child_components() {
|
||||
done
|
||||
}
|
||||
|
||||
-# Return all ancestors of component $1 [ of type $2 ]
|
||||
+# Return all ancestors of component $1 [ of type $2 [ skipping types $3 during resolution ] ]
|
||||
get_parent_components() {
|
||||
- declare -a ancestors devlist
|
||||
- declare current child parent
|
||||
+ declare -a ancestors devlist ignoretypes
|
||||
+ declare current child parent parenttype
|
||||
|
||||
devlist=( "$1" )
|
||||
+ if [[ "$3" ]] ; then
|
||||
+ # third argument should, if present, be a space-separated list
|
||||
+ # of types to ignore when walking up the dependency tree.
|
||||
+ # Convert it to array
|
||||
+ ignoretypes=( $3 )
|
||||
+ else
|
||||
+ ignoretypes=()
|
||||
+ fi
|
||||
while (( ${#devlist[@]} )) ; do
|
||||
current=${devlist[0]}
|
||||
|
||||
@@ -318,6 +326,13 @@ get_parent_components() {
|
||||
if IsInArray "$parent" "${ancestors[@]}" ; then
|
||||
continue
|
||||
fi
|
||||
+ ### ...test if parent is of a correct type if requested...
|
||||
+ if [[ ${#ignoretypes[@]} -gt 0 ]] ; then
|
||||
+ parenttype=$(get_component_type "$parent")
|
||||
+ if IsInArray "$parenttype" "${ignoretypes[@]}" ; then
|
||||
+ continue
|
||||
+ fi
|
||||
+ fi
|
||||
### ...and add them to the list
|
||||
devlist+=( "$parent" )
|
||||
ancestors+=( "$parent" )
|
||||
@@ -345,22 +360,24 @@ get_parent_components() {
|
||||
}
|
||||
|
||||
# find_devices <other>
|
||||
+# ${2+"$2"} in the following functions ensures that $2 gets passed down quoted if present
|
||||
+# and ignored if not present
|
||||
# Find the disk device(s) component $1 resides on.
|
||||
find_disk() {
|
||||
- get_parent_components "$1" "disk"
|
||||
+ get_parent_components "$1" "disk" ${2+"$2"}
|
||||
}
|
||||
|
||||
find_multipath() {
|
||||
- get_parent_components "$1" "multipath"
|
||||
+ get_parent_components "$1" "multipath" ${2+"$2"}
|
||||
}
|
||||
|
||||
find_disk_and_multipath() {
|
||||
- find_disk "$1"
|
||||
- is_true "$AUTOEXCLUDE_MULTIPATH" || find_multipath "$1"
|
||||
+ find_disk "$1" ${2+"$2"}
|
||||
+ is_true "$AUTOEXCLUDE_MULTIPATH" || find_multipath "$1" ${2+"$2"}
|
||||
}
|
||||
|
||||
find_partition() {
|
||||
- get_parent_components "$1" "part"
|
||||
+ get_parent_components "$1" "part" ${2+"$2"}
|
||||
}
|
||||
|
||||
# The get_partition_number function
|
||||
@@ -413,6 +430,54 @@ get_partition_number() {
|
||||
echo $partition_number
|
||||
}
|
||||
|
||||
+# Extract the underlying device name from the full partition device name.
|
||||
+# Underlying device may be a disk, a multipath device or other devices that can be partitioned.
|
||||
+# Should we use the information in $LAYOUT_DEPS, like get_parent_component does,
|
||||
+# instead of string munging?
|
||||
+function get_device_from_partition() {
|
||||
+ local partition_block_device
|
||||
+ local device
|
||||
+ local partition_number
|
||||
+
|
||||
+ partition_block_device=$1
|
||||
+ test -b "$partition_block_device" || BugError "get_device_from_partition called with '$partition_block_device' that is no block device"
|
||||
+ partition_number=${2-$(get_partition_number $partition_block_device )}
|
||||
+ # /dev/sda or /dev/mapper/vol34_part or /dev/mapper/mpath99p or /dev/mmcblk0p
|
||||
+ device=${partition_block_device%$partition_number}
|
||||
+
|
||||
+ # Strip trailing partition remainders like '_part' or '-part' or 'p'
|
||||
+ # if we have 'mapper' in disk device name:
|
||||
+ if [[ ${partition_block_device/mapper//} != $partition_block_device ]] ; then
|
||||
+ # we only expect mpath_partX or mpathpX or mpath-partX
|
||||
+ case $device in
|
||||
+ (*p) device=${device%p} ;;
|
||||
+ (*-part) device=${device%-part} ;;
|
||||
+ (*_part) device=${device%_part} ;;
|
||||
+ (*) Log "Unsupported kpartx partition delimiter for $partition_block_device"
|
||||
+ esac
|
||||
+ fi
|
||||
+
|
||||
+ # For eMMC devices the trailing 'p' in the $device value
|
||||
+ # (as in /dev/mmcblk0p that is derived from /dev/mmcblk0p1)
|
||||
+ # needs to be stripped (to get /dev/mmcblk0), otherwise the
|
||||
+ # efibootmgr call fails because of a wrong disk device name.
|
||||
+ # See also https://github.com/rear/rear/issues/2103
|
||||
+ if [[ $device = *'/mmcblk'+([0-9])p ]] ; then
|
||||
+ device=${device%p}
|
||||
+ fi
|
||||
+
|
||||
+ # For NVMe devices the trailing 'p' in the $device value
|
||||
+ # (as in /dev/nvme0n1p that is derived from /dev/nvme0n1p1)
|
||||
+ # needs to be stripped (to get /dev/nvme0n1), otherwise the
|
||||
+ # efibootmgr call fails because of a wrong disk device name.
|
||||
+ # See also https://github.com/rear/rear/issues/1564
|
||||
+ if [[ $device = *'/nvme'+([0-9])n+([0-9])p ]] ; then
|
||||
+ device=${device%p}
|
||||
+ fi
|
||||
+
|
||||
+ test -b "$device" && echo $device
|
||||
+}
|
||||
+
|
||||
# Returns partition start block or 'unknown'
|
||||
# sda/sda1 or
|
||||
# dm-XX
|
2040
rear-bz1958247.patch
Normal file
2040
rear-bz1958247.patch
Normal file
File diff suppressed because it is too large
Load Diff
68
rear-bz1983013.patch
Normal file
68
rear-bz1983013.patch
Normal file
@ -0,0 +1,68 @@
|
||||
diff --git a/usr/share/rear/conf/Linux-ppc64.conf b/usr/share/rear/conf/Linux-ppc64.conf
|
||||
index 7e20ddc7..d7774062 100644
|
||||
--- a/usr/share/rear/conf/Linux-ppc64.conf
|
||||
+++ b/usr/share/rear/conf/Linux-ppc64.conf
|
||||
@@ -1,18 +1,26 @@
|
||||
-REQUIRED_PROGS+=( sfdisk )
|
||||
+REQUIRED_PROGS+=( sfdisk ofpathname )
|
||||
|
||||
PROGS+=(
|
||||
mkofboot
|
||||
ofpath
|
||||
ybin
|
||||
yabootconfig
|
||||
-bootlist
|
||||
pseries_platform
|
||||
nvram
|
||||
-ofpathname
|
||||
bc
|
||||
agetty
|
||||
)
|
||||
|
||||
+if grep -q "emulated by qemu" /proc/cpuinfo ; then
|
||||
+ # Qemu/KVM virtual machines don't need bootlist - don't complain if
|
||||
+ # it is missing
|
||||
+ PROGS+=( bootlist )
|
||||
+else
|
||||
+ # PowerVM environment, we need to run bootlist, otherwise
|
||||
+ # we can't make the system bpotable. Be strict about requiring it
|
||||
+ REQUIRED_PROGS+=( bootlist )
|
||||
+fi
|
||||
+
|
||||
COPY_AS_IS+=(
|
||||
/usr/lib/yaboot/yaboot
|
||||
/usr/lib/yaboot/ofboot
|
||||
diff --git a/usr/share/rear/conf/Linux-ppc64le.conf b/usr/share/rear/conf/Linux-ppc64le.conf
|
||||
index d00154a2..df8066ea 100644
|
||||
--- a/usr/share/rear/conf/Linux-ppc64le.conf
|
||||
+++ b/usr/share/rear/conf/Linux-ppc64le.conf
|
||||
@@ -1,10 +1,8 @@
|
||||
REQUIRED_PROGS+=( sfdisk )
|
||||
|
||||
PROGS+=(
|
||||
-bootlist
|
||||
pseries_platform
|
||||
nvram
|
||||
-ofpathname
|
||||
bc
|
||||
agetty
|
||||
)
|
||||
@@ -17,4 +15,18 @@ agetty
|
||||
if [[ $(awk '/platform/ {print $NF}' < /proc/cpuinfo) != PowerNV ]] ; then
|
||||
# No firmware files when ppc64le Linux is not run in BareMetal Mode (PowerNV):
|
||||
test "${FIRMWARE_FILES[*]}" || FIRMWARE_FILES=( 'no' )
|
||||
+ # grub2-install for powerpc-ieee1275 calls ofpathname, so without it,
|
||||
+ # the rescue system can't make the recovered system bootable
|
||||
+ REQUIRED_PROGS+=( ofpathname )
|
||||
+ if grep -q "emulated by qemu" /proc/cpuinfo ; then
|
||||
+ # Qemu/KVM virtual machines don't need bootlist - don't complain if
|
||||
+ # it is missing
|
||||
+ PROGS+=( bootlist )
|
||||
+ else
|
||||
+ # PowerVM environment, we need to run bootlist, otherwise
|
||||
+ # we can't make the system bpotable. Be strict about requiring it
|
||||
+ REQUIRED_PROGS+=( bootlist )
|
||||
+ fi
|
||||
+else
|
||||
+ PROGS+=( ofpathname bootlist )
|
||||
fi
|
34
rear-bz1993296.patch
Normal file
34
rear-bz1993296.patch
Normal file
@ -0,0 +1,34 @@
|
||||
From 4233fe30b315737ac8c4d857e2b04e021c2e2886 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Cahyna <pcahyna@redhat.com>
|
||||
Date: Mon, 16 Aug 2021 10:10:38 +0300
|
||||
Subject: [PATCH] Revert the main part of PR #2299
|
||||
|
||||
multipath -l is very slow with many multipath devices. As it will be
|
||||
called for every multipath device, it leads to quadratic time complexity
|
||||
in the number of multipath devices. For thousands of devices, ReaR can
|
||||
take hours to scan and exclude them. We therefore have to comment
|
||||
multipath -l out, as it is a huge performance regression, and find
|
||||
another solution to bug #2298.
|
||||
---
|
||||
usr/share/rear/lib/layout-functions.sh | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/usr/share/rear/lib/layout-functions.sh b/usr/share/rear/lib/layout-functions.sh
|
||||
index cdd81a14..8c8be74b 100644
|
||||
--- a/usr/share/rear/lib/layout-functions.sh
|
||||
+++ b/usr/share/rear/lib/layout-functions.sh
|
||||
@@ -771,7 +771,10 @@ function is_multipath_path {
|
||||
# so that no "multipath -l" output could clutter the log (the "multipath -l" output is irrelevant here)
|
||||
# in contrast to e.g. test "$( multipath -l )" that would falsely succeed with blank output
|
||||
# and the output would appear in the log in 'set -x' debugscript mode:
|
||||
- multipath -l | grep -q '[[:alnum:]]' || return 1
|
||||
+ #
|
||||
+ # Unfortunately, multipat -l is quite slow with many multipath devices
|
||||
+ # and becomes a performance bottleneck, so we must comment it out for now.
|
||||
+ #multipath -l | grep -q '[[:alnum:]]' || return 1
|
||||
# Check if a block device should be a path in a multipath device:
|
||||
multipath -c /dev/$1 &>/dev/null
|
||||
}
|
||||
--
|
||||
2.26.3
|
||||
|
56
rear-bz2035939.patch
Normal file
56
rear-bz2035939.patch
Normal file
@ -0,0 +1,56 @@
|
||||
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
|
||||
index 0c230f38..f231bf3d 100644
|
||||
--- a/usr/share/rear/conf/default.conf
|
||||
+++ b/usr/share/rear/conf/default.conf
|
||||
@@ -2707,6 +2707,15 @@ WARN_MISSING_VOL_ID=1
|
||||
USE_CFG2HTML=
|
||||
# The SKIP_CFG2HTML variable is no longer supported since ReaR 1.18
|
||||
|
||||
+# IP addresses that are present on the system but must be excluded when
|
||||
+# building the network configuration used in recovery mode; this is typically
|
||||
+# used when floating IP addresses are used on the system
|
||||
+EXCLUDE_IP_ADDRESSES=()
|
||||
+
|
||||
+# Network interfaces that are present on the system but must be excluded when
|
||||
+# building the network configuration used in recovery mode
|
||||
+EXCLUDE_NETWORK_INTERFACES=()
|
||||
+
|
||||
# Simplify bonding setups by configuring always the first active device of a
|
||||
# bond, except when mode is 4 (IEEE 802.3ad policy)
|
||||
SIMPLIFY_BONDING=no
|
||||
diff --git a/usr/share/rear/rescue/GNU/Linux/310_network_devices.sh b/usr/share/rear/rescue/GNU/Linux/310_network_devices.sh
|
||||
index f806bfbf..2385f5b6 100644
|
||||
--- a/usr/share/rear/rescue/GNU/Linux/310_network_devices.sh
|
||||
+++ b/usr/share/rear/rescue/GNU/Linux/310_network_devices.sh
|
||||
@@ -355,6 +355,11 @@ function is_interface_up () {
|
||||
local network_interface=$1
|
||||
local sysfspath=/sys/class/net/$network_interface
|
||||
|
||||
+ if IsInArray "$network_interface" "${EXCLUDE_NETWORK_INTERFACES[@]}"; then
|
||||
+ LogPrint "Excluding '$network_interface' per EXCLUDE_NETWORK_INTERFACES directive."
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
local state=$( cat $sysfspath/operstate )
|
||||
if [ "$state" = "down" ] ; then
|
||||
return 1
|
||||
@@ -403,11 +408,19 @@ function ipaddr_setup () {
|
||||
if [ -n "$ipaddrs" ] ; then
|
||||
# If some IP is found for the network interface, then use them
|
||||
for ipaddr in $ipaddrs ; do
|
||||
+ if IsInArray "${ipaddr%%/*}" "${EXCLUDE_IP_ADDRESSES[@]}"; then
|
||||
+ LogPrint "Excluding IP address '$ipaddr' per EXCLUDE_IP_ADDRESSES directive even through it's defined in mapping file '$CONFIG_DIR/mappings/ip_addresses'."
|
||||
+ continue
|
||||
+ fi
|
||||
echo "ip addr add $ipaddr dev $mapped_as"
|
||||
done
|
||||
else
|
||||
# Otherwise, collect IP addresses for the network interface on the system
|
||||
for ipaddr in $( ip a show dev $network_interface scope global | grep "inet.*\ " | tr -s " " | cut -d " " -f 3 ) ; do
|
||||
+ if IsInArray "${ipaddr%%/*}" "${EXCLUDE_IP_ADDRESSES[@]}"; then
|
||||
+ LogPrint "Excluding IP address '$ipaddr' per EXCLUDE_IP_ADDRESSES directive."
|
||||
+ continue
|
||||
+ fi
|
||||
echo "ip addr add $ipaddr dev $mapped_as"
|
||||
done
|
||||
fi
|
78
rear-bz2048454.patch
Normal file
78
rear-bz2048454.patch
Normal file
@ -0,0 +1,78 @@
|
||||
diff --git a/usr/share/rear/layout/save/GNU/Linux/220_lvm_layout.sh b/usr/share/rear/layout/save/GNU/Linux/220_lvm_layout.sh
|
||||
index 35be1721..d3c9ae86 100644
|
||||
--- a/usr/share/rear/layout/save/GNU/Linux/220_lvm_layout.sh
|
||||
+++ b/usr/share/rear/layout/save/GNU/Linux/220_lvm_layout.sh
|
||||
@@ -103,12 +103,7 @@ local lvs_exit_code
|
||||
pdev=$( get_device_name $pdev )
|
||||
|
||||
# Output lvmdev entry to DISKLAYOUT_FILE:
|
||||
- # With the above example the output is:
|
||||
- # lvmdev /dev/system /dev/sda1 7wwpcO-KmNN-qsTE-7sp7-JBJS-vBdC-Zyt1W7 41940992
|
||||
- echo "lvmdev /dev/$vgrp $pdev $uuid $size"
|
||||
-
|
||||
- # After the 'lvmdev' line was written to disklayout.conf so that the user can inspect it
|
||||
- # check that the required positional parameters in the 'lvmdev' line are non-empty
|
||||
+ # Check that the required positional parameters in the 'lvmdev' line are non-empty
|
||||
# because an empty positional parameter would result an invalid 'lvmdev' line
|
||||
# which would cause invalid parameters are 'read' as input during "rear recover"
|
||||
# cf. "Verifying ... 'lvm...' entries" in layout/save/default/950_verify_disklayout_file.sh
|
||||
@@ -117,13 +112,24 @@ local lvs_exit_code
|
||||
# so that this also checks that the variables do not contain blanks or more than one word
|
||||
# because blanks (actually $IFS characters) are used as field separators in disklayout.conf
|
||||
# which means the positional parameter values must be exactly one non-empty word.
|
||||
- # Two separated simple 'test $vgrp && test $pdev' commands are used here because
|
||||
- # 'test $vgrp -a $pdev' does not work when $vgrp is empty or only blanks
|
||||
- # because '-a' has two different meanings: "EXPR1 -a EXPR2" and "-a FILE" (see "help test")
|
||||
- # so that when $vgrp is empty 'test $vgrp -a $pdev' tests if file $pdev exists
|
||||
- # which is usually true because $pdev is usually a partition device node (e.g. /dev/sda1)
|
||||
- # so that when $vgrp is empty 'test $vgrp -a $pdev' would falsely succeed:
|
||||
- test $vgrp && test $pdev || Error "LVM 'lvmdev' entry in $DISKLAYOUT_FILE where volume_group or device is empty or more than one word"
|
||||
+ test $pdev || Error "Cannot make 'lvmdev' entry in disklayout.conf (PV device '$pdev' empty or more than one word)"
|
||||
+ if ! test $vgrp ; then
|
||||
+ # Valid $pdev but invalid $vgrp (empty or more than one word):
|
||||
+ # When $vgrp is empty it means it is a PV that is not part of a VG so the PV exists but it is not used.
|
||||
+ # PVs that are not part of a VG are documented as comment in disklayout.conf but they are not recreated
|
||||
+ # because they were not used on the original system so there is no need to recreate them by "rear recover"
|
||||
+ # (the user can manually recreate them later in his recreated system when needed)
|
||||
+ # cf. https://github.com/rear/rear/issues/2596
|
||||
+ DebugPrint "Skipping PV $pdev that is not part of a valid VG (VG '$vgrp' empty or more than one word)"
|
||||
+ echo "# Skipping PV $pdev that is not part of a valid VG (VG '$vgrp' empty or more than one word):"
|
||||
+ contains_visible_char "$vgrp" || vgrp='<missing_VG>'
|
||||
+ echo "# lvmdev /dev/$vgrp $pdev $uuid $size"
|
||||
+ # Continue with the next line in the output of "lvm pvdisplay -c"
|
||||
+ continue
|
||||
+ fi
|
||||
+ # With the above example the output is:
|
||||
+ # lvmdev /dev/system /dev/sda1 7wwpcO-KmNN-qsTE-7sp7-JBJS-vBdC-Zyt1W7 41940992
|
||||
+ echo "lvmdev /dev/$vgrp $pdev $uuid $size"
|
||||
|
||||
done
|
||||
# Check the exit code of "lvm pvdisplay -c"
|
||||
@@ -161,8 +167,15 @@ local lvs_exit_code
|
||||
# lvmgrp /dev/system 4096 5119 20967424
|
||||
echo "lvmgrp /dev/$vgrp $extentsize $nrextents $size"
|
||||
|
||||
- # Check that the required positional parameters in the 'lvmgrp' line are non-empty
|
||||
- # cf. the code above to "check that the required positional parameters in the 'lvmdev' line are non-empty":
|
||||
+ # Check that the required positional parameters in the 'lvmgrp' line are non-empty.
|
||||
+ # The tested variables are intentionally not quoted here, cf. the code above to
|
||||
+ # "check that the required positional parameters in the 'lvmdev' line are non-empty".
|
||||
+ # Two separated simple 'test $vgrp && test $extentsize' commands are used here because
|
||||
+ # 'test $vgrp -a $extentsize' does not work when $vgrp is empty or only blanks
|
||||
+ # because '-a' has two different meanings: "EXPR1 -a EXPR2" and "-a FILE" (see "help test")
|
||||
+ # so with empty $vgrp it becomes 'test -a $extentsize' that tests if a file $extentsize exists
|
||||
+ # which is unlikely to be true but it is not impossible that a file $extentsize exists
|
||||
+ # so when $vgrp is empty (or blanks) 'test $vgrp -a $extentsize' might falsely succeed:
|
||||
test $vgrp && test $extentsize || Error "LVM 'lvmgrp' entry in $DISKLAYOUT_FILE where volume_group or extentsize is empty or more than one word"
|
||||
|
||||
done
|
||||
@@ -305,7 +318,8 @@ local lvs_exit_code
|
||||
fi
|
||||
already_processed_lvs+=( "$vg/$lv" )
|
||||
# Check that the required positional parameters in the 'lvmvol' line are non-empty
|
||||
- # cf. the code above to "check that the required positional parameters in the 'lvmdev' line are non-empty":
|
||||
+ # cf. the code above to "check that the required positional parameters in the 'lvmdev' line are non-empty"
|
||||
+ # and the code above to "check that the required positional parameters in the 'lvmgrp' line are non-empty":
|
||||
test $vg && test $lv && test $size && test $layout || Error "LVM 'lvmvol' entry in $DISKLAYOUT_FILE where volume_group or name or size or layout is empty or more than one word"
|
||||
fi
|
||||
|
25
rear-bz2049091.patch
Normal file
25
rear-bz2049091.patch
Normal file
@ -0,0 +1,25 @@
|
||||
diff --git a/usr/share/rear/layout/save/default/335_remove_excluded_multipath_vgs.sh b/usr/share/rear/layout/save/default/335_remove_excluded_multipath_vgs.sh
|
||||
index 040e9eec..e731c994 100644
|
||||
--- a/usr/share/rear/layout/save/default/335_remove_excluded_multipath_vgs.sh
|
||||
+++ b/usr/share/rear/layout/save/default/335_remove_excluded_multipath_vgs.sh
|
||||
@@ -19,9 +19,9 @@ while read lvmdev name mpdev junk ; do
|
||||
# Remember, multipath devices from a volume group that is "excluded" should be 'commented out'
|
||||
device=$(echo $mpdev | cut -c1-45)
|
||||
while read LINE ; do
|
||||
- # Now we need to comment all lines that contain "$devices" in the LAYOUT_FILE
|
||||
+ # Now we need to comment all lines that contain "$device" in the LAYOUT_FILE
|
||||
sed -i "s|^$LINE|\#$LINE|" "$LAYOUT_FILE"
|
||||
- done < <(grep "$device" $LAYOUT_FILE | grep -v "^#")
|
||||
+ done < <(grep " $device " $LAYOUT_FILE | grep -v "^#")
|
||||
Log "Excluding multipath device $device"
|
||||
done < <(grep "^#lvmdev" $LAYOUT_FILE)
|
||||
|
||||
@@ -31,7 +31,7 @@ done < <(grep "^#lvmdev" $LAYOUT_FILE)
|
||||
while read LINE ; do
|
||||
# multipath /dev/mapper/360060e8007e2e3000030e2e300002065 /dev/sdae,/dev/sdat,/dev/sdbi,/dev/sdp
|
||||
device=$(echo $LINE | awk '{print $2}' | cut -c1-45)
|
||||
- num=$(grep "$device" $LAYOUT_FILE | grep -v "^#" | wc -l)
|
||||
+ num=$(grep " $device " $LAYOUT_FILE | grep -v "^#" | wc -l)
|
||||
if [ $num -lt 2 ] ; then
|
||||
# If the $device is only seen once (in a uncommented line) then the multipath is not in use
|
||||
sed -i "s|^$LINE|\#$LINE|" "$LAYOUT_FILE"
|
60
rear-pr2675.patch
Normal file
60
rear-pr2675.patch
Normal file
@ -0,0 +1,60 @@
|
||||
diff --git a/usr/share/rear/lib/framework-functions.sh b/usr/share/rear/lib/framework-functions.sh
|
||||
index 4878216b..e919bdbf 100644
|
||||
--- a/usr/share/rear/lib/framework-functions.sh
|
||||
+++ b/usr/share/rear/lib/framework-functions.sh
|
||||
@@ -121,7 +121,7 @@ function cleanup_build_area_and_end_program () {
|
||||
sleep 2
|
||||
umount_mountpoint_lazy $BUILD_DIR/outputfs
|
||||
fi
|
||||
- remove_temporary_mountpoint '$BUILD_DIR/outputfs' || BugError "Directory $BUILD_DIR/outputfs not empty, can not remove"
|
||||
+ remove_temporary_mountpoint "$BUILD_DIR/outputfs" || BugError "Directory $BUILD_DIR/outputfs not empty, can not remove"
|
||||
rmdir $v $BUILD_DIR >&2
|
||||
fi
|
||||
Log "End of program reached"
|
||||
diff --git a/usr/share/rear/lib/global-functions.sh b/usr/share/rear/lib/global-functions.sh
|
||||
index c1a11615..0f8f362d 100644
|
||||
--- a/usr/share/rear/lib/global-functions.sh
|
||||
+++ b/usr/share/rear/lib/global-functions.sh
|
||||
@@ -317,7 +317,20 @@ function url_path() {
|
||||
|
||||
### Returns true if one can upload files to the URL
|
||||
function scheme_accepts_files() {
|
||||
- local scheme=$1
|
||||
+ # Be safe against 'set -eu' which would exit 'rear' with "bash: $1: unbound variable"
|
||||
+ # when scheme_accepts_files is called without an argument
|
||||
+ # by bash parameter expansion with using an empty default value if $1 is unset or null.
|
||||
+ # Bash parameter expansion with assigning a default value ${1:=} does not work
|
||||
+ # (then it would still exit with "bash: $1: cannot assign in this way")
|
||||
+ # but using a default value is practicable here because $1 is used only once
|
||||
+ # cf. https://github.com/rear/rear/pull/2675#discussion_r705018956
|
||||
+ local scheme=${1:-}
|
||||
+ # Return false if scheme is empty or blank (e.g. when OUTPUT_URL is unset or empty or blank)
|
||||
+ # cf. https://github.com/rear/rear/issues/2676
|
||||
+ # and https://github.com/rear/rear/issues/2667#issuecomment-914447326
|
||||
+ # also return false if scheme is more than one word (so no quoted "$scheme" here)
|
||||
+ # cf. https://github.com/rear/rear/pull/2675#discussion_r704401462
|
||||
+ test $scheme || return 1
|
||||
case $scheme in
|
||||
(null|tape|obdr)
|
||||
# tapes do not support uploading arbitrary files, one has to handle them
|
||||
@@ -341,7 +354,10 @@ function scheme_accepts_files() {
|
||||
### Returning true does not imply that the URL is currently mounted at a filesystem and usable,
|
||||
### only that it can be mounted (use mount_url() first)
|
||||
function scheme_supports_filesystem() {
|
||||
- local scheme=$1
|
||||
+ # Be safe against 'set -eu' exit if scheme_supports_filesystem is called without argument
|
||||
+ local scheme=${1:-}
|
||||
+ # Return false if scheme is empty or blank or more than one word, cf. scheme_accepts_files() above
|
||||
+ test $scheme || return 1
|
||||
case $scheme in
|
||||
(null|tape|obdr|rsync|fish|ftp|ftps|hftp|http|https|sftp)
|
||||
return 1
|
||||
@@ -560,7 +576,7 @@ function umount_url() {
|
||||
|
||||
RemoveExitTask "perform_umount_url '$url' '$mountpoint' lazy"
|
||||
|
||||
- remove_temporary_mountpoint '$mountpoint' && RemoveExitTask "remove_temporary_mountpoint '$mountpoint'"
|
||||
+ remove_temporary_mountpoint "$mountpoint" && RemoveExitTask "remove_temporary_mountpoint '$mountpoint'"
|
||||
return 0
|
||||
}
|
||||
|
38
rear-sfdc02772301.patch
Normal file
38
rear-sfdc02772301.patch
Normal file
@ -0,0 +1,38 @@
|
||||
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
|
||||
index 9ada92c3..455aa3ce 100644
|
||||
--- a/usr/share/rear/conf/default.conf
|
||||
+++ b/usr/share/rear/conf/default.conf
|
||||
@@ -1813,7 +1813,7 @@ OBDR_BLOCKSIZE=2048
|
||||
# BACKUP=NBU stuff (Symantec/Veritas NetBackup)
|
||||
##
|
||||
#
|
||||
-COPY_AS_IS_NBU=( /usr/openv/bin/vnetd /usr/openv/bin/vopied /usr/openv/lib /usr/openv/netbackup /usr/openv/var/auth/[mn]*.txt )
|
||||
+COPY_AS_IS_NBU=( /usr/openv/bin/vnetd /usr/openv/bin/vopied /usr/openv/lib /usr/openv/netbackup /usr/openv/var/auth/[mn]*.txt /opt/VRTSpbx /etc/vx/VxICS /etc/vx/vrtslog.conf )
|
||||
COPY_AS_IS_EXCLUDE_NBU=( /usr/openv/netbackup/logs "/usr/openv/netbackup/bin/bpjava*" /usr/openv/netbackup/bin/xbp /usr/openv/netbackup/bin/private /usr/openv/lib/java /usr/openv/lib/shared/vddk /usr/openv/netbackup/baremetal )
|
||||
# See https://github.com/rear/rear/issues/2105 why /usr/openv/netbackup/sec/at/lib/ is needed:
|
||||
NBU_LD_LIBRARY_PATH="/usr/openv/lib:/usr/openv/netbackup/sec/at/lib/"
|
||||
diff --git a/usr/share/rear/rescue/NBU/default/450_prepare_netbackup.sh b/usr/share/rear/rescue/NBU/default/450_prepare_netbackup.sh
|
||||
index cd48b8d9..ae5a3ccc 100644
|
||||
--- a/usr/share/rear/rescue/NBU/default/450_prepare_netbackup.sh
|
||||
+++ b/usr/share/rear/rescue/NBU/default/450_prepare_netbackup.sh
|
||||
@@ -7,6 +7,12 @@
|
||||
|
||||
[[ $NBU_version -lt 7 ]] && return # NBU is using xinetd when version <7.x
|
||||
|
||||
+if [ -e "/etc/init.d/vxpbx_exchanged" ]; then
|
||||
+ cp $v /etc/init.d/vxpbx_exchanged $ROOTFS_DIR/etc/scripts/system-setup.d/vxpbx_exchanged.real
|
||||
+ chmod $v +x $ROOTFS_DIR/etc/scripts/system-setup.d/vxpbx_exchanged.real
|
||||
+ echo "( /etc/scripts/system-setup.d/vxpbx_exchanged.real start )" > $ROOTFS_DIR/etc/scripts/system-setup.d/89-vxpbx_exchanged.sh
|
||||
+fi
|
||||
+
|
||||
if [ -e "/etc/init.d/netbackup" ]; then
|
||||
cp $v /etc/init.d/netbackup $ROOTFS_DIR/etc/scripts/system-setup.d/netbackup.real
|
||||
chmod $v +x $ROOTFS_DIR/etc/scripts/system-setup.d/netbackup.real
|
||||
diff --git a/usr/share/rear/skel/NBU/usr/openv/tmp/.gitignore b/usr/share/rear/skel/NBU/usr/openv/tmp/.gitignore
|
||||
new file mode 100644
|
||||
index 00000000..d6b7ef32
|
||||
--- /dev/null
|
||||
+++ b/usr/share/rear/skel/NBU/usr/openv/tmp/.gitignore
|
||||
@@ -0,0 +1,2 @@
|
||||
+*
|
||||
+!.gitignore
|
387
rear.spec
Normal file
387
rear.spec
Normal file
@ -0,0 +1,387 @@
|
||||
%define debug_package %{nil}
|
||||
|
||||
Summary: Relax-and-Recover is a Linux disaster recovery and system migration tool
|
||||
Name: rear
|
||||
Version: 2.6
|
||||
Release: 4%{?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
|
||||
Patch29: rear-bz1832394.patch
|
||||
Patch30: rear-sfdc02772301.patch
|
||||
Patch31: rear-bz1945869.patch
|
||||
Patch32: rear-bz1958247.patch
|
||||
Patch33: rear-bz1930662.patch
|
||||
Patch34: rear-asciidoc.patch
|
||||
Patch35: rear-bz1983013.patch
|
||||
Patch36: rear-bz1993296.patch
|
||||
Patch37: rear-bz1747468.patch
|
||||
Patch38: rear-bz2049091.patch
|
||||
Patch39: rear-pr2675.patch
|
||||
Patch40: rear-bz2048454.patch
|
||||
Patch41: rear-bz2035939.patch
|
||||
|
||||
### 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
|
||||
Requires: file
|
||||
Requires: dhcp-client
|
||||
|
||||
### 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
|
||||
|
||||
%ifarch ppc ppc64 ppc64le
|
||||
# Called by grub2-install (except on PowerNV)
|
||||
Requires: /usr/sbin/ofpathname
|
||||
# Needed to make PowerVM LPARs bootable
|
||||
Requires: /usr/sbin/bootlist
|
||||
%endif
|
||||
|
||||
Requires: crontabs
|
||||
Requires: iproute
|
||||
# No ISO image support on s390x (may change when we add support for LPARs)
|
||||
%ifnarch s390x
|
||||
Requires: xorriso
|
||||
%endif
|
||||
|
||||
# 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
|
||||
%patch29 -p1
|
||||
%patch30 -p1
|
||||
%patch31 -p1
|
||||
%patch32 -p1
|
||||
%patch33 -p1
|
||||
%patch34 -p1
|
||||
%patch35 -p1
|
||||
%patch36 -p1
|
||||
%patch37 -p1
|
||||
%patch38 -p1
|
||||
%patch39 -p1
|
||||
%patch40 -p1
|
||||
%patch41 -p1
|
||||
|
||||
echo "30 1 * * * root test -f /var/lib/rear/layout/disklayout.conf && /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
|
||||
* Sun Feb 27 2022 Pavel Cahyna <pcahyna@redhat.com> - 2.6-4
|
||||
- Apply PR2675 to fix leftover temp dir bug (introduced in backported PR2625)
|
||||
- Apply PR2603 to ignore unused PV devices
|
||||
- Apply upstream PR2750 to avoid exclusion of wanted multipath devices
|
||||
- Remove unneeded xorriso dep on s390x (no ISO image support there)
|
||||
- Apply upstream PR2736 to add the EXCLUDE_{IP_ADDRESSES,NETWORK_INTERFACES}
|
||||
options
|
||||
|
||||
* Mon Aug 30 2021 Pavel Cahyna <pcahyna@redhat.com> - 2.6-3
|
||||
- Add patch for better handling of thin pools and other LV types not supported
|
||||
by vgcfgrestore
|
||||
Resolves: rhbz1747468
|
||||
|
||||
* Mon Aug 16 2021 Pavel Cahyna <pcahyna@redhat.com> - 2.6-2
|
||||
- Fix multipath performance regression in 2.6, introduced by upstream PR #2299.
|
||||
Resolves: rhbz1993296
|
||||
|
||||
* Sat Aug 7 2021 Pavel Cahyna <pcahyna@redhat.com> - 2.6-1
|
||||
- Rebase to upstream release 2.6 and drop unneded patches.
|
||||
Add S/390 support.
|
||||
Resolves: rhbz1983003, rhbz1988493, rhbz1868421
|
||||
- Add missing dependencies on dhcp-client (see #1926451), file
|
||||
- Patch documents to be compatible with asciidoc,
|
||||
we don't have asciidoctor
|
||||
- On POWER add bootlist & ofpathname to the list of required programs
|
||||
conditionally (bootlist only if running under PowerVM, ofpathname
|
||||
always except on PowerNV) - upstream PR2665, add them to package
|
||||
dependencies
|
||||
Resolves: rhbz1983013
|
||||
|
||||
* Tue May 11 2021 Pavel Cahyna <pcahyna@redhat.com> - 2.4-19
|
||||
- Backport PR2608:
|
||||
Fix setting boot path in case of UEFI partition (ESP) on MD RAID
|
||||
Resolves: rhbz1945869
|
||||
- Backport PR2625
|
||||
Prevents accidental backup removal in case of errors
|
||||
Resolves: rhbz1958247
|
||||
- Fix rsync error and option handling
|
||||
Fixes metadata storage when rsync user is not root
|
||||
Resolves: rhbz1930662
|
||||
|
||||
* Mon Jan 11 2021 Vitezslav Crhonek <vcrhonek@redhat.com> - 2.4-18
|
||||
- Fix typo in default.conf
|
||||
Resolves: #1882060
|
||||
- Modify the cron command to avoid an e-mail with error message after
|
||||
ReaR is installed but not properly configured when the cron command
|
||||
is triggered for the first time
|
||||
Resolves: #1729499
|
||||
- Backport upstream code related to LUKS2 support
|
||||
Resolves: #1832394
|
||||
- Changes for NetBackup (NBU) support, upstream PR2544
|
||||
Resolves: #1898080
|
||||
|
||||
* Mon Aug 10 2020 Pavel Cahyna <pcahyna@redhat.com> - 2.4-17
|
||||
- Update the Rubrik patch to include complete PR2445
|
||||
Resolves: rhbz1867696
|
||||
|
||||
* Thu Jun 04 2020 Václav Doležal <vdolezal@redhat.com> - 2.4-16
|
||||
- Apply upstream PR2373: Skip Longhorn Engine replica devices
|
||||
Resolves: rhbz1843809
|
||||
|
||||
* Mon Jun 01 2020 Václav Doležal <vdolezal@redhat.com> - 2.4-15
|
||||
- Apply upstream PR2346: Have '-iso-level 3' option also for ppc64le
|
||||
Resolves: rhbz1729502
|
||||
|
||||
* Mon Jun 01 2020 Václav Doležal <vdolezal@redhat.com> - 2.4-14
|
||||
- Backport remaining Rubrik related patches.
|
||||
Related: rhbz1743303
|
||||
|
||||
* Thu May 21 2020 Václav Doležal <vdolezal@redhat.com> - 2.4-13
|
||||
- Backport upstream PR #2249 to add support for Rubrik backup method.
|
||||
Resolves: rhbz1743303
|
||||
|
||||
* 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)
|
Loading…
Reference in New Issue
Block a user