最后更新于:2026年7月

你的虚拟机多久备份一次?备份能恢复吗? 很多 PVE 用户的备份策略是"出了事再说"——等到硬盘坏了、误删了虚拟机、系统崩了,才发现根本没有可用的备份。更常见的是:有备份,但从没测试过恢复,真出事时发现备份是坏的。
备份不是为了"有备份",而是为了"能恢复"。本文从 PVE 8 的备份机制讲起,到 Proxmox Backup Server 部署、异地备份策略、灾难恢复演练,帮你建立一套真正靠谱的数据保护体系。
【前置知识】 本文假设你已安装 PVE 8.x。如果还没安装,请先看 PVE 安装完全指南。
一、PVE 备份机制全解析
1.1 快照(Snapshot)vs 备份(Backup)
很多人分不清快照和备份,它们是完全不同的东西:
| 特性 | 快照(Snapshot) | 备份(Backup) |
|---|---|---|
| 本质 | 记录当前状态的差异 | 完整的数据副本 |
| 速度 | 秒级 | 分钟到小时级 |
| 存储位置 | 和原数据在同一磁盘 | 独立存储位置 |
| 依赖原盘 | ✅ 依赖(原盘坏了快照也没了) | ❌ 不依赖 |
| 能否异地 | ❌ 不能 | ✅ 可以 |
| 恢复方式 | 回滚到快照点 | 完整恢复虚拟机 |
| 适用场景 | 临时回滚、系统更新前 | 长期数据保护 |
关键理解:快照不是备份! 如果硬盘故障,快照和原数据一起丢失。备份才是真正的数据保护。
1.2 PVE 备份的类型
PVE 支持三种备份方式:
| 类型 | 命令 | 特点 | 适用场景 |
|---|---|---|---|
| 完整备份 | vzdump --mode stop |
关机后完整备份 | 最可靠,但需要停机 |
| 快照备份 | vzdump --mode snapshot |
利用快照在线备份 | KVM 虚拟机,不停机 |
| 挂起备份 | vzdump --mode suspend |
挂起后备份 | LXC 容器,短暂暂停 |
1.3 备份存储格式
PVE 备份生成的文件格式取决于虚拟机类型:
| 虚拟机类型 | 备份格式 | 说明 |
|---|---|---|
| KVM(VM) | .vma.zst 或 .vma.lzo |
压缩的虚拟磁盘镜像 |
| LXC(CT) | .tar.zst 或 .tar.lzo |
压缩的容器文件系统 |
压缩算法选择:
zstd(zst)比lzo压缩率更高、速度更快,PVE 8 默认使用 zstd。
二、基础备份操作
2.1 通过 Web UI 备份
- 选择虚拟机 → Backup
- 点击 Backup now
- 选择:
- Storage:备份存储位置
- Mode:stop / snapshot / suspend
- Compression:zstd(推荐)/ lzo / gzip / none
- 点击 Backup
2.2 通过命令行备份
# 备份指定虚拟机(ID 100)
vzdump 100 --storage local-btrfs --mode snapshot --compress zstd
# 备份多个虚拟机
vzdump 100 101 102 --storage local-btrfs --mode snapshot --compress zstd
# 备份所有运行中的虚拟机
vzdump --storage local-btrfs --mode snapshot --compress zstd --stdout
# 指定备份保留策略
vzdump 100 --storage local-btrfs --mode snapshot --compress zstd \
--retain-last 3 --retain-daily 7 --retain-weekly 4 --retain-monthly 32.3 备份保留策略
PVE 支持精细的保留策略,避免备份无限增长:
| 参数 | 含义 | 推荐值 |
|---|---|---|
--keep-last |
保留最近 N 个 | 3 |
--keep-daily |
每天保留 1 个 | 7 |
--keep-weekly |
每周保留 1 个 | 4 |
--keep-monthly |
每月保留 1 个 | 12 |
--keep-yearly |
每年保留 1 个 | 2 |
在 Web UI 中配置存储级保留策略:
Datacenter → Storage → 选择备份存储 → Edit → Retention
2.4 定时备份
通过 Web UI:
- Datacenter → Backup
- 点击 Add
- 配置:
- Node:节点名
- Storage:备份存储位置
- Schedule:定时计划(如
02:00每天凌晨 2 点) - Selection:选择要备份的虚拟机
- Mode:snapshot(推荐)
- Retention:保留策略
- 点击 Create
通过命令行验证定时任务:
# 查看定时备份任务
cat /etc/pve/jobs.cfg
# 查看备份日志
cat /var/log/vzdump.log
# 或
journalctl -u vzdump三、恢复操作
3.1 通过 Web UI 恢复
- 选择存储 → Backups
- 选择要恢复的备份文件
- 点击 Restore
- 选择:
- Storage:恢复到哪个存储
- VM ID:新虚拟机 ID(可以和原来不同)
- 点击 Restore
3.2 通过命令行恢复
# 恢复 KVM 虚拟机
qmrestore /var/lib/vz/dump/vzdump-qemu-100-2026_07_04.vma.zst 100 --storage local-lvm
# 恢复 LXC 容器
pct restore /var/lib/vz/dump/vzdump-lxc-101-2026_07_04.tar.zst 101 --storage local-lvm
# 恢复到新的 VM ID(不影响原虚拟机)
qmrestore /var/lib/vz/dump/vzdump-qemu-100-2026_07_04.vma.zst 200 --storage local-lvm3.3 部分恢复(提取单个文件)
有时候你不需要恢复整个虚拟机,只需要提取某个文件:
# 1. 解压备份文件
zstd -d vzdump-qemu-100-2026_07_04.vma.zst -o backup.vma
# 2. 使用 vma 工具提取磁盘
vma extract backup.vma /tmp/extracted/
# 3. 挂载提取的磁盘镜像
modprobe nbd
qemu-nbd -c /dev/nbd0 /tmp/extracted/disk-0.raw
mount /dev/nbd0p1 /mnt/recovery
# 4. 复制需要的文件
cp /mnt/recovery/path/to/file /restore/
# 5. 清理
umount /mnt/recovery
qemu-nbd -d /dev/nbd0四、Proxmox Backup Server(PBS)部署
PBS 是 PVE 的官方备份解决方案,提供增量备份、去重、压缩和加密功能。
4.1 为什么用 PBS?
| 特性 | 传统 vzdump 备份 | PBS 备份 |
|---|---|---|
| 备份方式 | 每次完整备份 | 增量备份(首次完整,后续增量) |
| 存储效率 | 低(大量重复数据) | 高(去重 + 压缩) |
| 备份速度 | 慢(每次全量) | 快(只传变化部分) |
| 恢复粒度 | 整个虚拟机 | 虚拟机 / 单个文件 |
| 加密 | 不支持 | ✅ 支持 AES-256 |
| 远程备份 | 手动同步 | ✅ 内置同步 |
存储节省示例: 10 台虚拟机每台 50GB,传统备份 7 天 = 3.5TB。PBS 增量去重后可能只需 200-500GB。
4.2 PBS 安装
PBS 可以安装在独立服务器或虚拟机中:
方式一:ISO 安装(独立服务器)
从 Proxmox 官网 下载 PBS ISO,安装流程和 PVE 类似。
方式二:Docker 部署(轻量级)
docker run -d \
--name pbs \
--restart always \
-p 8007:8007 \
-v /data/pbs:/var/lib/proxmox-backup \
-v /data/pbs-etc:/etc/proxmox-backup \
ghcr.io/proxmox/proxmox-backup-server:latest4.3 配置 PBS 与 PVE 对接
在 PBS 端:
- 访问
https://pbs-ip:8007 - 创建数据存储(Datastore)
- 创建备份用户并生成 API Token
在 PVE 端:
- Datacenter → Storage → Add → Proxmox Backup Server
- 填入:
- ID:存储名称
- Server:PBS 服务器地址
- Username:PBS 用户名
- Password:PBS 密码
- Datastore:PBS 数据存储名
- Fingerprint:PBS 证书指纹
- 点击 Add
获取 PBS 指纹:
# 在 PBS 上执行
proxmox-backup-manager cert info | grep Fingerprint4.4 使用 PBS 备份
配置好 PBS 存储后,使用方式和普通备份完全一样:
# 通过 PBS 备份
vzdump 100 --storage pbs-storage --mode snapshot
# 定时备份到 PBS(Web UI 配置)
# Datacenter → Backup → Add → Storage 选 PBS4.5 PBS 垃圾回收
PBS 的去重机制会产生垃圾数据,需要定期清理:
# 手动触发垃圾回收
proxmox-backup-manager garbage-collection start pbs-datastore
# 查看垃圾回收状态
proxmox-backup-manager garbage-collection status pbs-datastore配置定时垃圾回收:
# 每周日凌晨 3 点垃圾回收
echo "0 3 * * 0 root proxmox-backup-manager garbage-collection start pbs-datastore" >> /etc/cron.d/pbs-gc五、ZFS 快照自动化
如果你的 PVE 使用 ZFS 存储后端,可以利用 ZFS 快照实现更高效的备份。
5.1 ZFS 快照的优势
- 秒级创建:不管磁盘多大,快照都是秒级
- 零空间浪费:只记录变化的数据块
- 细粒度回滚:可以回滚到任意时间点
- 可复制:
zfs send/recv实现异地备份
5.2 手动 ZFS 快照
# 创建快照
zfs snapshot rpool/data/vm-100-disk-0@backup-20260704
# 列出快照
zfs list -t snapshot
# 回滚到快照(⚠️ 会丢弃快照后的数据)
zfs rollback rpool/data/vm-100-disk-0@backup-20260704
# 删除快照
zfs destroy rpool/data/vm-100-disk-0@backup-202607045.3 自动化 ZFS 快照脚本
#!/bin/bash
# ZFS 自动快照脚本
# 保留策略:每小时1个保留24个,每天1个保留7个,每周1个保留4个
# 按小时快照
for dataset in $(zfs list -H -o name | grep "vm-"); do
zfs snapshot ${dataset}@hourly-$(date +%Y%m%d%H)
done
# 清理过期快照
# 删除24小时以上的 hourly 快照
zfs list -t snapshot -o name -H | grep "hourly-" | while read snap; do
snap_date=$(echo $snap | grep -oP 'hourly-\K\d+')
if [ $(date -d "${snap_date:0:8} ${snap_date:8:2}:00:00" +%s 2>/dev/null) ]; then
age=$(( $(date +%s) - $(date -d "${snap_date:0:8} ${snap_date:8:2}:00:00" +%s) ))
if [ $age -gt 86400 ]; then
zfs destroy $snap
fi
fi
done加入 crontab:
# 每小时快照
0 * * * * /opt/zfs-snapshot.sh5.4 用 sanoid 管理快照(推荐)
sanoid 是一个优秀的 ZFS 快照管理工具:
# 安装 sanoid
apt install sanoid -y
# 配置
cp /etc/sanoid/sanoid.defaults.conf /etc/sanoid/sanoid.conf
nano /etc/sanoid/sanoid.conf配置示例:
[template production]
frequently = 0
hourly = 24
daily = 7
weekly = 4
monthly = 3
yearly = 1
autosnap = yes
autoprune = yes
[rpool/data/vm-100-disk-0]
use_template = production# 启用定时任务
systemctl enable sanoid.timer
systemctl start sanoid.timer六、异地备份策略
本地备份解决不了机房级别的灾难(火灾、断电、硬件被盗)。你需要异地备份。
6.1 异地备份方案对比
| 方案 | 成本 | 难度 | 自动化 | 推荐度 |
|---|---|---|---|---|
| PBS 远程同步 | 中(需要第二台 PBS) | 低 | ✅ 原生支持 | ⭐⭐⭐⭐⭐ |
| ZFS send/recv | 低 | 中 | 需脚本 | ⭐⭐⭐⭐ |
| rsync 同步 | 低 | 中 | 需脚本 | ⭐⭐⭐ |
| rclone 到云存储 | 低 | 中 | 需脚本 | ⭐⭐⭐⭐ |
| 手动拷贝 | 低 | 低 | ❌ | ⭐ |
6.2 PBS 远程同步(推荐)
PBS 原生支持在两台 PBS 之间同步数据:
在主 PBS 上配置同步任务:
# 添加远程 PBS
proxmox-backup-manager remote add pbs-remote 远程PBS地址 \
--auth-id root@pam \
--password '远程PBS密码'
# 创建同步任务
proxmox-backup-manager sync-job create \
--remote pbs-remote \
--remote-store main-datastore \
--store local-datastore \
--schedule "03:00"每天凌晨 3 点自动将主 PBS 数据同步到远程 PBS。
6.3 ZFS send/recv 远程备份
#!/bin/bash
# ZFS 远程备份脚本
LOCAL_POOL="rpool/data"
REMOTE_HOST="user@backup-server"
REMOTE_POOL="backup/data"
# 增量发送所有变化的快照
zfs list -t snapshot -o name -H -s creation | grep "@daily-" | while read snap; do
prev_snap=$(zfs list -t snapshot -o name -H -s creation | grep "@daily-" | grep -B1 "$snap" | head -1)
if [ -z "$prev_snap" ] || [ "$prev_snap" = "$snap" ]; then
# 首次全量发送
zfs send "$snap" | ssh "$REMOTE_HOST" zfs recv "$REMOTE_POOL/${snap#*/}"
else
# 增量发送
zfs send -i "$prev_snap" "$snap" | ssh "$REMOTE_HOST" zfs recv "$REMOTE_POOL/${snap#*/}"
fi
done6.4 rclone 到云存储
将备份文件同步到 S3、Backblaze B2 等低成本云存储:
# 安装 rclone
curl https://rclone.org/install.sh | bash
# 配置云存储
rclone config
# 选择 n (new remote) → 命名 → 选择存储类型 → 填入密钥
# 同步备份目录到云端
rclone sync /var/lib/vz/dump/ remote:pbs-backup/ --transfers 4 --checkers 8加入定时任务:
# 每天备份完成后同步到云端(4点开始)
0 4 * * * rclone sync /var/lib/vz/dump/ remote:pbs-backup/ --transfers 4 --checkers 8 --log-file /var/log/rclone.log七、灾难恢复演练
有备份不等于能恢复。定期演练是确保备份有效性的唯一方法。
7.1 演练流程
1. 选择一个非生产时段
2. 选择一台虚拟机的最新备份
3. 恢复到新的 VM ID(不影响原虚拟机)
4. 启动恢复的虚拟机
5. 验证数据完整性
6. 验证服务功能
7. 清理演练虚拟机
8. 记录演练结果
7.2 自动化演练脚本
#!/bin/bash
# PVE 备份恢复演练脚本
# 用法:./backup-drill.sh 100
VM_ID=$1
DRILL_ID=9900 # 演练用 VM ID
STORAGE="local-lvm"
if [ -z "$VM_ID" ]; then
echo "用法:$0 <VM_ID>"
exit 1
fi
echo "=== 备份恢复演练 ==="
echo "源虚拟机:$VM_ID"
echo "演练虚拟机:$DRILL_ID"
# 1. 查找最新备份
LATEST_BACKUP=$(ls -t /var/lib/vz/dump/vzdump-qemu-${VM_ID}-*.vma.zst 2>/dev/null | head -1)
if [ -z "$LATEST_BACKUP" ]; then
echo "❌ 未找到虚拟机 $VM_ID 的备份文件"
exit 1
fi
echo "最新备份:$LATEST_BACKUP"
# 2. 删除旧的演练虚拟机(如果存在)
if qm status $DRILL_ID &>/dev/null; then
echo "清理旧的演练虚拟机..."
qm stop $DRILL_ID 2>/dev/null
qm destroy $DRILL_ID --purge
fi
# 3. 恢复备份
echo "开始恢复..."
qmrestore "$LATEST_BACKUP" $DRILL_ID --storage $STORAGE
if [ $? -ne 0 ]; then
echo "❌ 恢复失败!"
exit 1
fi
# 4. 启动虚拟机
echo "启动演练虚拟机..."
qm start $DRILL_ID
# 5. 等待启动
echo "等待虚拟机启动(60秒)..."
sleep 60
# 6. 检查状态
STATUS=$(qm status $DRILL_ID --raw | grep status | awk -F'"' '{print $4}')
if [ "$STATUS" = "running" ]; then
echo "✅ 演练成功!虚拟机 $DRILL_ID 已启动"
echo "请手动验证服务和数据,然后运行:"
echo " qm stop $DRILL_ID && qm destroy $DRILL_ID --purge"
else
echo "❌ 虚拟机未正常运行,状态:$STATUS"
fi
echo ""
echo "=== 演练完成 ==="
echo "$(date '+%Y-%m-%d %H:%M:%S') 演练结果:$STATUS" >> /var/log/backup-drill.log7.3 演练检查清单
- 备份文件存在且完整
- 恢复过程无报错
- 虚拟机能正常启动
- 操作系统能正常登录
- 关键服务正常运行(Web、数据库等)
- 关键数据完整(检查几个重要文件)
- 网络配置正确(IP 地址、网关)
- 记录演练耗时和结果
八、备份监控与告警
8.1 监控备份状态
# 查看备份任务状态
pvesh get /cluster/backup-info
# 查看最近备份
find /var/lib/vz/dump/ -name "*.vma.zst" -mtime -1 -ls
# 检查 PBS 备份状态
proxmox-backup-client snapshot list --repository root@pam@localhost:pbs-datastore8.2 备份失败告警脚本
#!/bin/bash
# 备份监控告警脚本
# 检查最近 24 小时内是否有备份失败
LOG="/var/log/vzdump.log"
ALERT_EMAIL="yourname@localhost"
# 检查 vzdump 日志中的错误
ERRORS=$(grep -i "error\|failed\|warning" "$LOG" 2>/dev/null | tail -20)
if [ -n "$ERRORS" ]; then
echo "PVE 备份告警:发现备份错误" | mail -s "⚠️ PVE Backup Alert" "$ALERT_EMAIL"
echo "$ERRORS" | mail -s "PVE Backup Error Details" "$ALERT_EMAIL"
fi
# 检查是否超过 24 小时没有备份
LAST_BACKUP=$(find /var/lib/vz/dump/ -name "*.vma.zst" -mtime -1 2>/dev/null | head -1)
if [ -z "$LAST_BACKUP" ]; then
echo "PVE 备份告警:超过 24 小时没有新备份!" | mail -s "🚨 PVE No Backup Alert" "$ALERT_EMAIL"
fi8.3 配置邮件通知
PVE 可以在备份任务完成后自动发邮件:
- Datacenter → Options → Email from address 设置发件邮箱
- 配置 SMTP:
BASH
echo "smtp.example.com yourname:yourpassword" > /etc/postfix/sasl_passwd postmap /etc/postfix/sasl_passwdecho "smtp.example.com yourname:yourpassword" > /etc/postfix/sasl_passwd postmap /etc/postfix/sasl_passwd - 备份任务中设置 Notification 为 mail
九、备份策略最佳实践
9.1 3-2-1 原则
| 原则 | 含义 | PVE 实现 |
|---|---|---|
| 3 份数据 | 原数据 + 2 份备份 | 生产数据 + 本地 PBS + 远程 PBS |
| 2 种介质 | 备份存在不同介质 | 本地硬盘 + 云存储/远程服务器 |
| 1 份异地 | 至少 1 份在异地 | rclone 到云存储 或 PBS 远程同步 |
9.2 推荐备份配置
| 虚拟机类型 | 备份方式 | 频率 | 保留 | 异地 |
|---|---|---|---|---|
| 核心服务 | PBS 增量 | 每天 | 30 天 + 月度 12 个月 | ✅ 远程同步 |
| 数据库 | PBS + ZFS 快照 | 每小时快照 + 每天备份 | 快照 24 小时 + 备份 30 天 | ✅ |
| 普通服务 | PBS 增量 | 每天 | 14 天 | ✅ |
| 开发测试 | vzdump | 每周 | 4 周 | 可选 |
| 临时虚拟机 | 不备份 | — | — | — |
9.3 备份性能优化
| 优化项 | 方法 |
|---|---|
| 使用 PBS | 增量备份大幅减少时间和空间 |
| 选择合适压缩 | zstd 是速度和压缩率的最优平衡 |
| 避开高峰期 | 凌晨 2-4 点备份,避免影响业务 |
| 分散备份 | 不要同时备份所有虚拟机,错开时间 |
| SSD 缓存 | 备份存储用 SSD 缓存加速 |
| 网络优化 | PBS 使用万兆网络连接 |
十、常见问题
Q1:备份占用太多空间怎么办?
- 切换到 PBS(增量 + 去重可节省 70-90% 空间)
- 配置合理的保留策略
- 定期清理旧备份
- 运行 PBS 垃圾回收
Q2:备份时间太长怎么办?
- 使用 PBS 增量备份
- 使用 zstd 压缩(比 lzo 快)
- 错开备份时间
- 确保备份存储 I/O 足够
Q3:快照备份和停机备份怎么选?
- KVM 虚拟机:优先快照备份(不停机)
- LXC 容器:快照备份可能导致文件系统不一致,重要数据用 suspend 或 stop
- 数据库:建议先在虚拟机内做数据库导出,再快照备份
Q4:恢复后虚拟机无法启动怎么办?
- 检查恢复日志是否有错误
- 检查磁盘是否完整恢复
- 进入虚拟机控制台查看启动日志
- 可能需要修复文件系统:
fsck - 检查网络配置是否正确
Q5:如何验证备份是否完整?
# 验证 vzdump 备份
zstd -t /var/lib/vz/dump/vzdump-qemu-100-*.vma.zst
# 验证 PBS 备份
proxmox-backup-client verify snapshot.vma /path/to/snapshot --repository root@pam@localhost:pbs-datastore十一、总结
备份体系架构图
生产数据(PVE)
│
┌────────────┼────────────┐
│ │ │
ZFS 快照 本地 PBS vzdump 备份
(秒级回滚) (增量去重) (传统完整备份)
│
┌────┴────┐
│ │
远程 PBS 云存储同步
(灾备恢复) (低成本归档)
快速上手清单
- 配置定时备份(每天凌晨)
- 设置合理的保留策略
- 部署 PBS 实现增量备份
- 配置异地备份(PBS 同步 / rclone)
- 运行一次恢复演练
- 配置备份失败告警
- 每月检查备份存储空间
- 每季度做一次完整恢复演练
【相关推荐】
- PVE 安装完全指南 - 从零安装 PVE
- PVE Debian 虚拟机部署 - 虚拟机创建教程
- PVE 任务日志清理 - 清理 PVE 日志
- Ubuntu 24.04 安全加固 - 服务器安全
备份的意义不在于"做了备份",而在于"出事时能恢复"。定期演练,确保你的备份真的能用。数据无价,备份先行。🚀