Advertisement
echoslider

finish_kvm_backup

Jun 5th, 2021 (edited)
497
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 5.72 KB | None | 0 0
  1. #!/bin/bash
  2. #https://pastebin.com/URrtG3hP
  3. set -e
  4.  
  5. if [ ! -z "$1" ]; then
  6.  
  7. if [ ! -d "/var/log/kvm_backup" ]; then
  8.     mkdir -vp "/var/log/kvm_backup" | tee -a '/var/log/kvm_backup/'$1'.log'
  9. fi
  10.  
  11. echo "" | tee -a '/var/log/kvm_backup/'$1'.log'
  12. echo "" | tee -a '/var/log/kvm_backup/'$1'.log'
  13.  
  14. ##########################################
  15. #backupdir=''$PWD'/kvm_backup'
  16. backupdir='/backup/backup/kvm_backup'
  17. keepbackups=4
  18. ##########################################
  19.  
  20. if ! command -v virsh &> /dev/null; then
  21.     echo "Error: virsh command not found. Please install libvirt-bin package." | tee -a '/var/log/kvm_backup/'$1'.log'
  22.     exit 1
  23. fi
  24.  
  25. if ! command -v rsync &> /dev/null; then
  26.     echo "Error: rsync command not found. Please install rsync package." | tee -a '/var/log/kvm_backup/'$1'.log'
  27.     exit 1
  28. fi
  29.  
  30. if [ ! -d "$backupdir" ]; then
  31.     echo "Error: Backup directory does not exist." | tee -a '/var/log/kvm_backup/'$1'.log'
  32.     exit 1
  33. fi
  34.  
  35.     datum=`date +"%s-%d-%m-%y"`
  36.     name="$1"
  37.     moment=''$name'_'$datum''
  38.     running=`virsh list|grep $1|tr -s ' '|cut -d ' ' -f 3`
  39.     disks=`virsh domblklist "$1" --details|grep qcow2|tr -s ' '|awk '{print $3 "|" $4}'`
  40.     snapdir=''$backupdir'/'$1'_'$datum''
  41.  
  42.     if [ "$running" == "$1" ]; then
  43.  
  44.         if [ ! -d "$backupdir" ]; then
  45.             mkdir -p "$backupdir"
  46.         fi
  47.  
  48.         if [ -d "$backupdir" ]; then
  49.             if [ ! -z "$disks" ]; then
  50.            
  51.                 mkdir -p $snapdir
  52.                
  53.                 if [ -d "$snapdir" ]; then
  54.  
  55.                     for disk in $disks; do
  56.  
  57.                         typ=`echo $disk | cut -d '|' -f 1`
  58.                         file=`echo $disk | cut -d '|' -f 2`
  59.                         base=`basename $file`
  60.                         filename=''$backupdir'/'$1'_'$datum'/'$base''
  61.  
  62.                         echo 'INFO: Starting Backup of '$1'_'$datum'' | tee -a '/var/log/kvm_backup/'$1'.log'  
  63.  
  64.                         if [ ! -f "$file" ]; then
  65.  
  66.                             echo "####################################################################################" | tee -a '/var/log/kvm_backup/'$1'.log'
  67.                             echo "# WARNING:                                                                         #" | tee -a '/var/log/kvm_backup/'$1'.log'
  68.                             echo "# Source File is deleted. Try Backup from /proc                                    #" | tee -a '/var/log/kvm_backup/'$1'.log'
  69.                             echo "# Need to hard crash (kill -9) the VM and recover the Source File from Backup File #" | tee -a '/var/log/kvm_backup/'$1'.log'
  70.                             echo "####################################################################################" | tee -a '/var/log/kvm_backup/'$1'.log'
  71.                              
  72.                             delid=`lsof -wXT | grep "$base" | grep deleted | head -n 1|tr -s ' '| awk '{print $2}'`
  73.                             olddisk=`ls -l /proc/"$delid"/fd/ | grep "$base"|tr -s ' '| awk '{print $9}'`
  74.  
  75.                             kill -STOP "$delid"
  76.  
  77.                             echo "WARN: Backup $1 -> /proc/$delid/fd/$olddisk -> $filename" | tee -a '/var/log/kvm_backup/'$1'.log'
  78.            
  79.                             if ! dd if="/proc/$delid/fd/$olddisk" of="$filename" bs=1M status=progress; then
  80.                                 echo "ERROR: Failed to create Backup of $1." | tee -a '/var/log/kvm_backup/'$1'.log'
  81.                                 exit 1  
  82.                             fi
  83.  
  84.                             kill -CONT "$delid"
  85.  
  86.                             echo "INFO: Backup "$1" -> /proc/"$delid"/fd/"$olddisk" to "$filename" complete." | tee -a '/var/log/kvm_backup/'$1'.log'
  87.  
  88.                         else
  89.                            
  90.                             if ! virsh snapshot-create-as --domain $1 --name $moment \
  91.                                 --diskspec $typ,file=''$filename'' \
  92.                                 --disk-only --atomic \
  93.                                 --no-metadata; then
  94.                                 echo "ERROR: Failed to create snapshot." | tee -a '/var/log/kvm_backup/'$1'.log'
  95.                                 exit 1  
  96.                             fi
  97.  
  98.                             if ! rsync -avhW --progress --log-file='/var/log/kvm_backup/'$1'.log' ''$file'' ''$backupdir'/'$1'_'$datum'/'; then
  99.                                 echo "ERROR: Failed to copy disk image." | tee -a '/var/log/kvm_backup/'$1'.log'
  100.                                 exit 1
  101.                             else
  102.                            
  103.                                
  104.                                 virsh blockcommit "$1" "$typ" --wait --active --verbose
  105.                                 virsh blockjob "$1" "$filename" --pivot
  106.                                
  107.                                 echo "INFO: Backup "$1" -> "$file" to "$backupdir"/"$1"_"$datum" complete." | tee -a '/var/log/kvm_backup/'$1'.log'
  108.                             fi
  109.  
  110.                         fi
  111.  
  112.                     done
  113.  
  114.                     virsh dumpxml "$1" > ''$backupdir'/'$1'_'$datum'/'$1'.xml'
  115.  
  116.  
  117.             networks=$(virsh domiflist "$1" | grep network | tr -s ' ' | awk '{ print $3}')
  118.  
  119.             for network in $networks; do
  120.             virsh net-dumpxml "$network" > ''$backupdir'/'$1'_'$datum'/'$network'.xml'
  121.             done
  122.  
  123.  
  124.            
  125.             anz=`ls -d $backupdir/$1*|wc -l`
  126.  
  127.             if (( "$anz" > "$keepbackups" )); then
  128.                 cleanfile=`ls -d $backupdir/$1*|sort|head -n 1`
  129.                
  130.                 if [ ! -z "$cleanfile" ]; then
  131.                     rm -vdR "$cleanfile"
  132.                 fi
  133.             fi
  134.  
  135.                 fi
  136.             fi
  137.         fi
  138.     else
  139.         echo "ERROR: VM not running."
  140.     fi
  141. else
  142.     echo "ERROR: Missing VM Name."
  143. fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement