Open main menu

OpenVZ Virtuozzo Containers Wiki β

Changes

Backup a running container over the network with ezvzdump

2,961 bytes added, 15:42, 18 March 2015
m
fix indentation
== Ezvzdump ==
Ezvzdump (not to be confused with [[vzdump]]) is a shell script that also allows
you to dump out a running VE container. The key differences are that ezvzdump
allows you to utilize past dumps to speed things up, and that a remote host can
The dump files that are created are compatible with those that vzdump creates,
so you must still use `<code>vzdump --restore` </code> to restore them.
Dependencies: sendEmail package for emailing of statistics
 
== Cron ==
I recommend using <code>nice</code><code></code> and <code>ionice</code> to run this script so it doesn't bring the host to it's knees. Place this example in <code>/etc/cron.d/ezvzdump</code> and the backups will run at 3:30 AM every day.
 
<pre>
# /etc/cron.d/ezvzdump
SHELL=/bin/bash #This is necessary on Ubuntu where dash is the default shell and is thus used by cron.
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 
30 3 * * * root /usr/bin/nice -n19 /usr/bin/ionice -c3 /usr/local/scripts/ezvzdump > /dev/null 2>&1
</pre>
 
== Changes ==
 
2009/7/24 - JBiel - Added support for GZip compression and backup
retention/rotation. Also added support for emailing of statistics.
 
2015-03-18 - OSiUX - fork script in https://github.com/gcoop-libre/plan-b
== Download ==
#!/bin/bash
#
# ezvzdump
#
# Copyright (C) 2008 Alex Lance (alla at cyber.com.au)
# Sponsored by Silverband Pty. Ltd.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option) any
# later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details: http://www.gnu.org/licenses/gpl.txt
# #
# Instructions
# ------------
#
# This script rsyncs a VE to a specified local directory, suspends the running
# VE, rsyncs again, and then resumes the VE. This creates a stable snapshot of
# the VE directories with minimal downtime.
#
# Once the VE has been dumped out locally, it is rsynced to a remote host. When
# the rsync has completed, a tar archive is created on the remote host. The tar
# archive is compatible with the vzdump tar format, so the VE tar file may be
# later restored with the `vzdump --restore` command.
#
# By tarring the files together on the remote host, the burden of creating
# the tar archive is taken away from the hardware node, and given to the remote
# host / backup server. This ensures that minimal additional CPU/disk resources
# are used on the machine that is running the VE's.
#
# This script runs slow the first time you use it, but from then on it utilizes
# the local and remote stored snapshot directories so that the rsyncs happen
# expediently. The script does not wait for the remote tar process to complete,
# it simply kicks off the tar archive creation and then immediately continues.
#
# This script uses rsync and ssh and assumes that you already have ssh keys
# set up between your hosts. This script was written because vzdump takes too
# backups. This script also puts less strain on the hardware node by finishing
# backups more quickly, and making the remote host do the heavy lifting.
#
# NASTY BUG! Make sure you're not "vzctl enter"ing a VE while it's being
# suspended. On my machine (Ubuntu 2.6.24-24-openvz) it caused the VE to
# zombifiy and I had to reboot the host (including killing the VZ shutdown
# script because it was unable to shutdown the VE/processes.) Just don't do it!
# This section contains variables that require user customisation.
# This variable contains a space delimited list of VEID's to be backed up.
# You can use VEIDS="$(cd /vz/private/ && echo *)" to backup all your VE's.
VEIDS="1000 2000 3000101 102 103 104"
VZ_CONF="/etc/vz/conf/" # the path to your openvz $VEID.conf files
VZ_PRIVATE="/vz/private/" # the path to the running VE's
LOCAL_DIR="/vz/ezvzdump/" # the local rsync cache / destination directory
# The remote host and path that this script will rsync the VE's to.
REMOTE_HOST="somehost.example.com"
REMOTE_DIR="/backup/"
# Default rsync flags (please note the potentially unsafe delete flags).
# You can also remove the v flag to get less verbose logging.
RSYNC_DEFAULT="rsync -ravH --delete-after --delete-excluded"  # Exclude these directories from backup (space delimited).# I left /var/log in the backup because when doing a full restore# it's necessary that this directory structure is present.RSYNC_EXCLUDE="/usr/portage /var/log"
# Path to vzctl executable
VZCTL="vzctl"
# Nice debugging messages...
function e { echo -e $(date "+%F %T"): $1
}
function die {
[ ! -d "${LOCAL_DIR}" ] && die "\$LOCAL_DIR directory doesn't exist. ($LOCAL_DIR)"
e "`hostname` - VZ backup for containers $VEIDS started." > /tmp/vzbackuptimes
# Loop through each VEID
for VEID in $VEIDS; do
VEHOSTNAME=`vzlist -o hostname $VEID -H`
echo ""
e "Beginning backup of VEID: $VEID";
RSYNC+=" --exclude=${VEID}${path}"
done;
e "Commencing initial ${RSYNC} ${VZ_PRIVATE}${VEID} ${LOCAL_DIR}"
e "Suspending VEID: $VEID"
before="$(date +%s)"
${VZCTL} chkpnt $VEID --suspend
e "Commencing second pass rsync ..."
${RSYNC} ${VZ_PRIVATE}${VEID} ${LOCAL_DIR}
e "Resuming VEID: $VEID"
${VZCTL} chkpnt $VEID --resume
after="$(date +%s)"
elapsed_seconds="$(expr $after - $before)"
e "Done."
e "Container ${VEID} ($VEHOSTNAME) was down $elapsed_seconds seconds during backup process." >> /tmp/vzbackuptimes
else
fi
# Copy VE config files over into the VE storage/cache area
if [ ! -d "${LOCAL_DIR}${VEID}/etc/vzdump" ]; then
e "Creating directory for openvz config files: mkdir ${LOCAL_DIR}${VEID}/etc/vzdump"
mkdir ${LOCAL_DIR}${VEID}/etc/vzdump
${RSYNC} ${LOCAL_DIR}${VEID}/ ${REMOTE_HOST}:${REMOTE_DIR}${VEID}/
# Move old Rotate older tar.gz backups if they exist. You can comment out these lines if you wish to have only one copy. e "Checking for existing files ${REMOTE_HOST}:${REMOTE_DIR}${VEID}.X.tar and rotating them" ssh ${REMOTE_HOST} "[ -f ${REMOTE_DIR}${VEID}.6.tar.gz ] && mv -f ${REMOTE_DIR}${VEID}.6.tar.gz ${REMOTE_DIR}${VEID}.7.tar.gz" ssh ${REMOTE_HOST} "[ -f ${REMOTE_DIR}${VEID}.5.tar.gz ] && mv -f ${REMOTE_DIR}${VEID}.5.tar.gz ${REMOTE_DIR}${VEID}.6.tar.gz" ssh ${REMOTE_HOST} "[ -f ${REMOTE_DIR}${VEID}.4.tar.gz ] && mv -f ${REMOTE_DIR}${VEID}.4.tar.gz ${REMOTE_DIR}${VEID}.5.tar.gz" ssh ${REMOTE_HOST} "[ -f ${REMOTE_DIR}${VEID}.3.tar.gz ] && mv -f ${REMOTE_DIR}${VEID}.3.tar archive to .gz ${REMOTE_DIR}${VEID}.4.tar.backupgz" e ssh ${REMOTE_HOST} "[ -f ${REMOTE_DIR}${VEID}.2.tar.gz ] && mv -f ${REMOTE_DIR}${VEID}.2.tar.gz ${REMOTE_DIR}${VEID}.3.tar.gz"Checking for existing file ssh ${REMOTE_HOST}:"[ -f ${REMOTE_DIR}${VEID}.1.tar.gz ] && mv -f ${REMOTE_DIR}${VEID}.1.tar.gz ${REMOTE_DIR}${VEID}.2.tar (and moving it to .backup if exists)gz" ssh ${REMOTE_HOST} "[ -f ${REMOTE_DIR}${VEID}.0.tar .gz ] && mv -f ${REMOTE_DIR}${VEID}.0.tar .gz ${REMOTE_DIR}${VEID}.1.tar.backupgz"
# Create a remote tar archive - note you can remove the ampersand from the end if you
# don't want multiple tar processes running on the remote host simultaneously.
e "Making a g-zip compresssed tar archive on remote host (this process will run in the background on the remote host)." ssh ${REMOTE_HOST} "tar cf czf ${REMOTE_DIR}${VEID}.0.tar .gz --numeric-owner -C ${REMOTE_DIR}${VEID} ./ 2>/dev/null " &
fi
e "Done."
 
done;
e "`hostname` - VZ backup for containers $VEIDS complete!" >> /tmp/vzbackuptimes# Email a log of the backup process to some email address. Can be modified slightly to use native "mail" command# if sendmail is installed and configured locally.cat /tmp/vzbackuptimes | sendEmail -f root@`hostname` -t someuser@example.com -u "`hostname` VZ backup statistics." -s mail.example.com #(put your open relay here)echocat /tmp/vzbackuptimesrm /tmp/vzbackuptimes
</pre>
2
edits