Ploop/Backup
This article explains how to do consistent backups for ploop containers, using ploop snapshot feature.
Backup types
There are two ways of doing backups, both have their pros and cons.
- When doing an image backup, one copies ploop image files directly. There can be only one big file, or maybe a few relatively big files. Copying a few big files (rather than a lot of small files) is faster because there's not too much metadata (file info) to be copied). Also, filesystem properties are fully preserving (since images containing the filesystem are copied).
- When doing a file backup, one copies individual container' files. This is more suitable if you want selective backups (such as only some directories/files).
The following table summarizes pros and cons of both approaches.
Characteristic | Image | File |
---|---|---|
Incremental backups | Yes | Yes/No* |
Selective backups | No | Yes |
Faster full backup and restore | Yes | No |
Preserve filesystem properties | Yes | No |
Compatible with pre-ploop backups | Yes/No* | Yes |
Restore individual files | Yes | Yes |
Image-based backup
Assuming you have a running container identified by $CTID
. The following needs to be done:
# Known snapshot ID
ID=$(uuidgen)
VE_PRIVATE=$(vzlist -H -o private $CTID)
# Take a snapshot without suspending a CT and saving its config
vzctl snapshot $CTID --id $ID --skip-suspend --skip-config
# Perform a backup using your favorite backup tool
# (cp is just an example)
cp $VE_PRIVATE/root.hdd/* /backup/destination
# Delete (merge) the snapshot
vzctl snapshot-delete $CTID --id $ID
The following script implements the commands above and allows - when stored as vzbackup
- to backup your container by executing the script in the following way:
./vzbackup 101 /backup/destination/
The script removes older backups and keeps only the latest four backups. You can change the number of backups kept by changing the four in head -n-4
to the number of backups you would like to keep.
#!/bin/bash
if [ -z $1 -o -z $2 ]
then
echo "Usage: vzbackup CTID BACKUP-PATH"
exit 1
fi
CTID=$1
FOLDER=$2
BACKUPPATH=$FOLDER/$CTID-$( date +%F_%H_%M )
#create BACKUP-PATH
mkdir -p $BACKUPPATH
# Known snapshot ID
ID=$(uuidgen)
VE_PRIVATE=$(vzlist -H -o private $CTID)
# Take a snapshot without suspending a CT and saving its config
vzctl snapshot $CTID --id $ID --skip-suspend --skip-config
# Perform a backup using your favorite backup tool
# (cp is just an example)
cp $VE_PRIVATE/root.hdd/* $BACKUPPATH/
# Delete (merge) the snapshot
vzctl snapshot-delete $CTID --id $ID
# remove old backups
rm -rf $( find $FOLDER -type d -name "$CTID*" -exec ls -d1rt "{}" + | head -n-4 )
echo "BACKUP FINISHED."
File-based backup
Assuming you have a running container identified by $CTID
. The following needs to be done:
# Known snapshot ID
ID=$(uuidgen)
# Directory used to mount a snapshot
MNTDIR=./mnt
mkdir $MNTDIR
# Take a snapshot without suspending a CT and saving its config
vzctl snapshot $CTID --id $ID --skip-suspend --skip-config
# Mount the snapshot taken
vzctl snapshot-mount $CTID --id $ID --target $MNTDIR
# Perform a backup using your favorite backup tool
# (tar is just an example)
tar cf backup.tar $MNTDIR
# tar with compression examples, see man page of tar for more options
# tar cfJ backup.tar.xz $MNTDIR
# tar cfz backup.tar.gz $MNTDIR
# Unmount the snapshot
vzctl snapshot-umount $CTID --id $ID
# Delete (merge) the snapshot
vzctl snapshot-delete $CTID --id $ID