Cookie Consent by TermsFeed

Efficient backup of lxc containers in Proxmox - ZFS

Photo by shawnanggg / Unsplash

I've already written about some of my backup strategies in Proxmox. Proxmox Backup Server is a way, but it's not always the best option, especially if you're using lxc containers.

LVM and Ceph RBD baked containers have already been convered by another post, but one of the (many) great options, if you use Proxmox, is ZFS. I extensively use ZFS both on FreeBSD and Linux (and always wished that BTRFS could reach the same level of reliability).

When I don't need a networked file system (Ceph) or want to go over LVM, I tend to install Proxmox VMs and lxc containers on ZFS. Let's now focus on lxc containers backup.

Proxmox uses ZFS datasets for lxc containers' storage so you'll find all your files on /poolname/subvol-x-disk-y . We can easily backup as we've done in my previous article, we just need a different way of performing snapshots of all those datasets.

ZFS datasets have a hidden .zfs directory that contains all the snapshots that currently exist of that specific dataset. ls won't show it, but you can cd and it will be working.

Of course we can use native zfs send/receive (or a nice tool I daily use, zfs-autobackup, both for local snapshots and remote replication) but we want to save the files, not the zfs dataset, so we can be able to backup to a different file system. Any file system. So we're going to use borg.

Let's suppose our ZFS pool is named "proxzfs". Here's a suggested script. Of course, this is my script, it works for me and I'm not responsible if it doesn't work for you/destroys all your data/eats your server/etc.

#!/bin/bash
 
/usr/sbin/zfs snapshot -r proxzfs@forborg
 
REPOSITORY=yourpath/server/whatever:borgrepository/
TAG=mytag
borg create -v --stats --compression lz4 --progress    \
   $REPOSITORY::$TAG'-{now:%Y-%m-%dT%H:%M:%S}'          \
   /proxzfs/*/.zfs/snapshot/forborg/  \
   --exclude '*subvolYouMayWantToExclude-disk-0*'

/usr/sbin/zfs destroy -vrR proxzfs@forborg

borg prune -v $REPOSITORY --stats --prefix $TAG'-' \
   --keep-daily=31 --keep-weekly=4 --keep-monthly=12

This small script will create a @forborg snapshot for any dataset it will find under "proxzfs", then will fire up borg and ask it to traverse the forborg snapshots automatically mounted inside the .zfs directory of any dataset.

Then it will destroy the "forborg" snapshots and execute a borg prune. That will delete the old backups, according to the policy you have set. This step can be avoided here but I prefer to perform it after a backup so my repository is always consistent with my policy.

Stefano Marinelli

Stefano Marinelli

Italy