Script to backup VMs using RBD.
#!/bin/bash
# Configuration
POOL="vm_pool"
LOCAL_DIR="/mnt/ceph_backups"
REMOTE_USER="backupuser@remote-server"
REMOTE_BASE_DIR="/backups/ceph_vms"
COMPRESSION="zstd"
LOCAL_RETENTION=2
REMOTE_RETENTION=4
SSH_KEY="/root/.ssh/backup_key"
declare -A VM_DISKS=(
[100]="vm-100-disk-0"
[101]="vm-100-disk-0 vm-101-disk-1" # Multi-disk VM example
[102]="vm-102-disk-0"
)
# Create local directory
mkdir -p "$LOCAL_DIR"
for VMID in "${!VM_DISKS[@]}"; do
DISK_LIST="${VM_DISKS[$VMID]}"
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
REMOTE_VM_DIR="$REMOTE_BASE_DIR/vm$VMID"
echo "Processing VM $VMID (disks: $DISK_LIST)"
# Create remote directory
ssh -i "$SSH_KEY" "$REMOTE_USER" "mkdir -p '$REMOTE_VM_DIR'"
for DISK in $DISK_LIST; do
BACKUP_FILE="$LOCAL_DIR/${DISK}_${TIMESTAMP}.img.$COMPRESSION"
# Create snapshot (crash-consistent)
SNAP_NAME="backup_$TIMESTAMP"
rbd snap create "$POOL/$DISK@$SNAP_NAME"
# Export snapshot to compressed file
echo "Backing up $DISK..."
rbd export "$POOL/$DISK@$SNAP_NAME" - | $COMPRESSION > "$BACKUP_FILE"
# Remove temporary snapshot
rbd snap rm "$POOL/$DISK@$SNAP_NAME"
# Transfer to remote
scp -i "$SSH_KEY" "$BACKUP_FILE" "$REMOTE_USER:$REMOTE_VM_DIR/"
# Local cleanup
ls -t "$LOCAL_DIR/${DISK}_"*".img.$COMPRESSION" 2>/dev/null | \
tail -n +$(($LOCAL_RETENTION + 1)) | \
xargs -r rm -f
# Remote cleanup
ssh -i "$SSH_KEY" "$REMOTE_USER" \
"ls -t '$REMOTE_VM_DIR/${DISK}_'*'.img.$COMPRESSION' 2>/dev/null | \
tail -n +$(($REMOTE_RETENTION + 1)) | \
xargs -r rm -f"
done
done
echo "Ceph RBD backup completed at $(date)"