要对一个存放在 ext4 分区上的大型 ZFS .img 文件进行“增量”备份到 S3,传统的 rclone copy 会非常痛苦,因为它每次都会认为文件发生了变化并重新上传整个几百 GB 的文件。
针对你的情况,这里有三种专业方案,按推荐程度排序:
方案一:使用 Restic (最推荐:分块增量备份)
Restic 是目前处理大型镜像文件备份到 S3 的神兵利器。它会将你的 .img 文件切成无数个小块(Chunks),每次备份时只上传那些真正发生了变化的块。
- 优点:真正的增量备份、原生支持 S3、自带加密、去重效率极高。
- 安装:
apt install restic -y
操作步骤:
初始化仓库:
export AWS_ACCESS_KEY_ID="你的ID" export AWS_SECRET_ACCESS_KEY="你的Key" restic -r s3:s3.amazonaws.com/你的桶名 init执行备份:
# 即使 .img 文件有 500G,Restic 也只会上传改动的那几百 MB restic -r s3:s3.amazonaws.com/你的桶名 backup /var/lib/vz/zfs.img
方案二:ZFS Native (最专业:快照流备份)
虽然你的 ZFS 住在文件里,但它依然是 ZFS。你可以利用 ZFS 原生的 send/receive 功能。这种方式备份的是“逻辑数据”的差异,而不是文件的字节差异。
实现思路:
- 创建快照:
zfs snapshot mypool@backup_today - 增量发送并流式上传:
通过管道将 ZFS 的差异流直接推送到rclone。
# 假设你有昨天的快照 backup_yesterday 和今天的 backup_today
zfs send -i mypool@backup_yesterday mypool@backup_today | \
rclone rcat mys3:mybucket/incremental-$(date +%F).pve- 优点:极其精准,甚至不需要读取整个
.img文件,只读变动的块。 - 缺点:恢复起来比较麻烦,需要按顺序重放所有的增量包。
方案三:Proxmox Backup Server (PBS)
既然你在用 Proxmox,最好的“官方”方案是开一个 PBS (Proxmox Backup Server) 虚拟机或容器。
- 安装 PBS:可以装在 LXC 容器里。
- 挂载 S3:使用
rclone mount或s3fs将 S3 挂载到 PBS 的存储目录下。 - 备份:在 PVE 界面添加 PBS 存储,然后设置备份任务。
- 优点:完美集成在 PVE UI 中,支持“脏页位图”(Dirty Bitmaps),备份速度极快,且支持文件级恢复。
🛠️ 我的建议
如果你追求简单、可靠且节省流量,请选择 Restic。
它可以直接把你那个巨大的 zfs.img 当作普通文件处理,但内部实现了聪明的去重。
自动化脚本示例 (Restic 版):
#!/bin/bash
export AWS_ACCESS_KEY_ID="xxx"
export AWS_SECRET_ACCESS_KEY="xxx"
export RESTIC_PASSWORD="你的备份加密密码"
# 1. 备份
restic -r s3:s3.amazonaws.com/bucketname backup /path/to/zfs.img --quiet
# 2. 保留策略(保留最近 7 天,每周一个,每月一个)
restic -r s3:s3.amazonaws.com/bucketname forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune💡 核心提醒
由于你的 ZFS 是运行在文件上的:
- 备份前的一致性:在执行备份脚本前,最好先运行
zfs freeze(如果支持) 或确保没有任何大规模的写入操作,否则备份中的文件系统可能会有“撕裂”风险。 - 不要用
rclone sync直接同步 .img:除非你想每天把带宽跑满。
** 不同的供应商在处理大量小块(Restic 产生的小文件)时的 API 费用和速度差异很大。