#!/bin/bash LogPrint "Start system layout restoration." mkdir -p /mnt/local if create_component "vgchange" "rear" ; then lvm vgchange -a n >/dev/null component_created "vgchange" "rear" fi set -e set -x if create_component "/dev/sda" "disk" ; then # Create /dev/sda (disk) Log "Stop mdadm" if grep -q md /proc/mdstat &>/dev/null; then mdadm --stop -s >&2 || echo "stop mdadm failed" # Prevent udev waking up mdadm later. # Reasoning: At least on RHEL6 when parted created a raid partition on disk, # udev (via /lib/udev/rules.d/65-md-incremental.rules) wakes up mdadm which locks the disk, # so further parted commands with the disk will fail since the disk is busy now. # The /lib/udev/rules.d/65-md-incremental.rules detects anaconda (the Red Hat installer), # and if it find itself running under anaconda, it will not run. # Accordingly also for other installers (in particular the ReaR installer) # this rule should not be there (and other Linux distros probably do not have it) # which means removing it is the right solution to make ReaR work also for RHEL6: if [ -e /lib/udev/rules.d/65-md-incremental.rules ] ; then rm -f /lib/udev/rules.d/65-md-incremental.rules || echo "rm 65-md-incremental.rules failed" fi fi Log "Erasing MBR of disk /dev/sda" dd if=/dev/zero of=/dev/sda bs=512 count=1 sync LogPrint "Creating partitions for disk /dev/sda (gpt)" my_udevsettle parted -s /dev/sda mklabel gpt >&2 my_udevsettle my_udevsettle parted -s /dev/sda mkpart 'sda1' 2097152B 2131135B >&2 my_udevsettle my_udevsettle parted -s /dev/sda set 1 bios_grub on >&2 my_udevsettle my_udevsettle parted -s /dev/sda name 1 'sda1' >&2 my_udevsettle my_udevsettle parted -s /dev/sda mkpart 'sda2' 2134016B 10834083B >&2 my_udevsettle my_udevsettle parted -s /dev/sda set 2 boot on >&2 my_udevsettle my_udevsettle parted -s /dev/sda set 2 esp on >&2 my_udevsettle my_udevsettle parted -s /dev/sda name 2 'sda2' >&2 my_udevsettle my_udevsettle parted -s /dev/sda mkpart 'sda3' 10838016B 1084579839B >&2 my_udevsettle my_udevsettle parted -s /dev/sda set 3 boot on >&2 my_udevsettle my_udevsettle parted -s /dev/sda set 3 esp on >&2 my_udevsettle my_udevsettle parted -s /dev/sda name 3 'sda3' >&2 my_udevsettle my_udevsettle parted -s /dev/sda mkpart 'sda4' 1084583936B 32370403993B >&2 my_udevsettle my_udevsettle parted -s /dev/sda name 4 'sda4' >&2 my_udevsettle my_udevsettle parted -s /dev/sda mkpart 'sda5' 32370405376B 65922711039B >&2 my_udevsettle my_udevsettle parted -s /dev/sda name 5 'sda5' >&2 my_udevsettle sleep 1 if ! partprobe -s /dev/sda >&2 ; then LogPrint 'retrying partprobe /dev/sda after 10 seconds' sleep 10 if ! partprobe -s /dev/sda >&2 ; then LogPrint 'retrying partprobe /dev/sda after 1 minute' sleep 60 if ! partprobe -s /dev/sda >&2 ; then LogPrint 'partprobe /dev/sda failed, proceeding bona fide' fi fi fi # Make sure device nodes are visible (eg. in RHEL4) my_udevtrigger my_udevsettle component_created "/dev/sda" "disk" else LogPrint "Skipping /dev/sda (disk) as it has already been created." fi if create_component "/dev/sda1" "part" ; then # Create /dev/sda1 (part) component_created "/dev/sda1" "part" else LogPrint "Skipping /dev/sda1 (part) as it has already been created." fi if create_component "/dev/sda2" "part" ; then # Create /dev/sda2 (part) component_created "/dev/sda2" "part" else LogPrint "Skipping /dev/sda2 (part) as it has already been created." fi if create_component "/dev/sda3" "part" ; then # Create /dev/sda3 (part) component_created "/dev/sda3" "part" else LogPrint "Skipping /dev/sda3 (part) as it has already been created." fi if create_component "/dev/sda4" "part" ; then # Create /dev/sda4 (part) component_created "/dev/sda4" "part" else LogPrint "Skipping /dev/sda4 (part) as it has already been created." fi if create_component "/dev/sda5" "part" ; then # Create /dev/sda5 (part) component_created "/dev/sda5" "part" else LogPrint "Skipping /dev/sda5 (part) as it has already been created." fi if create_component "fs:/" "fs" ; then # Create fs:/ (fs) # Wait until udev had created '/dev/sda4' before creating a filesystem there: my_udevsettle LogPrint 'Creating filesystem of type 'btrfs' with mount point '/' on '/dev/sda4'.' # Using wipefs to cleanup '/dev/sda4' before creating filesystem. mount | grep -q /dev/sda4 || wipefs --all --force /dev/sda4 || wipefs --all /dev/sda4 || dd if=/dev/zero of=/dev/sda4 bs=512 count=1 || true # if /dev/sda4 is already mounted, skip # force overwriting existing btrfs when the disk was already used before if ! mount | grep -q /dev/sda4 >&2 ; then # Try to create btrfs with UUID if ! mkfs -t btrfs -U 3468f844-b92c-4e84-b956-0b7109cf67df -f /dev/sda4 >&2 ; then mkfs -t btrfs -f /dev/sda4 >&2 new_uuid=$( btrfs filesystem show /dev/sda4 2>/dev/null | grep -o 'uuid: .*' | cut -d ':' -f 2 | tr -d '[:space:]' ) if [ 3468f844-b92c-4e84-b956-0b7109cf67df != $new_uuid ] ; then # The following grep command intentionally also # fails when there is not yet a FS_UUID_MAP file # and then the FS_UUID_MAP file will be created: if ! grep -q 3468f844-b92c-4e84-b956-0b7109cf67df "/var/lib/rear/layout/fs_uuid_mapping" ; then echo "3468f844-b92c-4e84-b956-0b7109cf67df $new_uuid /dev/sda4" >> /var/lib/rear/layout/fs_uuid_mapping else # Required when we restart rear recover (via menu) - UUID changed again. old_uuid=$(grep 3468f844-b92c-4e84-b956-0b7109cf67df /var/lib/rear/layout/fs_uuid_mapping | tail -1 | awk '{print $2}') SED_SCRIPT=";/3468f844-b92c-4e84-b956-0b7109cf67df/s/${old_uuid}/${new_uuid}/g" sed -i "$SED_SCRIPT" "/var/lib/rear/layout/fs_uuid_mapping" fi fi # end of [ 3468f844-b92c-4e84-b956-0b7109cf67df != ] fi btrfs filesystem label /dev/sda4 'root' >&2 fi LogPrint "Mounting filesystem /" mkdir -p /mnt/local/ mount -t btrfs -o rw,noatime,space_cache,user_subvol_rm_allowed,autodefrag /dev/sda4 /mnt/local/ # Creating normal btrfs subvolume var/lib/lxd/storage-pools/default/containers/lms on /dev/sda4 at / if ! test -d /mnt/local//var/lib/lxd/storage-pools/default/containers ; then mkdir -p /mnt/local//var/lib/lxd/storage-pools/default/containers fi btrfs subvolume create /mnt/local//var/lib/lxd/storage-pools/default/containers/lms # Creating normal btrfs subvolume var/lib/lxd/storage-pools/default/containers/serviio on /dev/sda4 at / if ! test -d /mnt/local//var/lib/lxd/storage-pools/default/containers ; then mkdir -p /mnt/local//var/lib/lxd/storage-pools/default/containers fi btrfs subvolume create /mnt/local//var/lib/lxd/storage-pools/default/containers/serviio # Creating normal btrfs subvolume var/lib/lxd/storage-pools/default/containers/plexserver on /dev/sda4 at / if ! test -d /mnt/local//var/lib/lxd/storage-pools/default/containers ; then mkdir -p /mnt/local//var/lib/lxd/storage-pools/default/containers fi btrfs subvolume create /mnt/local//var/lib/lxd/storage-pools/default/containers/plexserver # Creating normal btrfs subvolume var/lib/lxd/storage-pools/default on /dev/sda4 at / if ! test -d /mnt/local//var/lib/lxd/storage-pools ; then mkdir -p /mnt/local//var/lib/lxd/storage-pools fi btrfs subvolume create /mnt/local//var/lib/lxd/storage-pools/default # Creating normal btrfs subvolume var/lib/lxd/storage-pools/default/containers on /dev/sda4 at / if ! test -d /mnt/local//var/lib/lxd/storage-pools/default ; then mkdir -p /mnt/local//var/lib/lxd/storage-pools/default fi btrfs subvolume create /mnt/local//var/lib/lxd/storage-pools/default/containers # Creating normal btrfs subvolume var/lib/lxd/storage-pools/default/snapshots on /dev/sda4 at / if ! test -d /mnt/local//var/lib/lxd/storage-pools/default ; then mkdir -p /mnt/local//var/lib/lxd/storage-pools/default fi btrfs subvolume create /mnt/local//var/lib/lxd/storage-pools/default/snapshots # Creating normal btrfs subvolume var/lib/lxd/storage-pools/default/images on /dev/sda4 at / if ! test -d /mnt/local//var/lib/lxd/storage-pools/default ; then mkdir -p /mnt/local//var/lib/lxd/storage-pools/default fi btrfs subvolume create /mnt/local//var/lib/lxd/storage-pools/default/images # Creating normal btrfs subvolume var/lib/lxd/storage-pools/default/custom on /dev/sda4 at / if ! test -d /mnt/local//var/lib/lxd/storage-pools/default ; then mkdir -p /mnt/local//var/lib/lxd/storage-pools/default fi btrfs subvolume create /mnt/local//var/lib/lxd/storage-pools/default/custom # Creating normal btrfs subvolume var/lib/lxd/storage-pools/default/containers/drawio/rootfs/var/lib/docker/btrfs/subvolumes/c9ef627fa63935a459a81012c277edd81238477ceb2c1655f8c118db1aa1fcbc on /dev/sda4 at / if ! test -d /mnt/local//var/lib/lxd/storage-pools/default/containers/drawio/rootfs/var/lib/docker/btrfs/subvolumes ; then mkdir -p /mnt/local//var/lib/lxd/storage-pools/default/containers/drawio/rootfs/var/lib/docker/btrfs/subvolumes fi btrfs subvolume create /mnt/local//var/lib/lxd/storage-pools/default/containers/drawio/rootfs/var/lib/docker/btrfs/subvolumes/c9ef627fa63935a459a81012c277edd81238477ceb2c1655f8c118db1aa1fcbc # Creating normal btrfs subvolume var/lib/lxd/storage-pools/default/containers/drawio/rootfs/var/lib/docker/btrfs/subvolumes/6d5b919fe59170e48fa31053fc654037bc8db18c8411f05998bee60f45641eac on /dev/sda4 at / if ! test -d /mnt/local//var/lib/lxd/storage-pools/default/containers/drawio/rootfs/var/lib/docker/btrfs/subvolumes ; then mkdir -p /mnt/local//var/lib/lxd/storage-pools/default/containers/drawio/rootfs/var/lib/docker/btrfs/subvolumes fi btrfs subvolume create /mnt/local//var/lib/lxd/storage-pools/default/containers/drawio/rootfs/var/lib/docker/btrfs/subvolumes/6d5b919fe59170e48fa31053fc654037bc8db18c8411f05998bee60f45641eac # Creating normal btrfs subvolume var/lib/lxd/storage-pools/default/containers/pigallery/rootfs/var/lib/docker/btrfs/subvolumes/aa2390d77147e501b7a6eff5329ac9c2bebd439fb7ebe1eb9826b68203b893bc on /dev/sda4 at / if ! test -d /mnt/local//var/lib/lxd/storage-pools/default/containers/pigallery/rootfs/var/lib/docker/btrfs/subvolumes ; then mkdir -p /mnt/local//var/lib/lxd/storage-pools/default/containers/pigallery/rootfs/var/lib/docker/btrfs/subvolumes fi btrfs subvolume create /mnt/local//var/lib/lxd/storage-pools/default/containers/pigallery/rootfs/var/lib/docker/btrfs/subvolumes/aa2390d77147e501b7a6eff5329ac9c2bebd439fb7ebe1eb9826b68203b893bc # No special btrfs default subvolume is used on /dev/sda4 at /, no default subvolume setup needed component_created "fs:/" "fs" else LogPrint "Skipping fs:/ (fs) as it has already been created." fi if create_component "btrfsmountedsubvol:/" "btrfsmountedsubvol" ; then # Create btrfsmountedsubvol:/ (btrfsmountedsubvol) component_created "btrfsmountedsubvol:/" "btrfsmountedsubvol" else LogPrint "Skipping btrfsmountedsubvol:/ (btrfsmountedsubvol) as it has already been created." fi if create_component "fs:/boot" "fs" ; then # Create fs:/boot (fs) # Wait until udev had created '/dev/sda3' before creating a filesystem there: my_udevsettle LogPrint 'Creating filesystem of type 'ext4' with mount point '/boot' on '/dev/sda3'.' # Using wipefs to cleanup '/dev/sda3' before creating filesystem. wipefs --all --force /dev/sda3 || wipefs --all /dev/sda3 || dd if=/dev/zero of=/dev/sda3 bs=512 count=1 || true # Try 'mkfs -U' to create the filesystem with initially correct UUID # but if that fails assume it failed because of missing support for '-U' # (e.g. in RHEL 5 it fails, see https://github.com/rear/rear/issues/890) # then fall back to using mkfs without '-U' plus 'tune2fs/tune4fs -U' if ! mkfs -t ext4 -b 4096 -i 16384 -U a7084855-d983-4bb5-9b81-7aab70bbe5dd -F /dev/sda3 >&2 ; then mkfs -t ext4 -b 4096 -i 16384 -F /dev/sda3 >&2 tune2fs -U a7084855-d983-4bb5-9b81-7aab70bbe5dd /dev/sda3 >&2 fi tune2fs -L boot /dev/sda3 >&2 tune2fs -m 4 -c -1 -i 0d -o user_xattr,acl /dev/sda3 >&2 LogPrint "Mounting filesystem /boot" mkdir -p /mnt/local/boot mount -o rw,relatime /dev/sda3 /mnt/local/boot component_created "fs:/boot" "fs" else LogPrint "Skipping fs:/boot (fs) as it has already been created." fi if create_component "swap:/dev/sda5" "swap" ; then # Create swap:/dev/sda5 (swap) LogPrint "Creating swap on /dev/sda5" mkswap -U d51a0cd4-4413-4035-8728-fc7902596328 -L swap /dev/sda5 >&2 component_created "swap:/dev/sda5" "swap" else LogPrint "Skipping swap:/dev/sda5 (swap) as it has already been created." fi set +x set +e LogPrint "Disk layout created."