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

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

---

## 1️⃣ 前提条件

1. 两台服务器：
    
    
    - 主机：`/var/lib/libvirt/images/` 存放虚拟机磁盘
    - 备份服务器：`/backup/libvirt/`
2. 主机和备份服务器可通过 **SSH 密钥免密登录**。
3. 安装 `rsync`：

```bash
dnf install -y rsync

```

---

## 2️⃣ 备份目录结构

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

```
/backup/libvirt/
    YYYYMMDD/
        images/
        xml/

```

- `images/` 存放虚拟机磁盘（qcow2/raw）
- `xml/` 存放虚拟机配置文件（virsh dumpxml 导出）

---

## 3️⃣ 导出虚拟机配置（XML）

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

```bash
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`，执行：

```bash
# 创建当天备份目录
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`：

```bash
#!/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"

```

赋予执行权限：

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

```

---

## 6️⃣ 配置每日定时任务

使用 `cron`：

```bash
crontab -e

```

添加任务（每天凌晨 2 点执行）：

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

```

> 日志记录到 `/var/log/libvirt_backup.log`，方便排查。

---

## 7️⃣ 恢复虚拟机示例

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

```bash
# 复制磁盘和 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 天备份
- 支持在线虚拟机快照备份（减少停机时间）
- 支持多台虚拟机批量备份

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