Proxmox VE 配置备份与恢复方案 💾

本指南详细介绍 PVE 系统的完整备份和恢复流程,确保在系统重装或故障时能够快速恢复虚拟化环境。包含从基础备份到高级恢复策略的全面方案!🚀


📖 导航目录


📋 备份策略概述

备份内容分类

  1. 🏢 虚拟机磁盘数据 - 最重要的数据,存储在第二块硬盘
  2. ⚙️ PVE 配置信息 - 集群配置、虚拟机设置、网络配置等
  3. 📄 系统配置文件 - 内核模块、GRUB 设置、网络配置
  4. 🔐 证书和密钥 - SSL 证书、API 密钥、认证信息
  5. 👥 用户和权限 - 用户配置、访问控制列表

推荐存储方案

备份虚拟机磁盘

备份频率建议

数据类型 备份频率 保留策略 存储位置
虚拟机配置 每日 保留30天 本地+远程
虚拟机磁盘 每周全备+每日增量 保留4周 专用存储
系统配置 每周 保留12周 本地+远程
证书密钥 变更时备份 永久保留 加密存储

💾 本地备份配置

1. 创建备份目录结构

1
2
3
4
5
6
7
8
# 创建完整的备份目录结构
mkdir -p /var/lib/vz/pve-backup/{modules-load.d,pve-cluster,network,ssl,users,storage}
mkdir -p /var/lib/vz/pve-backup/{cron,logs,scripts}
# 📁 创建分类备份目录

# 设置正确的权限
chmod 700 /var/lib/vz/pve-backup
chown root:root /var/lib/vz/pve-backup

2. 执行本地备份命令

备份 PVE 集群配置

1
2
3
4
5
6
# 1. 备份核心配置文件
rsync -avhu --progress /var/lib/pve-cluster/config.db /var/lib/vz/pve-backup/
# 🗃️ config.db 包含所有虚拟机配置和集群设置

# 备份整个 pve-cluster 目录(可选)
rsync -avhu --progress /var/lib/pve-cluster/ /var/lib/vz/pve-backup/pve-cluster/

备份系统配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 2. 备份内核模块配置
rsync -avhu --progress /etc/modules-load.d/* /var/lib/vz/pve-backup/modules-load.d/

# 3. 备份 GRUB 配置
rsync -avhu --progress /etc/default/grub /var/lib/vz/pve-backup/

# 4. 备份内核模块列表
rsync -avhu --progress /etc/modules /var/lib/vz/pve-backup/

# 5. 备份网络配置
rsync -avhu --progress /etc/network/* /var/lib/vz/pve-backup/network/

# 6. 备份 DNS 配置
rsync -avhu --progress /etc/resolv.conf /var/lib/vz/pve-backup/
rsync -avhu --progress /etc/hosts /var/lib/vz/pve-backup/

# 7. 备份定时任务
rsync -avhu --progress /etc/cron.* /var/lib/vz/pve-backup/cron/
rsync -avhu --progress /var/spool/cron/ /var/lib/vz/pve-backup/cron/spool/

备份 PVE 特定配置

1
2
3
4
5
6
7
8
9
10
11
12
13
# 8. 备份 SSL 证书和密钥
rsync -avhu --progress /etc/pve/local/pve-ssl.* /var/lib/vz/pve-backup/ssl/
rsync -avhu --progress /etc/pve/nodes/*/pve-ssl.* /var/lib/vz/pve-backup/ssl/

# 9. 备份用户配置
rsync -avhu --progress /etc/pve/user.cfg /var/lib/vz/pve-backup/users/
rsync -avhu --progress /etc/pve/domains.cfg /var/lib/vz/pve-backup/users/

# 10. 备份存储配置
rsync -avhu --progress /etc/pve/storage.cfg /var/lib/vz/pve-backup/storage/

# 11. 备份防火墙配置
rsync -avhu --progress /etc/pve/firewall/ /var/lib/vz/pve-backup/firewall/

3. 创建备份元数据

1
2
3
4
5
6
7
8
9
10
11
# 记录备份信息
echo "备份时间: $(date)" > /var/lib/vz/pve-backup/backup-info.txt
echo "PVE 版本: $(pveversion)" >> /var/lib/vz/pve-backup/backup-info.txt
echo "内核版本: $(uname -r)" >> /var/lib/vz/pve-backup/backup-info.txt
echo "主机名: $(hostname)" >> /var/lib/vz/pve-backup/backup-info.txt

# 创建文件清单
find /var/lib/vz/pve-backup -type f > /var/lib/vz/pve-backup/file-list.txt

# 创建校验和
sha256sum /var/lib/vz/pve-backup/* > /var/lib/vz/pve-backup/checksums.txt

4. 验证备份结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查看备份文件结构
tree /var/lib/vz/pve-backup
# 📊 应该显示完整的目录结构

# 检查重要文件
ls -la /var/lib/vz/pve-backup/config.db
ls -la /var/lib/vz/pve-backup/network/

# 验证校验和
sha256sum -c /var/lib/vz/pve-backup/checksums.txt

# 检查备份完整性
if [ -f "/var/lib/vz/pve-backup/config.db" ]; then
echo "✅ 备份完成: $(date)"
else
echo "❌ 备份失败: config.db 不存在"
exit 1
fi

🌐 远程备份方案

方案一:NFS 共享备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建 NFS 备份目录
mkdir -p /mnt/ntfs/pve/pve-backup

# 挂载 NFS 共享(如果尚未挂载)
mount -t nfs 192.168.1.100:/backup /mnt/ntfs

# 同步到 NFS 共享
rsync -avhu --progress --delete /var/lib/vz/pve-backup/ /mnt/ntfs/pve/pve-backup/
# 🔄 同步到本地 NFS 共享目录

# 验证同步结果
diff -r /var/lib/vz/pve-backup/ /mnt/ntfs/pve/pve-backup/
# ✅ 两个目录内容应该一致

# 卸载 NFS 共享(可选)
umount /mnt/ntfs

方案二:跨服务器同步

1
2
3
4
5
6
7
8
9
# 从 Debian 服务器同步到备份服务器
mkdir -p /mnt/ARS2-NFS/pve/pve-backup

# 使用 rsync 进行同步
rsync -avhu --progress --delete /mnt/PVE-NFS/pve/pve-backup/ /mnt/ARS2-NFS/pve/pve-backup/
# 🌐 跨服务器备份增加冗余

# 添加校验和验证
rsync -avhu --progress --checksum /mnt/PVE-NFS/pve/pve-backup/ /mnt/ARS2-NFS/pve/pve-backup/

方案三:SCP 安全拷贝

1
2
3
4
5
6
7
8
9
10
11
# 直接备份到远程服务器(10.10.10.251)
# 首先设置 SSH 免密登录
ssh-keygen -t rsa -b 4096
ssh-copy-id root@10.10.10.251

# 使用 SCP 进行加密传输
scp -P 22 -r /var/lib/vz/pve-backup/* root@10.10.10.251:/mnt/mydisk/pve/pve-backup/
# 🔒 使用 SCP 进行加密传输

# 或者使用 rsync over SSH
rsync -avhu --progress -e "ssh -p 22" /var/lib/vz/pve-backup/ root@10.10.10.251:/mnt/mydisk/pve/pve-backup/

方案四:云存储备份

1
2
3
4
5
6
7
8
9
10
11
# 使用 rclone 备份到云存储
# 首先安装和配置 rclone
apt install rclone
rclone config

# 同步到云存储
rclone sync /var/lib/vz/pve-backup/ remote:backup/pve-config/

# 或者使用 duplicity 进行加密备份
apt install duplicity
duplicity --encrypt-key "BACKUP_KEY" /var/lib/vz/pve-backup/ file:///mnt/backup/pve-config/

🔄 恢复流程

1. 准备恢复环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 创建恢复目录
mkdir -p /var/lib/vz/pve-backup

# 从远程服务器获取备份文件
# 使用 SCP
scp -P 22 -r root@10.10.10.251:/mnt/mydisk/pve-backup/* /var/lib/vz/pve-backup/

# 或者使用 rsync
rsync -avhu --progress -e "ssh -p 22" root@10.10.10.251:/mnt/mydisk/pve-backup/* /var/lib/vz/pve-backup/

# 验证备份完整性
sha256sum -c /var/lib/vz/pve-backup/checksums.txt

# 检查备份版本兼容性
PVE_VERSION=$(pveversion)
BACKUP_VERSION=$(grep "PVE 版本" /var/lib/vz/pve-backup/backup-info.txt | cut -d: -f2)
echo "当前版本: $PVE_VERSION"
echo "备份版本: $BACKUP_VERSION"

2. 恢复配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 1. 恢复集群配置
cp -r /var/lib/vz/pve-backup/config.db /var/lib/pve-cluster/

# 2. 恢复内核模块配置
cp -r /var/lib/vz/pve-backup/modules-load.d/* /etc/modules-load.d/

# 3. 恢复 GRUB 配置
cp -r /var/lib/vz/pve-backup/grub /etc/default/

# 4. 恢复内核模块
cp -r /var/lib/vz/pve-backup/modules /etc/

# 5. 恢复网络配置
cp -r /var/lib/vz/pve-backup/network/* /etc/network/

# 6. 恢复 DNS 配置
cp -r /var/lib/vz/pve-backup/resolv.conf /etc/
cp -r /var/lib/vz/pve-backup/hosts /etc/

# 7. 恢复定时任务
cp -r /var/lib/vz/pve-backup/cron/* /etc/cron.*/
cp -r /var/lib/vz/pve-backup/cron/spool/* /var/spool/cron/

# 8. 恢复 SSL 证书和密钥
cp -r /var/lib/vz/pve-backup/ssl/* /etc/pve/local/
cp -r /var/lib/vz/pve-backup/ssl/* /etc/pve/nodes/$(hostname)/

# 9. 恢复用户配置
cp -r /var/lib/vz/pve-backup/users/* /etc/pve/

# 10. 恢复存储配置
cp -r /var/lib/vz/pve-backup/storage/* /etc/pve/

# 11. 恢复防火墙配置
cp -r /var/lib/vz/pve-backup/firewall/* /etc/pve/firewall/

3. 应用配置更改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 更新 GRUB 配置
update-grub
# 🔧 重新生成 GRUB 引导菜单

# 更新 initramfs
update-initramfs -k all -u
# 🐧 更新所有内核的 initramfs

# 重启网络服务
systemctl restart networking
# 🌐 应用新的网络配置

# 重启 PVE 服务
systemctl restart pve-cluster
systemctl restart pvedaemon
systemctl restart pveproxy
systemctl restart pvestatd

# 重新加载防火墙
pve-firewall restart

# 重新加载存储配置
pvesm set <storage> --content <content>

4. 最终验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 检查恢复结果
tree /var/lib/vz/pve-backup

# 验证集群状态
pvecm status

# 检查虚拟机配置
qm list

# 测试网络连接
ping -c 4 8.8.8.8

# 检查存储状态
pvesm status

# 验证证书
openssl x509 -in /etc/pve/local/pve-ssl.pem -noout -text | grep "Not After"

# 检查服务状态
systemctl status pve-cluster pvedaemon pveproxy pvestatd

⚙️ 自动化备份脚本

完整备份脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/bin/bash
# PVE 自动备份脚本
BACKUP_DIR="/var/lib/vz/pve-backup"
LOG_FILE="/var/log/pve-backup.log"
REMOTE_SERVER="root@10.10.10.251"
REMOTE_PATH="/mnt/mydisk/pve/pve-backup"
RETENTION_DAYS=30

# 记录开始时间
echo "=== 开始 PVE 配置备份: $(date) ===" >> $LOG_FILE

# 创建备份目录
mkdir -p $BACKUP_DIR/{modules-load.d,pve-cluster,network,ssl,users,storage,cron,logs,scripts}

# 执行备份
echo "$(date) - 开始备份配置文件..." >> $LOG_FILE
rsync -avhu --progress /var/lib/pve-cluster/config.db $BACKUP_DIR/ >> $LOG_FILE 2>&1
rsync -avhu --progress /etc/modules-load.d/* $BACKUP_DIR/modules-load.d/ >> $LOG_FILE 2>&1
rsync -avhu --progress /etc/default/grub $BACKUP_DIR/ >> $LOG_FILE 2>&1
rsync -avhu --progress /etc/modules $BACKUP_DIR/ >> $LOG_FILE 2>&1
rsync -avhu --progress /etc/network/* $BACKUP_DIR/network/ >> $LOG_FILE 2>&1
rsync -avhu --progress /etc/resolv.conf $BACKUP_DIR/ >> $LOG_FILE 2>&1
rsync -avhu --progress /etc/hosts $BACKUP_DIR/ >> $LOG_FILE 2>&1
rsync -avhu --progress /etc/cron.* $BACKUP_DIR/cron/ >> $LOG_FILE 2>&1
rsync -avhu --progress /var/spool/cron/ $BACKUP_DIR/cron/spool/ >> $LOG_FILE 2>&1
rsync -avhu --progress /etc/pve/local/pve-ssl.* $BACKUP_DIR/ssl/ >> $LOG_FILE 2>&1
rsync -avhu --progress /etc/pve/user.cfg $BACKUP_DIR/users/ >> $LOG_FILE 2>&1
rsync -avhu --progress /etc/pve/domains.cfg $BACKUP_DIR/users/ >> $LOG_FILE 2>&1
rsync -avhu --progress /etc/pve/storage.cfg $BACKUP_DIR/storage/ >> $LOG_FILE 2>&1
rsync -avhu --progress /etc/pve/firewall/ $BACKUP_DIR/firewall/ >> $LOG_FILE 2>&1

# 创建元数据
echo "备份时间: $(date)" > $BACKUP_DIR/backup-info.txt
echo "PVE 版本: $(pveversion)" >> $BACKUP_DIR/backup-info.txt
echo "内核版本: $(uname -r)" >> $BACKUP_DIR/backup-info.txt
echo "主机名: $(hostname)" >> $BACKUP_DIR/backup-info.txt
find $BACKUP_DIR -type f > $BACKUP_DIR/file-list.txt
sha256sum $BACKUP_DIR/* > $BACKUP_DIR/checksums.txt

# 远程同步
echo "$(date) - 同步到远程服务器..." >> $LOG_FILE
rsync -avhu --progress -e "ssh -p 22" $BACKUP_DIR/ $REMOTE_SERVER:$REMOTE_PATH/ >> $LOG_FILE 2>&1

# 清理旧备份
echo "$(date) - 清理旧备份..." >> $LOG_FILE
find $BACKUP_DIR -type f -mtime +$RETENTION_DAYS -delete >> $LOG_FILE 2>&1
ssh -p 22 $REMOTE_SERVER "find $REMOTE_PATH -type f -mtime +$RETENTION_DAYS -delete" >> $LOG_FILE 2>&1

# 记录完成时间
echo "=== PVE 配置备份完成: $(date) ===" >> $LOG_FILE

# 发送通知(可选)
if command -v sendmail > /dev/null; then
echo "PVE 配置备份已完成于 $(date)" | mail -s "PVE 备份通知" admin@example.com
fi

exit 0

恢复脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/bin/bash
# PVE 自动恢复脚本
BACKUP_DIR="/var/lib/vz/pve-backup"
LOG_FILE="/var/log/pve-restore.log"
REMOTE_SERVER="root@10.10.10.251"
REMOTE_PATH="/mnt/mydisk/pve/pve-backup"

# 记录开始时间
echo "=== 开始 PVE 配置恢复: $(date) ===" > $LOG_FILE

# 从远程获取备份
echo "$(date) - 从远程服务器获取备份..." >> $LOG_FILE
rsync -avhu --progress -e "ssh -p 22" $REMOTE_SERVER:$REMOTE_PATH/ $BACKUP_DIR/ >> $LOG_FILE 2>&1

# 验证备份完整性
echo "$(date) - 验证备份完整性..." >> $LOG_FILE
if ! sha256sum -c $BACKUP_DIR/checksums.txt >> $LOG_FILE 2>&1; then
echo "错误: 备份校验失败!" >> $LOG_FILE
exit 1
fi

# 停止 PVE 服务
echo "$(date) - 停止 PVE 服务..." >> $LOG_FILE
systemctl stop pveproxy pvestatd pvedaemon pve-cluster >> $LOG_FILE 2>&1

# 恢复配置
echo "$(date) - 恢复配置文件..." >> $LOG_FILE
cp -r $BACKUP_DIR/config.db /var/lib/pve-cluster/ >> $LOG_FILE 2>&1
cp -r $BACKUP_DIR/modules-load.d/* /etc/modules-load.d/ >> $LOG_FILE 2>&1
cp -r $BACKUP_DIR/grub /etc/default/ >> $LOG_FILE 2>&1
cp -r $BACKUP_DIR/modules /etc/ >> $LOG_FILE 2>&1
cp -r $BACKUP_DIR/network/* /etc/network/ >> $LOG_FILE 2>&1
cp -r $BACKUP_DIR/resolv.conf /etc/ >> $LOG_FILE 2>&1
cp -r $BACKUP_DIR/hosts /etc/ >> $LOG_FILE 2>&1
cp -r $BACKUP_DIR/cron/* /etc/cron.*/ >> $LOG_FILE 2>&1
cp -r $BACKUP_DIR/cron/spool/* /var/spool/cron/ >> $LOG_FILE 2>&1
cp -r $BACKUP_DIR/ssl/* /etc/pve/local/ >> $LOG_FILE 2>&1
cp -r $BACKUP_DIR/ssl/* /etc/pve/nodes/$(hostname)/ >> $LOG_FILE 2>&1
cp -r $BACKUP_DIR/users/* /etc/pve/ >> $LOG_FILE 2>&1
cp -r $BACKUP_DIR/storage/* /etc/pve/ >> $LOG_FILE 2>&1
cp -r $BACKUP_DIR/firewall/* /etc/pve/firewall/ >> $LOG_FILE 2>&1

# 应用配置
echo "$(date) - 应用配置更改..." >> $LOG_FILE
update-grub >> $LOG_FILE 2>&1
update-initramfs -k all -u >> $LOG_FILE 2>&1
systemctl restart networking >> $LOG_FILE 2>&1

# 启动 PVE 服务
echo "$(date) - 启动 PVE 服务..." >> $LOG_FILE
systemctl start pve-cluster pvedaemon pveproxy pvestatd >> $LOG_FILE 2>&1
pve-firewall restart >> $LOG_FILE 2>&1

# 验证恢复
echo "$(date) - 验证恢复结果..." >> $LOG_FILE
pvecm status >> $LOG_FILE 2>&1
qm list >> $LOG_FILE 2>&1
pvesm status >> $LOG_FILE 2>&1

# 记录完成时间
echo "=== PVE 配置恢复完成: $(date) ===" >> $LOG_FILE

echo "恢复完成,请检查日志文件: $LOG_FILE"
exit 0

设置定时任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 编辑 crontab
crontab -e

# 添加每日备份任务(凌晨2点)
0 2 * * * /usr/local/bin/pve-backup.sh

# 添加每周恢复测试任务(周日凌晨3点)
0 3 * * 0 /usr/local/bin/pve-restore-test.sh

# 添加日志轮转配置
cat > /etc/logrotate.d/pve-backup << EOF
/var/log/pve-backup.log {
weekly
missingok
rotate 4
compress
delaycompress
notifempty
create 640 root root
}
EOF

🔒 安全与最佳实践

1. 备份加密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 使用 GPG 加密备份文件
gpg --encrypt --recipient "backup@example.com" /var/lib/vz/pve-backup/config.db
# 🔐 保护敏感配置信息

# 或者使用 openssl 加密
openssl enc -aes-256-cbc -salt -in /var/lib/vz/pve-backup/config.db -out /var/lib/vz/pve-backup/config.db.enc

# 创建加密备份脚本
cat > /usr/local/bin/encrypt-backup << 'EOF'
#!/bin/bash
BACKUP_DIR="/var/lib/vz/pve-backup"
TAR_FILE="/tmp/pve-backup-$(date +%Y%m%d).tar.gz"
ENCRYPTED_FILE="/tmp/pve-backup-$(date +%Y%m%d).tar.gz.enc"

# 创建压缩包
tar -czf $TAR_FILE $BACKUP_DIR

# 加密压缩包
openssl enc -aes-256-cbc -salt -in $TAR_FILE -out $ENCRYPTED_FILE

# 上传加密文件到远程
scp -P 22 $ENCRYPTED_FILE root@10.10.10.251:/mnt/mydisk/pve/encrypted-backups/

# 清理临时文件
rm -f $TAR_FILE $ENCRYPTED_FILE
EOF
chmod +x /usr/local/bin/encrypt-backup

2. 定期验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 定期检查备份完整性
sha256sum /var/lib/vz/pve-backup/config.db > /var/lib/vz/pve-backup/checksum.txt

# 验证备份
sha256sum -c /var/lib/vz/pve-backup/checksum.txt

# 定期测试恢复流程
# 创建测试恢复脚本
cat > /usr/local/bin/test-restore << 'EOF'
#!/bin/bash
# 在隔离环境中测试恢复流程
TEST_DIR="/tmp/pve-restore-test"
mkdir -p $TEST_DIR

# 复制备份文件到测试目录
cp -r /var/lib/vz/pve-backup/* $TEST_DIR/

# 验证文件完整性
sha256sum -c $TEST_DIR/checksums.txt

# 测试配置文件语法
if [ -f "$TEST_DIR/grub" ]; then
echo "测试 GRUB 配置..."
# 这里可以添加更多的配置验证
fi

echo "恢复测试完成"
rm -rf $TEST_DIR
EOF
chmod +x /usr/local/bin/test-restore

3. 多重备份策略

1
2
3
4
5
6
7
8
# 设置多个备份位置
# 1. 本地备份 - 快速恢复
# 2. 局域网备份 - 防止单点故障
# 3. 远程异地备份 - 防止灾难性故障
# 4. 云存储备份 - 额外保护层

# 使用不同的备份工具增加冗余
# rsync, scp, rclone, duplicity 等

4. 监控与告警

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 添加备份监控
cat > /etc/cron.daily/pve-backup-check << 'EOF'
#!/bin/bash
LOG_FILE="/var/log/pve-backup-check.log"
BACKUP_DIR="/var/lib/vz/pve-backup"

# 检查备份是否存在
if [ ! -f "$BACKUP_DIR/config.db" ]; then
echo "备份失败: config.db 不存在" | mail -s "PVE 备份告警" admin@example.com
echo "$(date) - 备份失败: config.db 不存在" >> $LOG_FILE
exit 1
fi

# 检查备份新鲜度(24小时内)
if find "$BACKUP_DIR" -name "config.db" -mtime +1 | grep -q "."; then
echo "备份过期: config.db 超过24小时未更新" | mail -s "PVE 备份告警" admin@example.com
echo "$(date) - 备份过期: config.db 超过24小时未更新" >> $LOG_FILE
exit 1
fi

echo "$(date) - 备份检查正常" >> $LOG_FILE
exit 0
EOF
chmod +x /etc/cron.daily/pve-backup-check

⚠️ 重要注意事项

1. 虚拟机磁盘备份

1
2
3
4
5
6
7
8
9
10
11
# 虚拟机磁盘需要单独备份
# 建议使用 PVE 内置备份功能或存储复制

# 查看虚拟机磁盘位置
qm config <VMID> | grep -i disk

# 使用 PVE 内置备份功能
vzdump <VMID> --compress zstd --mode snapshot --storage <storage-id>

# 或者使用存储复制
pvesm add zfspool <pool-name> --pool <zpool-name> --content images

2. 证书和密钥安全

1
2
3
4
5
6
7
8
# 备份 SSL 证书和密钥
cp -r /etc/pve/local/pve-ssl.* /var/lib/vz/pve-backup/
cp -r /etc/pve/nodes/*/pve-ssl.* /var/lib/vz/pve-backup/

# 保护备份的证书文件
chmod 600 /var/lib/vz/pve-backup/ssl/*

# 考虑使用证书管理器(如 certbot)自动管理证书

3. 用户和权限管理

1
2
3
4
5
6
7
# 备份用户配置
cp /etc/pve/user.cfg /var/lib/vz/pve-backup/
cp /etc/pve/domains.cfg /var/lib/vz/pve-backup/

# 记录当前权限设置
pveum role list > /var/lib/vz/pve-backup/roles.txt
pveum acl list > /var/lib/vz/pve-backup/acl.txt

4. 存储配置注意事项

1
2
3
4
5
6
7
8
9
# 备份存储配置
cp /etc/pve/storage.cfg /var/lib/vz/pve-backup/

# 记录存储详细信息
pvesm status --verbose > /var/lib/vz/pve-backup/storage-details.txt

# 如果使用 ZFS,备份池配置
zpool status > /var/lib/vz/pve-backup/zpool-status.txt
zfs list > /var/lib/vz/pve-backup/zfs-list.txt

5. 版本兼容性

1
2
3
4
5
6
7
# 检查 PVE 版本兼容性
# 恢复时确保备份版本与当前版本兼容

# 记录版本信息
pveversion -v > /var/lib/vz/pve-backup/version-details.txt

# 如果跨大版本恢复,先测试兼容性

✅ 恢复后的检查清单

  • [ ] PVE 集群状态正常: pvecm status
  • [ ] 所有虚拟机配置可见: qm list
  • [ ] 网络连接正常: ping 8.8.8.8
  • [ ] 存储配置正确: pvesm status
  • [ ] 服务运行正常: systemctl status pve-cluster pvedaemon pveproxy pvestatd
  • [ ] 防火墙规则正确: pve-firewall compile
  • [ ] 证书有效: openssl x509 -in /etc/pve/local/pve-ssl.pem -noout -checkend 86400
  • [ ] 用户权限正确: pveum user list
  • [ ] 定时任务正常: systemctl status cron
  • [ ] 备份功能正常: 测试新的备份
  • [ ] 监控告警正常: 检查监控系统
  • [ ] 性能正常: 检查系统负载和资源使用

🚨 重要提醒: 定期测试恢复流程,确保备份的有效性。建议每季度至少进行一次恢复测试。

恢复测试脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/bash
# PVE 恢复测试脚本
echo "=== PVE 恢复测试开始: $(date) ==="

# 检查基本服务
services=("pve-cluster" "pvedaemon" "pveproxy" "pvestatd")
for service in "${services[@]}"; do
if systemctl is-active --quiet "$service"; then
echo "✅ $service 运行正常"
else
echo "❌ $service 未运行"
fi
done

# 检查集群状态
if pvecm status > /dev/null 2>&1; then
echo "✅ 集群状态正常"
else
echo "❌ 集群状态异常"
fi

# 检查虚拟机
if qm list > /dev/null 2>&1; then
echo "✅ 虚拟机列表可访问"
VM_COUNT=$(qm list | grep -c running)
echo "运行中的虚拟机: $VM_COUNT"
else
echo "❌ 无法访问虚拟机列表"
fi

# 检查存储
if pvesm status > /dev/null 2>&1; then
echo "✅ 存储状态正常"
else
echo "❌ 存储状态异常"
fi

# 检查网络
if ping -c 1 -W 1 8.8.8.8 > /dev/null 2>&1; then
echo "✅ 网络连接正常"
else
echo "❌ 网络连接异常"
fi

echo "=== PVE 恢复测试完成: $(date) ==="

通过本指南,您应该能够建立完整的 PVE 备份和恢复体系,确保业务连续性和数据安全。记住,备份只有在能够成功恢复时才有价值,因此请定期测试您的恢复流程!🔐