Skip to main content

rsync 实现 每日增量备份 KVM 虚拟机磁盘

明白,你想用 rsync 实现 每日增量备份 KVM 虚拟机磁盘,并保留虚拟机配置。下面我帮你整理一个 完整可执行方案,适合银河麒麟 V11 + KVM + Libvirt + WebVirtCloud 环境。


1️⃣ 前提条件

  1. 两台服务器:

    • 主机:/var/lib/libvirt/images/ 存放虚拟机磁盘

    • 备份服务器:/backup/libvirt/

  2. 主机和备份服务器可通过 SSH 密钥免密登录

  3. 安装 rsync

dnf install -y rsync

2️⃣ 备份目录结构

建议在备份服务器上保持如下结构:

/backup/libvirt/
    YYYYMMDD/
        images/
        xml/
  • images/ 存放虚拟机磁盘(qcow2/raw)

  • xml/ 存放虚拟机配置文件(virsh dumpxml 导出)


3️⃣ 导出虚拟机配置(XML)

备份前导出所有虚拟机配置:

mkdir -p /var/lib/libvirt/backup/xml
for vm in $(virsh list --name); do
    virsh dumpxml "$vm" > /var/lib/libvirt/backup/xml/"$vm".xml
done

这样每台虚拟机的配置都有单独的 XML 文件,可在另一台服务器直接 virsh define vm.xml 恢复。


4️⃣ rsync 增量备份虚拟机磁盘

假设备份服务器 IP 为 192.168.0.100,用户名 backupuser,执行:

# 创建当天备份目录
BACKUP_DATE=$(date +%Y%m%d)
mkdir -p /var/lib/libvirt/backup/images/$BACKUP_DATE

# 同步虚拟机磁盘(增量)
rsync -avh --progress /var/lib/libvirt/images/ backupuser@192.168.0.100:/backup/libvirt/images/$BACKUP_DATE/

rsync 参数说明:

  • -a:归档模式(保留权限、时间戳、符号链接等)

  • -v:显示详细信息

  • -h:人类可读大小

  • --progress:显示传输进度


5️⃣ 自动化脚本示例

创建 /usr/local/bin/libvirt_backup.sh

#!/bin/bash

# 备份日期
BACKUP_DATE=$(date +%Y%m%d)

# 本地临时目录
LOCAL_BACKUP_DIR=/var/lib/libvirt/backup
mkdir -p $LOCAL_BACKUP_DIR/xml
mkdir -p $LOCAL_BACKUP_DIR/images/$BACKUP_DATE

# 备份虚拟机 XML 配置
for vm in $(virsh list --name); do
    virsh dumpxml "$vm" > $LOCAL_BACKUP_DIR/xml/"$vm".xml
done

# 备份虚拟机磁盘
rsync -avh --progress /var/lib/libvirt/images/ backupuser@192.168.0.100:/backup/libvirt/images/$BACKUP_DATE/

# 输出完成信息
echo "Backup completed: $BACKUP_DATE"

赋予执行权限:

chmod +x /usr/local/bin/libvirt_backup.sh

6️⃣ 配置每日定时任务

使用 cron

crontab -e

添加任务(每天凌晨 2 点执行):

0 2 * * * /usr/local/bin/libvirt_backup.sh >> /var/log/libvirt_backup.log 2>&1

日志记录到 /var/log/libvirt_backup.log,方便排查。


7️⃣ 恢复虚拟机示例

在备份服务器或另一台服务器:

# 复制磁盘和 XML 文件回新服务器
scp backupuser@backupserver:/backup/libvirt/images/20251017/* /var/lib/libvirt/images/
scp backupuser@backupserver:/backup/libvirt/xml/* /var/lib/libvirt/backup/xml/

# 定义虚拟机
for xml in /var/lib/libvirt/backup/xml/*.xml; do
    virsh define "$xml"
done

# 启动虚拟机
virsh start vmname

特点

  1. 增量备份:rsync 只同步变化文件,节省带宽和存储

  2. 自动化:cron 每日执行,无需人工干预

  3. 可迁移:备份包含虚拟机配置和磁盘,可直接恢复到另一台服务器


我可以帮你写一个 更智能的脚本,支持:

  • 自动保留最近 7 天/30 天备份

  • 支持在线虚拟机快照备份(减少停机时间)

  • 支持多台虚拟机批量备份

你希望我帮你写这个增强版脚本吗?