PVE 存储管理与备份策略
本文系统介绍 PVE 的存储管理方案,涵盖硬盘管理、ZFS 配置、自动化备份、异地同步等核心内容,帮助读者构建可靠的数据保护体系。
PVE 存储架构概览
PVE 支持多种存储类型:
| 存储类型 | 适用场景 | 特点 |
|---|---|---|
| Local (LVM) | 系统盘、小容量 | 简单、性能好 |
| Local-ZFS | 大容量、数据安全 | 快照、压缩、去重 |
| Ceph | 分布式、多节点 | 高可用、扩展性强 |
| NFS | 共享存储、备份 | 易于共享 |
| iSCSI | SAN 环境 | 块设备共享 |
ZFS 存储池配置
ZFS 基础概念
ZFS 是 PVE 推荐的高级文件系统,提供:
- 写时复制 (Copy-on-Write):保证数据一致性
- 快照:瞬时创建,空间高效
- 压缩:节省存储空间
- 去重:消除重复数据块
- 校验和:自动检测数据损坏
创建 ZFS 存储池
# 查看可用磁盘
lsblk
# 单盘 ZFS(简单,无冗余)
zpool create tank /dev/sdb
# 镜像模式(RAID1,推荐)
zpool create tank mirror /dev/sdb /dev/sdc
# RAIDZ1(RAID5,单盘冗余)
zpool create tank raidz1 /dev/sdb /dev/sdc /dev/sdd
# RAIDZ2(RAID6,双盘冗余)
zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
ZFS 数据集管理
# 创建数据集(类似分区)
zfs create tank/vm-storage
zfs create tank/backup
# 启用压缩
zfs set compression=lz4 tank/vm-storage
# 设置配额
zfs set quota=500G tank/vm-storage
# 查看存储池状态
zpool status
zfs list
ZFS 快照管理
# 创建快照
zfs snapshot tank/vm-storage@2024-01-01
# 查看快照
zfs list -t snapshot
# 回滚快照
zfs rollback tank/vm-storage@2024-01-01
# 删除快照
zfs destroy tank/vm-storage@2024-01-01
# 快照自动清理(保留最近 7 天)
zfs set com.sun:auto-snapshot=true tank/vm-storage
PVE 备份策略
内置备份功能
PVE 提供 vzdump 工具进行虚拟机备份:
# 备份单个虚拟机
vzdump 100 --compress zstd --mode snapshot
# 备份多个虚拟机
vzdump 100 101 102 --compress zstd
# 备份到指定目录
vzdump 100 --dumpdir /mnt/backup --compress zstd
# 排除临时文件
vzdump 100 --exclude-path /tmp --exclude-path /var/cache
备份模式:
snapshot:快照模式,不影响运行(推荐)suspend:暂停模式,短暂中断stop:停机模式,完全关机后备份
自动化备份脚本
cat > /usr/local/bin/pve-backup.sh <<'EOF'
#!/bin/bash
# PVE 自动备份脚本
BACKUP_DIR="/mnt/backup/pve"
RETENTION_DAYS=7
LOG_FILE="/var/log/pve-backup.log"
DATE=$(date +%Y%m%d_%H%M%S)
# 需要备份的 VMID 列表
VM_LIST="100 101 102 103"
# 创建备份目录
mkdir -p ${BACKUP_DIR}/${DATE}
# 备份日志
echo "[$(date)] 开始备份" >> ${LOG_FILE}
# 逐个备份虚拟机
for VMID in ${VM_LIST}
do
echo "[$(date)] 备份 VM ${VMID}..." >> ${LOG_FILE}
vzdump ${VMID} \
--dumpdir ${BACKUP_DIR}/${DATE} \
--mode snapshot \
--compress zstd \
--quiet 1
if [ $? -eq 0 ]; then
echo "[$(date)] VM ${VMID} 备份成功" >> ${LOG_FILE}
else
echo "[$(date)] VM ${VMID} 备份失败" >> ${LOG_FILE}
fi
done
# 清理旧备份
echo "[$(date)] 清理 ${RETENTION_DAYS} 天前的备份" >> ${LOG_FILE}
find ${BACKUP_DIR} -maxdepth 1 -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} \;
echo "[$(date)] 备份完成" >> ${LOG_FILE}
EOF
chmod +x /usr/local/bin/pve-backup.sh
定时任务配置
# 编辑 crontab
crontab -e
# 每天凌晨 2 点备份
0 2 * * * /usr/local/bin/pve-backup.sh
# 每周日全量备份
0 3 * * 0 /usr/local/bin/pve-backup.sh full
异地备份方案
方案1:Rsync 同步
cat > /usr/local/bin/sync-offsite.sh <<'EOF'
#!/bin/bash
# 本地备份目录
LOCAL_DIR="/mnt/backup/pve"
# 远程备份服务器
REMOTE_HOST="backup.example.com"
REMOTE_DIR="/backup/pve"
REMOTE_USER="backup"
# Rsync 同步
rsync -avz --delete \
-e "ssh -i /root/.ssh/backup_key" \
${LOCAL_DIR}/ \
${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/
# 检查同步结果
if [ $? -eq 0 ]; then
echo "[$(date)] 异地同步成功" >> /var/log/pve-sync.log
else
echo "[$(date)] 异地同步失败" >> /var/log/pve-sync.log
fi
EOF
chmod +x /usr/local/bin/sync-offsite.sh
方案2:BorgBackup 加密备份
# 安装 borgbackup
apt install borgbackup
# 初始化仓库
export BORG_REPO="ssh://backup@backup.example.com/backup/pve-borg"
export BORG_PASSPHRASE="your-passphrase"
borg init --encryption=repokey-blake2
# 创建备份脚本
cat > /usr/local/bin/borg-backup.sh <<'EOF'
#!/bin/bash
export BORG_REPO="ssh://backup@backup.example.com/backup/pve-borg"
export BORG_PASSPHRASE="your-passphrase"
# 创建备份
borg create \
--compression lz4 \
::{hostname}-{now:%Y-%m-%d-%H%M%S} \
/etc/pve \
/mnt/backup/pve
# 清理旧备份(保留策略)
borg prune \
--keep-daily=7 \
--keep-weekly=4 \
--keep-monthly=6
# 检查备份完整性
borg check
EOF
chmod +x /usr/local/bin/borg-backup.sh
文件级备份工具
Syncthing 双向同步
适用于文档、配置等需要双向同步的场景:
# 安装 Syncthing
curl -s https://syncthing.net/release-key.txt | apt-key add -
echo "deb https://apt.syncthing.net/ syncthing stable" | tee /etc/apt/sources.list.d/syncthing.list
apt update && apt install syncthing
# 配置自启动
systemctl enable syncthing@root.service
systemctl start syncthing@root.service
Rclone 云存储备份
# 安装 rclone
curl https://rclone.org/install.sh | bash
# 配置云存储
rclone config
# 备份脚本
cat > /usr/local/bin/rclone-backup.sh <<'EOF'
#!/bin/bash
# 同步到对象存储
rclone sync /mnt/backup/pve remote:pve-backup \
--progress \
--transfers=4 \
--checkers=8
EOF
chmod +x /usr/local/bin/rclone-backup.sh
备份恢复流程
虚拟机恢复
# 从备份恢复虚拟机
qmrestore /mnt/backup/vzdump-qemu-100-2024_01_01-00_00_00.vma.zst 100
# 恢复到新 ID
qmrestore /path/to/backup.vma.zst 200
# 恢复到其他存储
qmrestore /path/to/backup.vma.zst 100 --storage local-zfs
配置文件恢复
# PVE 配置文件位置
/etc/pve/
# 恢复节点配置
# 从备份中恢复 /etc/pve/nodes/{node}/qemu-server/ 下的文件
# 恢复网络配置
# 从备份中恢复 /etc/network/interfaces
存储性能优化
ZFS 调优
# ARC 缓存大小(建议内存的 50-75%)
echo "options zfs zfs_arc_max=8589934592" >> /etc/modprobe.d/zfs.conf
# 8GB = 8 * 1024 * 1024 * 1024 = 8589934592
# 禁用 ZFS 预读(SSD 建议禁用)
zfs set primarycache=metadata tank
# 启用 TRIM(SSD 必需)
zpool set autotrim=on tank
磁盘调度器
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 设置为 mq-deadline(SSD 推荐)
echo mq-deadline > /sys/block/sda/queue/scheduler
# 永久设置
echo 'ACTION=="add|change", KERNEL=="sd[a-z]*", ATTR{queue/scheduler}="mq-deadline"' > /etc/udev/rules.d/99-iosched.rules
小结
本文介绍了 PVE 的存储管理与备份策略:
- ZFS 存储:写时复制、快照、压缩、去重
- 备份策略:本地备份 + 异地备份 + 加密
- 自动化:定时任务 + 自动清理
- 恢复流程:快速恢复,减少 RTO
建议采用 3-2-1 备份原则:
- 3 份数据副本
- 2 种不同存储介质
- 1 份异地备份
参考资料: