Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- #
- # ---------------------------
- # Snapshot - Rollback - Btrfs
- # ---------------------------
- #
- # readonly-Snapshot + inkrementelles Backup von /home auf eine externe verschlüsselte USB-Backup-Festplatte
- #
- declare -i fertig=0
- [[ -z "$1" ]] && . ../backup_all_to_local_USB-Drive.conf 2>/dev/null
- user=xxxx
- MAXBACKUPFILES=23
- RemoteCryptPartition='/dev/disk/by-id/usb-WD_My_Passport_25EA_595832314131384C4A527034-0:0-part1'
- RemoteCryptDeviceTarget=backupdrive
- RemoteBackupDrive="/dev/disk/by-id/dm-uuid-CRYPT-LUKS2-8bcd8784c8c04d294d6e064268723d3a-${RemoteCryptDeviceTarget}"
- RemoteBackupMountpoint=/backup
- remoteSubvolume=@LENOVO_T61_xxxx
- #
- ZuSicherndesVerzeichnis=/home
- RemoteBackupFolder=${RemoteBackupMountpoint}/home_backups
- RemotehomeBackupName=home_backup_RO
- remotehomebackup=${RemoteBackupFolder}/${RemotehomeBackupName}
- remoteNEWhomebackup=${RemoteBackupFolder}/NEW_${RemotehomeBackupName}
- LocalhomeBackupName=${RemotehomeBackupName}
- localhomebackup=/home/.home_snapshots/${LocalhomeBackupName}
- localNEWhomebackup=/home/.home_snapshots/NEW_${LocalhomeBackupName}
- ScriptName=`basename $0`
- #
- #
- #==== Funktionen ================================================================================================================================================
- function UnmountCryptedDevice {
- umount ${RemoteBackupDrive}
- cryptsetup luksClose ${RemoteCryptDeviceTarget}
- }
- #
- [ -f /root/${ScriptName}.tmp ] && rm /root/${ScriptName}.tmp
- touch /root/${ScriptName}.tmp
- if [ ! -f /root/${ScriptName}.tmp ] ; then
- echo ""
- echo "Abbruch, keine root-rechte !"
- echo 'Bitte dieses Script mit "sudo" oder als user "root" ausführen !'
- exit 1
- fi
- rm /root/${ScriptName}.tmp
- #
- if [ ! -e ${RemoteCryptPartition} ] ; then
- echo ""
- echo "Abbruch, keine USB-Backup-Festplatte angeschlossen !"
- exit 1
- fi
- #
- if [ ! -e /dev/mapper/${RemoteCryptDeviceTarget} ]
- then
- cryptsetup luksOpen ${RemoteCryptPartition} ${RemoteCryptDeviceTarget}
- mount -o rw,noatime,compress=lzo,space_cache=v2,subvol=${remoteSubvolume} ${RemoteBackupDrive} ${RemoteBackupMountpoint}
- elif grep "/dev/mapper/${RemoteCryptDeviceTarget} ${RemoteBackupMountpoint} btrfs rw" /proc/mounts
- then
- sleep 0
- else
- mount -o rw,noatime,compress=lzo,space_cache=v2,subvol=${remoteSubvolume} ${RemoteBackupDrive} ${RemoteBackupMountpoint}
- fi
- #
- if [ -f /tmp/timestamp.txt ]
- then
- TIMESTAMP=`cat /tmp/timestamp.txt`
- else
- TIMESTAMP=`ls -l --time-style=+%Y-%m-%d-%H%M ${RemoteBackupFolder} | grep -w "NEW_${RemotehomeBackupName}" | awk {'print $6'}`
- fi
- #
- mountstate=`grep "/dev/mapper/${RemoteCryptDeviceTarget} ${RemoteBackupMountpoint} btrfs rw" /proc/mounts`
- if [[ -z "${mountstate}" ]]
- then
- echo ""
- echo $mountstate
- echo "BTRFS-Backup-Datentraeger ist nicht eingebunden !"
- echo "ENDE !"
- UnmountCryptedDevice
- exit 1
- else
- # echo "mountstate: $mountstate"
- if [ ! -d $localhomebackup ] && [ $fertig -eq 0 ]
- then
- echo "localhomebackup fehlt - vollständiges Backup wird ausgeführt !"
- btrfs subvolume snapshot -r ${ZuSicherndesVerzeichnis} $localhomebackup
- if [ -d $remotehomebackup ] ; then
- [ -d ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName} ] && btrfs subvolume delete ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName}
- mv $remotehomebackup ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName}
- fi
- [ -d $localNEWhomebackup ] && btrfs subvolume delete $localNEWhomebackup
- [ -d $remoteNEWhomebackup ] && btrfs subvolume delete $remoteNEWhomebackup
- btrfs send $localhomebackup | btrfs receive ${RemoteBackupFolder}
- btrfs subvolume snapshot -r ${ZuSicherndesVerzeichnis} $localNEWhomebackup
- fertig=1
- elif [ ! -d $remotehomebackup ] && [ $fertig -eq 0 ]
- then
- echo "remotehomebackup fehlt - vollständiges Backup wird ausgeführt !"
- [ -d $localhomebackup ] && btrfs subvolume delete $localhomebackup
- btrfs subvolume snapshot -r ${ZuSicherndesVerzeichnis} $localhomebackup
- [ -d $localNEWhomebackup ] && btrfs subvolume delete $localNEWhomebackup
- [ -d $remoteNEWhomebackup ] && btrfs subvolume delete $remoteNEWhomebackup
- btrfs send $localhomebackup | btrfs receive ${RemoteBackupFolder}
- btrfs subvolume snapshot -r ${ZuSicherndesVerzeichnis} $localNEWhomebackup
- fertig=1
- elif [ ! -d $localNEWhomebackup ] && [ $fertig -eq 0 ]
- then
- echo "localNEWhomebackup fehlt und wird erneuert - inkrementelles Backup wird versucht !"
- [ -d $remoteNEWhomebackup ] && btrfs subvolume delete $remoteNEWhomebackup
- btrfs subvolume snapshot -r ${ZuSicherndesVerzeichnis} $localNEWhomebackup
- fertig=1
- elif [ -d $localhomebackup ] && [ -d $localNEWhomebackup ] && [ -d $remotehomebackup ] && [ ! -d $remoteNEWhomebackup ] && [ $fertig -eq 0 ]
- then
- echo "remoteNEWhomebackup fehlt - inkrementelles Backup wird versucht !"
- btrfs send -p $localhomebackup $localNEWhomebackup | btrfs receive ${RemoteBackupFolder}
- if [ "$?" = "0" ]
- then
- fertig=2
- else
- echo "inkrementelles Backup fehlgeschlagen - vollständiges Backup wird ausgeführt !"
- [ -d $localhomebackup ] && btrfs subvolume delete $localhomebackup
- btrfs subvolume snapshot -r ${ZuSicherndesVerzeichnis} $localhomebackup
- if [ -d $remotehomebackup ] ; then
- [ -d ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName} ] && btrfs subvolume delete ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName}
- mv $remotehomebackup ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName}
- fi
- [ -d $localNEWhomebackup ] && btrfs subvolume delete $localNEWhomebackup
- [ -d $remoteNEWhomebackup ] && btrfs subvolume delete $remoteNEWhomebackup
- btrfs send $localhomebackup | btrfs receive ${RemoteBackupFolder}
- btrfs subvolume snapshot -r ${ZuSicherndesVerzeichnis} $localNEWhomebackup
- fertig=1
- fi
- elif [ -d $localhomebackup ] && [ -d $localNEWhomebackup ] && [ -d $remotehomebackup ] && [ -d $remoteNEWhomebackup ] && [ $fertig -eq 0 ]
- then
- echo "normales inkrementelles Backup"
- btrfs subvolume delete $localhomebackup
- mv $localNEWhomebackup $localhomebackup
- [ -d ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName} ] && btrfs subvolume delete ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName}
- mv $remotehomebackup ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName}
- mv $remoteNEWhomebackup $remotehomebackup
- btrfs subvolume snapshot -r ${ZuSicherndesVerzeichnis} $localNEWhomebackup
- fertig=1
- fi
- fi
- #
- [ $fertig -ne 2 ] && btrfs send -p $localhomebackup $localNEWhomebackup | btrfs receive ${RemoteBackupFolder}
- sync
- #
- typeset -i FILECOUNT
- FILECOUNT=0
- for file in `ls -r ${RemoteBackupFolder}` ; do
- FILECOUNT=$FILECOUNT+1
- [ $FILECOUNT -le $MAXBACKUPFILES ] && continue
- [ "$file" = "${RemotehomeBackupName}" ] && continue
- [ "$file" = "NEW_${RemotehomeBackupName}" ] && continue
- btrfs subvolume delete ${RemoteBackupFolder}/${file}
- echo "deleting snapshot ${RemoteBackupFolder}/${file}"
- done
- #
- btrfs balance start -dusage=5 /btrfs
- btrfs balance start -dusage=5 ${RemoteBackupMountpoint}
Advertisement
Add Comment
Please, Sign In to add comment