Proxmox VE 配置备份与恢复方案 💾
本指南详细介绍 PVE 系统的完整备份和恢复流程,确保在系统重装或故障时能够快速恢复虚拟化环境。包含从基础备份到高级恢复策略的全面方案!🚀
📖 导航目录
📋 备份策略概述 备份内容分类
🏢 虚拟机磁盘数据 - 最重要的数据,存储在第二块硬盘
⚙️ PVE 配置信息 - 集群配置、虚拟机设置、网络配置等
📄 系统配置文件 - 内核模块、GRUB 设置、网络配置
🔐 证书和密钥 - SSL 证书、API 密钥、认证信息
👥 用户和权限 - 用户配置、访问控制列表
推荐存储方案
备份频率建议
数据类型
备份频率
保留策略
存储位置
虚拟机配置
每日
保留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-backupchown root:root /var/lib/vz/pve-backup
2. 执行本地备份命令 备份 PVE 集群配置 1 2 3 4 5 6 rsync -avhu --progress /var/lib/pve-cluster/config.db /var/lib/vz/pve-backup/ 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 rsync -avhu --progress /etc/modules-load.d/* /var/lib/vz/pve-backup/modules-load.d/ rsync -avhu --progress /etc/default/grub /var/lib/vz/pve-backup/ rsync -avhu --progress /etc/modules /var/lib/vz/pve-backup/ rsync -avhu --progress /etc/network/* /var/lib/vz/pve-backup/network/ rsync -avhu --progress /etc/resolv.conf /var/lib/vz/pve-backup/ rsync -avhu --progress /etc/hosts /var/lib/vz/pve-backup/ 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 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/ 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/ rsync -avhu --progress /etc/pve/storage.cfg /var/lib/vz/pve-backup/storage/ 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.txtecho "PVE 版本: $(pveversion) " >> /var/lib/vz/pve-backup/backup-info.txtecho "内核版本: $(uname -r) " >> /var/lib/vz/pve-backup/backup-info.txtecho "主机名: $(hostname) " >> /var/lib/vz/pve-backup/backup-info.txtfind /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.dbls -la /var/lib/vz/pve-backup/network/sha256sum -c /var/lib/vz/pve-backup/checksums.txtif [ -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 mkdir -p /mnt/ntfs/pve/pve-backupmount -t nfs 192.168.1.100:/backup /mnt/ntfs rsync -avhu --progress --delete /var/lib/vz/pve-backup/ /mnt/ntfs/pve/pve-backup/ diff -r /var/lib/vz/pve-backup/ /mnt/ntfs/pve/pve-backup/ umount /mnt/ntfs
方案二:跨服务器同步 1 2 3 4 5 6 7 8 9 mkdir -p /mnt/ARS2-NFS/pve/pve-backuprsync -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 ssh-keygen -t rsa -b 4096 ssh-copy-id root@10.10.10.251 scp -P 22 -r /var/lib/vz/pve-backup/* root@10.10.10.251:/mnt/mydisk/pve/pve-backup/ 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 apt install rclone rclone config rclone sync /var/lib/vz/pve-backup/ remote:backup/pve-config/ 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-backupscp -P 22 -r root@10.10.10.251:/mnt/mydisk/pve-backup/* /var/lib/vz/pve-backup/ 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.txtPVE_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 cp -r /var/lib/vz/pve-backup/config.db /var/lib/pve-cluster/cp -r /var/lib/vz/pve-backup/modules-load.d/* /etc/modules-load.d/cp -r /var/lib/vz/pve-backup/grub /etc/default/cp -r /var/lib/vz/pve-backup/modules /etc/cp -r /var/lib/vz/pve-backup/network/* /etc/network/cp -r /var/lib/vz/pve-backup/resolv.conf /etc/cp -r /var/lib/vz/pve-backup/hosts /etc/cp -r /var/lib/vz/pve-backup/cron/* /etc/cron.*/cp -r /var/lib/vz/pve-backup/cron/spool/* /var/spool/cron/cp -r /var/lib/vz/pve-backup/ssl/* /etc/pve/local/cp -r /var/lib/vz/pve-backup/ssl/* /etc/pve/nodes/$(hostname)/cp -r /var/lib/vz/pve-backup/users/* /etc/pve/cp -r /var/lib/vz/pve-backup/storage/* /etc/pve/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 update-grub update-initramfs -k all -u systemctl restart networking 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 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.txtecho "PVE 版本: $(pveversion) " >> $BACKUP_DIR /backup-info.txtecho "内核版本: $(uname -r) " >> $BACKUP_DIR /backup-info.txtecho "主机名: $(hostname) " >> $BACKUP_DIR /backup-info.txtfind $BACKUP_DIR -type f > $BACKUP_DIR /file-list.txt sha256sum $BACKUP_DIR /* > $BACKUP_DIR /checksums.txtecho "$(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 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 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>&1cp -r $BACKUP_DIR /modules-load.d/* /etc/modules-load.d/ >> $LOG_FILE 2>&1cp -r $BACKUP_DIR /grub /etc/default/ >> $LOG_FILE 2>&1cp -r $BACKUP_DIR /modules /etc/ >> $LOG_FILE 2>&1cp -r $BACKUP_DIR /network/* /etc/network/ >> $LOG_FILE 2>&1cp -r $BACKUP_DIR /resolv.conf /etc/ >> $LOG_FILE 2>&1cp -r $BACKUP_DIR /hosts /etc/ >> $LOG_FILE 2>&1cp -r $BACKUP_DIR /cron/* /etc/cron.*/ >> $LOG_FILE 2>&1cp -r $BACKUP_DIR /cron/spool/* /var/spool/cron/ >> $LOG_FILE 2>&1cp -r $BACKUP_DIR /ssl/* /etc/pve/local/ >> $LOG_FILE 2>&1cp -r $BACKUP_DIR /ssl/* /etc/pve/nodes/$(hostname)/ >> $LOG_FILE 2>&1cp -r $BACKUP_DIR /users/* /etc/pve/ >> $LOG_FILE 2>&1cp -r $BACKUP_DIR /storage/* /etc/pve/ >> $LOG_FILE 2>&1cp -r $BACKUP_DIR /firewall/* /etc/pve/firewall/ >> $LOG_FILE 2>&1echo "$(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 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 -e 0 2 * * * /usr/local/bin/pve-backup.sh 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 --encrypt --recipient "backup@example.com" /var/lib/vz/pve-backup/config.db 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' 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.txtsha256sum -c /var/lib/vz/pve-backup/checksum.txtcat > /usr/local/bin/test-restore << 'EOF' TEST_DIR="/tmp/pve-restore-test" mkdir -p $TEST_DIR cp -r /var/lib/vz/pve-backup/* $TEST_DIR /sha256sum -c $TEST_DIR /checksums.txtif [ -f "$TEST_DIR /grub" ]; then echo "测试 GRUB 配置..." fi echo "恢复测试完成" rm -rf $TEST_DIR EOF chmod +x /usr/local/bin/test-restore
3. 多重备份策略
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' 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 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 0EOF chmod +x /etc/cron.daily/pve-backup-check
⚠️ 重要注意事项 1. 虚拟机磁盘备份 1 2 3 4 5 6 7 8 9 10 11 qm config <VMID> | grep -i disk 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 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/*
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 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 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 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 备份和恢复体系,确保业务连续性和数据安全。记住,备份只有在能够成功恢复时才有价值,因此请定期测试您的恢复流程!🔐