Pivert's Blog

Ceph Snapshots & backups on Proxmox VE


Reading Time: 2 minutes

RBD (RADOS Block Device) volumes can be exported using RBD Snapshots and exports. Once we use Snapshots, we can also run differential exports, so have differential backups from Ceph.

When providing Proxmox with Ceph RBD, it will create a RBD volume for each VM or CT.

CephFS different and are out of the scope. In case you would be interested in creating snapshots on CephFS, just create named subfolder of the .snap magical folder. This will give you a CephFS snapshot, and can be used anywhere in the directory hierarchy. Here is an example I use for some part of CephFS backups in a script:

mkdir /mnt/cephfs/docker/volumes/.snap/$(date +%Y%m%d-%Hh%M)

First some useful commands

List rbd pools

root@pve1:~# ceph osd lspools 
1 device_health_metrics
2 cephfs_data
3 cephfs_metadata
4 cephblock

The first pool (device_health_metrics) is for ceph internals. The pools 2 ans 3 are for cephfs. So only the pool 4 interrests us.

List volumes in a rbd pool

root@pve1:~# rbd ls cephblock
vm-101-disk-0
vm-105-disk-0
vm-134-disk-0
vm-139-disk-0

Take a snapshot

rbd snap create {pool-name}/{image-name}@{snap-name}

So in our case:

root@pve1:~# rbd snap create cephblock/vm-139-disk-0@$(date +%Y%m%d-%Hh%M)                        
Creating snap: 100% complete...done.

List the snapshots

root@pve1:~# rbd snap ls cephblock/vm-139-disk-0
SNAPID  NAME            SIZE    PROTECTED  TIMESTAMP                
   46  20220123-17h43  15 GiB             Sun Jan 23 17:43:19 2022


Export the snapshot

root@pve1:~# rbd export cephblock/vm-139-disk-0@20220123-17h43 /tmp/vm-139-disk-0_20220123-17h43
Exporting image: 100% complete...done.
root@pve1:~# ls -lh /tmp/vm-139-disk-0_20220123-17h43
-rw-r--r-- 1 root root 15G 23 jan 18:05 /tmp/vm-139-disk-0_20220123-17h43

It’s possible to extract and compress in a single operation. Here is another example (Thanks Andrii):

rbd export cephblock/vm-101-disk-0@akira_2022-05-25T21:47Z - | nice xz -z8 -T4 > /tmp/vm-101-disk-0_akira_2022-05-25T21:47Z_FULL-RBD-EXPORT.xz

Take another subsequent snapshot

In order to take an incremental backup, we must take a new snapshot.

root@pve1:~# rbd snap create cephblock/vm-139-disk-0@$(date +%Y%m%d-%Hh%M)  
Creating snap: 100% complete...done.
root@pve1:~# rbd snap ls cephblock/vm-139-disk-0
SNAPID  NAME            SIZE    PROTECTED  TIMESTAMP                
   46  20220123-17h43  15 GiB             Sun Jan 23 17:43:19 2022
   47  20220123-22h49  15 GiB             Sun Jan 23 22:49:34 2022

Export the difference between the 2 snapshots

root@pve1:~# rbd export-diff --from-snap 20220123-17h43 cephblock/vm-139-disk-0@20220123-22h49 /tmp/vm-139-disk-0_20220123-17h43-20220123-22h49
root@pve1:~# rbd export-diff --from-snap 20220123-17h43 cephblock/vm-139-disk-0@20220123-22h49 /tmp/vm-139-disk-0_20220123-17h43-20220123-22h49
Exporting image: 100% complete...done.
root@pve1:~# ls -lh /tmp/vm-139-disk-0_20220123-17h43-20220123-22h49
-rw-r--r-- 1 root root 34M 23 jan 22:58 /tmp/vm-139-disk-0_20220123-17h43-20220123-22h49
root@pve1:~# time nice xz -z -T4 /tmp/vm-139-disk-0_20220123-17h43-20220123-22h49  

real    0m2,916s
user    0m4,460s
sys     0m0,095s
root@pve1:~# ls -lh /tmp/vm-139-disk-0_20220123-17h43-20220123-22h49*              
-rw-r--r-- 1 root root 1,4M 23 jan 22:58 /tmp/vm-139-disk-0_20220123-17h43-20220123-22h49.xz

File format

File format is very simple. That’s why compression works quite well.
Just for fun: if you use a recent diff on vm with low activity on binary files, you can use the command strings on it, and you will mostly see logs & text files:

strings /tmp/vm-139-disk-0_20220123-17h43-20220123-22h49

List all volumes including snapshots on the cephblock pool

root@pve1:~# rbd ls -l cephblock      
NAME                          SIZE    PARENT  FMT  PROT  LOCK
vm-101-disk-0                 40 GiB            2        excl
vm-105-disk-0                 15 GiB            2        excl
vm-134-disk-0                 40 GiB            2        excl
vm-139-disk-0                 15 GiB            2        excl
vm-139-disk-0@20220123-17h43  15 GiB            2             
vm-139-disk-0@20220123-22h49  15 GiB            2             
vm-139-disk-0@20220124-00h19  15 GiB            2            

You can grep on those containing @ to get only snapshots.

Get the VM name by vmid

This might be useful for scripting to include de VM/CT name in the filename. Might not be the best solution, but this is a possible way.

root@pve1:~# vmid=139
root@pve1:~# vmname=$(pvesh get /cluster/resources --type vm --output-format json | jq -r ".[] | select(.vmid==$vmid) | .name " | tr -cd "[:alnum:]")
root@pve1:~# echo $vmname
freepbx

Restore the base snapshot

Then import, and import the diff… (check rbd manual)

Get the GB used in the ‘cephblock’ pool

rados -p cephblock -f json df | jq '.pools [0] .size_kb/1024/1024 | ceil'

Like it ?

Get notified on new posts (max 1 / month)
Soyez informés lors des prochains articles

2 responses to “Ceph Snapshots & backups on Proxmox VE”

  1. Hi,
    thank you for article!
    Did you try command
    rbd export cephblock/vm-139-disk-0@20220123-17h43 – | gzip -9 > /tmp/vm-139-disk-0_20220123-17h43.gz ?
    It allows to use STDOUT and pass data to pipe.

    • Hi Andrii,

      Definitely. That’s an excellent way for compressing. Typically something like :

      rbd export-diff –pool cephblock –from-snap akira_2022-02-02T22:34Z vm-101-disk-0@akira_2022-05-25T21:47Z – | nice xz -z8 -T4 > /tmp/vm-101-disk-0_akira_2022-05-25T21:47Z_akira_2022-02-02T22:34Z.xz

      My current destination is a rclone mount, but since the file takes some time for compression, and despite a quite big cache for rcone, I still need to go through a local file before moving to rclone mount and initiate the off-site transfer.

      Thanks for the heads-up. I’ll just add it for completeness.

Leave a Reply

Your email address will not be published. Required fields are marked *