Skip to content

Instantly share code, notes, and snippets.

@juliyvchirkov
Last active January 2, 2024 20:45
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save juliyvchirkov/663eb6f5c18600a7414528beee6a7f3a to your computer and use it in GitHub Desktop.
Save juliyvchirkov/663eb6f5c18600a7414528beee6a7f3a to your computer and use it in GitHub Desktop.
bash: backup of live kvm machines

Backup of live kvm machines

Note

Work on routine update and annotation in progress

  • apparmor.d - /etc/apparmor.d/local/{usr.sbin.libvirtd,libvirt-qemu,usr.lib.libvirt.virt-aa-helper}, root:root 0644 (-rw-r--r--)
  • kvmbackup.cron - /etc/cron.d/kvmbackup.cron, root:root 0644 (-rw-r--r--)
  • kvmbackup.service - /usr/lib/systemd/system/kvmbackup.service, root:root 0644 (-rw-r--r--)
  • kvmbackup.timer - /usr/lib/systemd/system/kvmbackup.timer, root:root 0644 (-rw-r--r--)
  • kvmbackup - /usr/bin/kvmbackup, root:root 0754 (-rwxr-xr--)
  • kvmbackup.conf - /etc/kvmbackup.conf, root:root 0644 (-rw-r--r--)
  • virtnbdbackupUpgrade.cron - /etc/cron.d/virtnbdbackupUpgrade.cron, root:root 0644 (-rw-r--r--)
  • virtnbdbackupUpgrade.service - /usr/lib/systemd/system/virtnbdbackupUpgrade.service, root:root 0644 (-rw-r--r--)
  • virtnbdbackupUpgrade.timer - /usr/lib/systemd/system/virtnbdbackupUpgrade.timer, root:root 0644 (-rw-r--r--)
  • virtnbdbackupUpgrade - /usr/bin/virtnbdbackupUpgrade, root:root 0754 (-rwxr-xr--)
  • virtnbdbackupUpgradeWithLocalDebRepo - /usr/bin/virtnbdbackupUpgradeWithLocalDebRepo, root:root 0754 (-rwxr-xr--) - facultative more complex demo variation of the above virtnbdbackupUpgrade
/var/tmp/virtnbdbackup.* rw,
/var/tmp/backup.* rw,
#!/usr/bin/env bash
#
# Save as: /usr/bin/kvmbackup
#
# @implements Non-interactive backup operations cycle for active kvm machines
#
# Utilizes virtnbdbackup tool under the hood
#
# The first backup of every vm on every new month is forced to be full size,
# the rest backups on the month are incremental
# Every backup is processed with lz4 compression 'cause this feature really
# saves the host drive space a lot
#
# Implemented and tested under Ubuntu 20.04.2 LTS
#
# @see https://github.com/abbbi/virtnbdbackup for requirements and options of virtnbdbackup tool
if [ ${UID} -ne 0 ]
then
exec sudo bash $(realpath "${0}")
exit $?
fi
app=virtnbdbackup
socket=/var/tmp/${app}.sock
vmburoot=/backup/kvm
type=stream
level=inc
vmlist=($(virsh list | tail -n +3 | awk '{print $2}'))
moye=$(date +'%m.%Y')
mkdir="mkdir -pm 755"
[ -d ${vmburoot} ] || ${mkdir} ${vmburoot}
for vm in ${vmlist[@]}
do
[ -d ${vmburoot}/${vm} ] || ${mkdir} ${vmburoot}/${vm}
[ ! -d ${vmburoot}/${vm}/${moye} ] && ${mkdir} ${vmburoot}/${vm}/${moye} && level=full
${app} --domain ${vm} --socketfile ${socket} --level ${level} --type stream --output ${vmburoot}/${vm}/${moye} --compress
done
[Daily]
Storage /backup/kvm
# Threads 8
# ExcludeDrives vdb
# SkipNotRunning true
[Monthly]
# DefragmentDrives true
# CompressDrives true
# KeepOrigins true
# Qemu /var/lib/libvirt/qemu
# QemuGuestAgent false
0 3 * * * root /usr/bin/test -d /run/systemd/system || /usr/bin/kvmbackup &>/dev/null
[Unit]
Description=Nightly kvm backup
Requires=%p.timer
[Service]
Type=oneshot
ExecStart=/usr/bin/%p
[Install]
WantedBy=multi-user.target
[Unit]
Description=Nightly kvm backup
Requires=%p.service
[Timer]
Unit=%p.service
OnCalendar=*-*-* 03:00:00
RandomizedDelaySec=0
Persistent=true
[Install]
WantedBy=timers.target
#!/usr/bin/env bash
[ -z "${SHDEBUG}" ] || set -x
root="/usr/src/virtnbdbackup-upgrade"
[ -d "${root}" ] && rm -rf "${root}"
mkdir -m755 "${root}"
#############################
# shellcheck disable=SC2064 #
#############################
trap "rm -rf ${root}" EXIT
locLast="$(dpkg -s virtnbdbackup | grep -oP "Version:\s\K[0-9\.]+")"
devLast="$(command curl -sL "https://github.com/abbbi/virtnbdbackup/tags" |
grep -m1 -oP "archive/refs/tags/[^0-9]*\K([0-9\.]+)(?=\.)")"
[ "${locLast}" = "${devLast}" ] || {
cd "${root}" || exit 1
git clone https://github.com/abbbi/virtnbdbackup -b "v${devLast}" &>/dev/null ||
git clone https://github.com/abbbi/virtnbdbackup -b "${devLast}" &>/dev/null || {
printf "failed to get correct tag of last release (assumed v%s / %s)\n" "${devLast}" "${devLast}" >&2
exit 1
}
cd virtnbdbackup &>/dev/null || exit 1
if python3 setup.py --command-packages=stdeb.command bdist_deb &>/dev/null; then
mv deb_dist/virtnbdbackup_*_all.deb virtnbdbackup.deb
DEBIAN_FRONTEND="noninteractive" dpkg -i virtnbdbackup.deb
fi
}
0 5 * * * root /usr/bin/test -d /run/systemd/system || /usr/bin/virtnbdbackupUpgrade &>/dev/null
[Unit]
Description=Autonomous nightly virtnbdbackup upgrade
After=network-online.target
Requires=%p.timer
[Service]
Type=oneshot
ExecStart=/usr/bin/%p
[Install]
WantedBy=multi-user.target
[Unit]
Description=Autonomous nightly virtnbdbackup upgrade
Requires=%p.service
[Timer]
Unit=%p.service
OnCalendar=*-*-* 05:00:00
RandomizedDelaySec=30min
Persistent=true
[Install]
WantedBy=timers.target
#!/usr/bin/env bash
[ -z "${SHDEBUG}" ] || set -x
debRepoIndex() (
genList() {
[ -w "${1}" ] && rm -f "${1}" &>/dev/null
[ -w "${1}.gz" ] && rm -f "${1}.gz" &>/dev/null
apt-ftparchive "${1,,}" ./ >"${1}"
gzip -9c "${1}" >"${1}.gz"
}
pac="Packages"
con="Contents"
rel="Release"
osr="$(lsb_release -cs)"
[ $# -eq 0 ] || {
if [ -d "${1}" ]; then
cd "${1}" &>/dev/null || return 1
fi
}
#############################
# shellcheck disable=SC2015 #
#############################
[ $# -gt 0 ] && descr="${*}" || {
[ -w "${rel}" ] && {
descr="$(grep -m1 -oP "^Description: \K.+" "${rel}")"
rm -f "${rel}" &>/dev/null
}
}
genList "${pac}"
genList "${con}"
cat <<EOF >"${rel}"
Label: $(lsb_release -ds)
Version: $(lsb_release -rs)
Description: ${descr}
Origin: OpenSource
Suite: ${osr}
Components: main
Codename: ${osr}
Archive: ${osr}
Architecture: $(dpkg-architecture -q DEB_BUILD_ARCH)
EOF
apt-ftparchive "${rel,,}" ./ >>"${rel}"
)
export DEBIAN_FRONTEND="noninteractive"
root="/usr/src/virtnbdbackup-upgrade"
debrepo="/srv/deb/libvirt"
[ -d "${root}" ] && rm -rf "${root}"
mkdir -m755 "${root}"
#############################
# shellcheck disable=SC2064 #
#############################
trap "rm -rf ${root}" EXIT
locLast="$(dpkg -s virtnbdbackup | grep -oP "Version:\s\K[0-9\.]+")"
devLast="$(command curl -sL "https://github.com/abbbi/virtnbdbackup/tags" |
grep -m1 -oP "archive/refs/tags/[^0-9]*\K([0-9\.]+)(?=\.)")"
[ "${locLast}" = "${devLast}" ] || {
cd "${root}" || exit 1
git clone https://github.com/abbbi/virtnbdbackup -b "v${devLast}" &>/dev/null ||
git clone https://github.com/abbbi/virtnbdbackup -b "${devLast}" &>/dev/null || {
printf "failed to get correct tag of last release (assumed v%s / %s)\n" "${devLast}" "${devLast}" >&2
exit 1
}
cd virtnbdbackup &>/dev/null || exit 1
if python3 setup.py --command-packages=stdeb.command bdist_deb &>/dev/null; then
mv deb_dist/virtnbdbackup_*_all.deb "${debrepo}/"
debRepoIndex "${debrepo}"
apt-get update -qq
apt-get install virtnbdbackup -y
fi
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment