Advertisement
Guest User

Untitled

a guest
Nov 21st, 2021
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.96 KB | None | 0 0
  1. #!/bin/sh -e
  2.  
  3. export LIBVIRT_DEFAULT_URI="qemu:///system"
  4. PROCOWNER="$(id -un):$(id -gn)"
  5. #TMP_DIR=/srv/kvm_local/backups
  6. LOCKFILE=/var/lock/$(basename $0)
  7.  
  8. if [ -t 1 ]; then
  9. VERBOSE=1
  10. else
  11. VERBOSE=0
  12. fi
  13.  
  14. msg() {
  15. echo "$(date '+%Y-%m-%d %H:%M:%S')$@"
  16. }
  17.  
  18. #if [ ! -d $TMP_DIR ]; then
  19. # echo "error: no tmp directory: $TMP_DIR" >&2
  20. # exit 1
  21. #fi
  22.  
  23. echo checking lockfile $LOCKFILE
  24.  
  25. [ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en $LOCKFILE "$0" "$@" || :
  26.  
  27. echo locked as pid $$
  28.  
  29. DOMLIST=$(virsh list --state-running --without-managed-save --persistent --name)
  30. #DOMLIST=migration-test
  31.  
  32. [ ! -z "$1" ] && DOMLIST="$1"
  33.  
  34. echo domain list: $DOMLIST
  35.  
  36. DST_ROOT=/srv/kvm_backups
  37. DST_BASE=$DST_ROOT/backups
  38. DST_QEMU=$DST_ROOT/qemu
  39.  
  40. if [ ! -d $DST_BASE ]; then
  41. echo "error: no base directory: $DST_BASE" >&2
  42. exit 1
  43. fi
  44.  
  45. mkdir -p $DST_QEMU
  46.  
  47. if [ ! -d $DST_QEMU ]; then
  48. echo "error: no base qemu directory: $DST_QEMU" >&2
  49. exit 1
  50. fi
  51.  
  52. for dom in $DOMLIST; do
  53. echo ""
  54. msg " = processing $dom..."
  55.  
  56. if virsh domblklist $dom >/dev/null; then
  57.  
  58. DST_DIR=$DST_BASE/$dom
  59.  
  60. SNAPNAME=$(date +%Y%m%d-%H%M%S)
  61. SNAPYEAR=$(date +%Y)
  62.  
  63. mkdir -p $DST_DIR
  64.  
  65. if [ ! -d $DST_DIR ]; then
  66. echo "error: can't create dst dir: $DST_DIR" >&2
  67. exit 2
  68. fi
  69.  
  70. SKIPFILE=/var/tmp/backup-skip.$dom
  71. #
  72. # rm -f -- $SKIPFILE
  73. #
  74. # virsh domblklist $dom | egrep '[svh]d[a-z]' | while read BLKID BLKPATH; do
  75. # BLKOWNER=$(stat --format '%U:%G' $BLKPATH)
  76. #
  77. # if [ $BLKOWNER != $PROCOWNER ]; then
  78. # echo "error: ownership of $BLKPATH ($BLKOWNER) doesn't match $PROCOWNER." >&2
  79. # echo "error: skipping this domain for now (skipfile: $SKIPFILE)." >&2
  80. #
  81. # touch $SKIPFILE
  82. # fi
  83. # done
  84.  
  85. TSTART=$(date +%s)
  86.  
  87. if [ ! -e $SKIPFILE ]; then
  88.  
  89. msg " * saving latest domain definition to $DST_QEMU/$dom.xml"
  90. virsh dumpxml --inactive $dom > $DST_QEMU/$dom.xml
  91.  
  92. msg " * backing up domain definition to $DST_DIR/$dom-$SNAPNAME.xml"
  93. virsh dumpxml --inactive $dom > $DST_DIR/$dom-$SNAPNAME.xml
  94.  
  95. if virsh undefine $dom >/dev/null; then
  96.  
  97. virsh domblklist $dom | egrep '[svh]d[a-z]' | while read BLKID BLKPATH; do
  98. if [ -f $BLKPATH ]; then
  99. msg " * processing volume $BLKID / $BLKPATH ($(du -hs $BLKPATH | cut -f 1))..."
  100.  
  101. DSTFPATH=$DST_DIR/$(basename $BLKPATH)-$SNAPNAME
  102.  
  103. msg " * performing blockcopy of $BLKPATH to $DSTFPATH..."
  104.  
  105. if [ $VERBOSE = 1 ]; then
  106. virsh blockcopy $dom $BLKID $DSTFPATH --transient-job --wait --verbose --finish || ( echo "error: failed to blockcopy $BLKPATH." >&2 && exit 101 )
  107. else
  108. virsh blockcopy $dom $BLKID $DSTFPATH --transient-job --wait --finish >/dev/null || ( echo "error: failed to blockcopy $BLKPATH." >&2 && exit 101 )
  109. fi
  110.  
  111. RC=$?
  112.  
  113. msg " * blockcopy RC: $RC"
  114.  
  115. if [ "$RC" = "0" -a -f $DSTFPATH ]; then
  116. BKBLKPATH=$DST_ROOT/$(basename $BLKPATH)
  117.  
  118. msg " * linking $DSTFPATH to $BKBLKPATH..."
  119.  
  120. [ -f $BKBLKPATH ] && rm -f -- $BKBLKPATH
  121.  
  122. ln $DSTFPATH $BKBLKPATH
  123. else
  124. echo "error: unable to link $DSTFPATH: block operation failed and/or file not found" >&2
  125. fi
  126.  
  127. #msg " * saving $DSTFPATH to $DST_DIR/$(basename $TMPFPATH).tar"
  128. #nice tar -C $(dirname $TMPFPATH) -cSf $DST_DIR/$(basename $TMPFPATH).tar $(basename $TMPFPATH) || echo error: failed to archive $TMPFPATH. >&2
  129.  
  130. msg " * cleaning up $DST_DIR..."
  131. #rm -f -- $TMPFPATH
  132. find $DST_DIR -type f -mtime +7 \( -name '*.qcow2-*' -o -name '*.xml' \) -delete
  133. elif [ $BLKPATH != "-" ]; then
  134. echo "error: base block path not found: $BLKPATH, skipping." >&2
  135. fi
  136. done
  137.  
  138. virsh define $DST_DIR/$dom-$SNAPNAME.xml >/dev/null
  139.  
  140. msg " = completed in:" $(date "+%M:%S" -d @$(( $(date +%s) - $TSTART )) )
  141.  
  142. msg " + finished."
  143. else
  144. echo "could not undefine domain, skipping." >&2
  145. fi
  146. fi
  147. else
  148. echo "error: unable to query blocklist of domain $dom." >&2
  149. fi
  150.  
  151. done
  152.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement