最后更新于:2026年7月

PVE 备份恢复
Proxmox VE 8 备份恢复:数据安全有保障,灾难恢复不慌乱

你的虚拟机多久备份一次?备份能恢复吗? 很多 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 备份

  1. 选择虚拟机 → Backup
  2. 点击 Backup now
  3. 选择:
    • Storage:备份存储位置
    • Mode:stop / snapshot / suspend
    • Compression:zstd(推荐)/ lzo / gzip / none
  4. 点击 Backup

2.2 通过命令行备份

BASH
# 备份指定虚拟机(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 3

2.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:

  1. Datacenter → Backup
  2. 点击 Add
  3. 配置:
    • Node:节点名
    • Storage:备份存储位置
    • Schedule:定时计划(如 02:00 每天凌晨 2 点)
    • Selection:选择要备份的虚拟机
    • Mode:snapshot(推荐)
    • Retention:保留策略
  4. 点击 Create

通过命令行验证定时任务:

BASH
# 查看定时备份任务
cat /etc/pve/jobs.cfg

# 查看备份日志
cat /var/log/vzdump.log
# 或
journalctl -u vzdump

三、恢复操作

3.1 通过 Web UI 恢复

  1. 选择存储 → Backups
  2. 选择要恢复的备份文件
  3. 点击 Restore
  4. 选择:
    • Storage:恢复到哪个存储
    • VM ID:新虚拟机 ID(可以和原来不同)
  5. 点击 Restore

3.2 通过命令行恢复

BASH
# 恢复 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-lvm

3.3 部分恢复(提取单个文件)

有时候你不需要恢复整个虚拟机,只需要提取某个文件:

BASH
# 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 部署(轻量级)

BASH
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:latest

4.3 配置 PBS 与 PVE 对接

在 PBS 端:

  1. 访问 https://pbs-ip:8007
  2. 创建数据存储(Datastore)
  3. 创建备份用户并生成 API Token

在 PVE 端:

  1. Datacenter → StorageAddProxmox Backup Server
  2. 填入:
    • ID:存储名称
    • Server:PBS 服务器地址
    • Username:PBS 用户名
    • Password:PBS 密码
    • Datastore:PBS 数据存储名
    • Fingerprint:PBS 证书指纹
  3. 点击 Add

获取 PBS 指纹:

BASH
# 在 PBS 上执行
proxmox-backup-manager cert info | grep Fingerprint

4.4 使用 PBS 备份

配置好 PBS 存储后,使用方式和普通备份完全一样:

BASH
# 通过 PBS 备份
vzdump 100 --storage pbs-storage --mode snapshot

# 定时备份到 PBS(Web UI 配置)
# Datacenter → Backup → Add → Storage 选 PBS

4.5 PBS 垃圾回收

PBS 的去重机制会产生垃圾数据,需要定期清理:

BASH
# 手动触发垃圾回收
proxmox-backup-manager garbage-collection start pbs-datastore

# 查看垃圾回收状态
proxmox-backup-manager garbage-collection status pbs-datastore

配置定时垃圾回收:

BASH
# 每周日凌晨 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 快照的优势

5.2 手动 ZFS 快照

BASH
# 创建快照
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-20260704

5.3 自动化 ZFS 快照脚本

BASH
#!/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:

BASH
# 每小时快照
0 * * * * /opt/zfs-snapshot.sh

5.4 用 sanoid 管理快照(推荐)

sanoid 是一个优秀的 ZFS 快照管理工具:

BASH
# 安装 sanoid
apt install sanoid -y

# 配置
cp /etc/sanoid/sanoid.defaults.conf /etc/sanoid/sanoid.conf
nano /etc/sanoid/sanoid.conf

配置示例:

INI
[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
BASH
# 启用定时任务
systemctl enable sanoid.timer
systemctl start sanoid.timer

六、异地备份策略

本地备份解决不了机房级别的灾难(火灾、断电、硬件被盗)。你需要异地备份。

6.1 异地备份方案对比

方案 成本 难度 自动化 推荐度
PBS 远程同步 中(需要第二台 PBS) ✅ 原生支持 ⭐⭐⭐⭐⭐
ZFS send/recv 需脚本 ⭐⭐⭐⭐
rsync 同步 需脚本 ⭐⭐⭐
rclone 到云存储 需脚本 ⭐⭐⭐⭐
手动拷贝

6.2 PBS 远程同步(推荐)

PBS 原生支持在两台 PBS 之间同步数据:

在主 PBS 上配置同步任务:

BASH
# 添加远程 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 远程备份

BASH
#!/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
done

6.4 rclone 到云存储

将备份文件同步到 S3、Backblaze B2 等低成本云存储:

BASH
# 安装 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

加入定时任务:

BASH
# 每天备份完成后同步到云端(4点开始)
0 4 * * * rclone sync /var/lib/vz/dump/ remote:pbs-backup/ --transfers 4 --checkers 8 --log-file /var/log/rclone.log

七、灾难恢复演练

有备份不等于能恢复。定期演练是确保备份有效性的唯一方法。

7.1 演练流程

PLAINTEXT
1. 选择一个非生产时段
2. 选择一台虚拟机的最新备份
3. 恢复到新的 VM ID(不影响原虚拟机)
4. 启动恢复的虚拟机
5. 验证数据完整性
6. 验证服务功能
7. 清理演练虚拟机
8. 记录演练结果

7.2 自动化演练脚本

BASH
#!/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.log

7.3 演练检查清单


八、备份监控与告警

8.1 监控备份状态

BASH
# 查看备份任务状态
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-datastore

8.2 备份失败告警脚本

BASH
#!/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"
fi

8.3 配置邮件通知

PVE 可以在备份任务完成后自动发邮件:

  1. Datacenter → OptionsEmail from address 设置发件邮箱
  2. 配置 SMTP:
    BASH
    echo "smtp.example.com yourname:yourpassword" > /etc/postfix/sasl_passwd
    postmap /etc/postfix/sasl_passwd
  3. 备份任务中设置 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:备份占用太多空间怎么办?

Q2:备份时间太长怎么办?

Q3:快照备份和停机备份怎么选?

Q4:恢复后虚拟机无法启动怎么办?

  1. 检查恢复日志是否有错误
  2. 检查磁盘是否完整恢复
  3. 进入虚拟机控制台查看启动日志
  4. 可能需要修复文件系统:fsck
  5. 检查网络配置是否正确

Q5:如何验证备份是否完整?

BASH
# 验证 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

十一、总结

备份体系架构图

PLAINTEXT
                    生产数据(PVE)
                         │
            ┌────────────┼────────────┐
            │            │            │
      ZFS 快照       本地 PBS     vzdump 备份
     (秒级回滚)   (增量去重)  (传统完整备份)
                         │
                    ┌────┴────┐
                    │         │
              远程 PBS    云存储同步
             (灾备恢复)  (低成本归档)

快速上手清单


【相关推荐】


备份的意义不在于"做了备份",而在于"出事时能恢复"。定期演练,确保你的备份真的能用。数据无价,备份先行。🚀

版权声明

作者: 易邦

链接: https://blog.e8k.net/posts/pve-backup-restore-2026/

许可证: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。