#!/bin/bash # =LLC= © (C)opyright 2017 Boojum Consulting LLC / Dave Bechtel, All rights reserved. ## NOTICE: Only Boojum Consulting LLC personnel may use or redistribute this code, ## Unless given explicit permission by the author - see http://www.boojumconsultingsa.com # # To be run from systemrescuecd environment; NOTE restore disk MUST be partitioned 1st! # REQUIRES 1 arg: filename of .fsa # copy this script to /tmp and chmod +x, run from there # 2024.Apr kneutron # mod for proxmox # NO EFI version # If you prefer not to use an ISO to restore from, systemrescuecd has sshfs: # # sshfs -C -o Ciphers=chacha20-poly1305@openssh.com loginid@ipaddress:/path/to/backupfile \ # /mnt/path \ # -o follow_symlinks # mkdir -pv /mnt/restore; sshfs -C -o Ciphers=chacha20-poly1305@openssh.com dave@192.168.1.185:/mnt/seatera4-xfs/notshrcompr \ # /mnt/restore -o follow_symlinks # failexit.mrg function failexit () { echo '! Something failed! Code: '"$1 $2" # code # (and optional description) exit $1 } vgchange -a y # TODO editme #rootdev=/dev/sda3 # for physical disk non-nvme #rootdev=/dev/vda3 # for restore to VM rootdev=/dev/mapper/pve-root # for proxmox ext4+LVM restore # xxx TODO EDITME #rdevonly=${rootdev%[[:digit:]]} rdevonly=/dev/vda # for VM umount $rootdev # failsafe #cdr=/mnt/cdrom2 #mkdir -pv $cdr rootdir=/mnt/tmp2 umount $rootdir # failsafe mkdir -pv $rootdir myres=BOOJUM-RESTORE.sh # injection script # NOTE sr0 is systemrescue #mount /dev/sr1 $cdr -oro #chkmount=`df |grep -c $cdr` #[ $chkmount -gt 0 ] || failexit 99 "Failed to mount $cdr"; # failed to mount chkmount=`df |grep -c $rootdir` [ $chkmount -eq 0 ] || failexit 98 "$rootdir is still mounted - cannot restore!"; #cd $cdr || failexit 199 "Cannot CD to $cdr"; pwd echo "`date` - RESTORING root filesystem to $rootdev" # PROBLEM with long filenames in UDF - gets cut off, use $1 #time fsarchiver restfs *.fsa id=0,dest=$rootdev time fsarchiver restfs -v "$1" id=0,dest=$rootdev || failexit 400 "Restore failed!"; # TODO fix #while `wait -n`; do ## notwork - endless loop #while [ `jobs |wc -l` -gt 0 ]; do # df -h |grep $rootdev # grep fsa # sleep 5 #done date # boojumtastic! tune2fs -m1 $rootdev mount $rootdev $rootdir -onoatime,rw # Comment out any existing swap partitions in restored fstab # REF: https://unix.stackexchange.com/questions/295537/how-do-i-comment-lines-in-fstab-using-sed #sed -e '/[/]/common s/^/#/' /etc/fstab #/bin/cp -v $rootdir/etc/fstab $rootdir/etc/fstab--bkp && \ # sed -i '/swap/s/^/#/' $rootdir/etc/fstab; grep swap $rootdir/etc/fstab # Detect swap partition(s) in restore environ - print /dev/sdXX w/o ":" #for p in `blkid |grep TYPE=\"swap\" |awk -F: '{ print $1 }'`; do # pmod=${p##*/} # strip off beginning /dev/, leave sdXX # swapuuid=`ls -l /dev/disk/by-uuid |grep $pmod |awk '{ print $9 }'` # check have we already done this? # [ `grep -c $swapuuid $rootdir/etc/fstab` -gt 0 ] || \ # echo "UUID=$swapuuid swap swap defaults,pri=2 0 0" |tee -a $rootdir/etc/fstab # echo "UUID=$swapuuid swap swap defaults,pri=2 0 0" >> $rootdir/etc/fstab #done # /dev/sdb5 #ls -l /dev/disk/by-uuid |grep sdb5 # 1 2 3 4 5 6 7 8 9 #lrwxrwxrwx 1 root root 10 Aug 27 11:09 dfc46f8f-bcfa-4e73-b62f-b24dd0bf60cf -> ../../sdb5 # Make sure we can boot! echo "$(date) - Installing grub on $rdevonly" grub-install --root-directory=$rootdir $rdevonly mount -o bind /dev $rootdir/dev; mount -o bind /proc $rootdir/proc; mount -o bind /sys $rootdir/sys # FIXED myres2=$rootdir/$myres touch $myres2 || failexit 298 "Check if R/O filesystem?" echo "#!/bin/bash" > $myres2 || failexit 299 "Cannot update $myres2 injection script - Check R/O filesystem?" echo "grub-install $rdevonly" >> $myres2 # from chroot echo "update-grub" >> $myres2 echo "exit;" >> $myres2 #^D # inject script here! chroot $rootdir /bin/bash /$myres #umount -a $rootdir/* #umount -a $rootdir/{dev,proc,sys} #umount $rootdir/* 2>/dev/null #umount $rootdir 2>/dev/null df -hT echo "DON'T FORGET TO COPY /home and adjust fstab for swap / home / squid BEFORE booting new drive!" echo "+ also adjust etc/network/interfaces , getdrives-byid , etc/rc.local , etc/hostname , etc/hosts ," echo "+ etc/init/tty11 port (home/cloudssh/.bash_login" echo '=====' echo "If restoring to VM and a zpool on the host does not exist:" echo " systemctl disable zfs-import@zpoolnamehere " echo "...and it should not hold up the reboot anymore" echo "- Also remove anything from /etc/fstab that exists on the host but not in-vm" exit; # 2024.0420 kneutron ======================================= Full restore instructions: Run the Proxmox installer from ISO / USB and recreate the LVM + ext4 root FS with appropriate disk size Boot systemrescuecd cd /tmp Fire up ' mc ' Midnight Commander Tab to right pane, Esc+9 (or F9) and SFTP to where your .fsa backup file(s) are SCP the appropriate restore script (EFI or NO-EFI) over to local /tmp and ' chmod +x ' it EDIT THIS SCRIPT (look for EDITME) and change the appropriate values to match your restore environnment You may run into an issue with systemrescuecd where you cannot save over the original file; in that case you can save it under another name or delete it from another TTY and save it again but you will have to redo the ' chmod +x ' on it Follow the sshfs HOWTO in the comment at the beginning of this script to mount your backup file storage cd /mnt/restore /tmp/$0 backupfilename.fsa # Start the restore From here you can still ' chroot ' into the /mnt/tmp2 dir and disable zfs imports, edit /etc/fstab, et al Shutdown, remove rescue media and it should reboot into Proxmox VE If not, boot Super Grub Disc and that should do it Once you have a PVE login prompt, you can login as root and reinstall grub ' grub-install /dev/blah ' and then do a test reboot to make sure everything comes up as expected. ======================================= 2024.0420 Tested, works OK with proxmox no-efi 2017.0827 Tested, works OK