要对一个存放在 ext4 分区上的大型 ZFS .img 文件进行“增量”备份到 S3,传统的 rclone copy 会非常痛苦,因为它每次都会认为文件发生了变化并重新上传整个几百 GB 的文件。

针对你的情况,这里有三种专业方案,按推荐程度排序:


方案一:使用 Restic (最推荐:分块增量备份)

Restic 是目前处理大型镜像文件备份到 S3 的神兵利器。它会将你的 .img 文件切成无数个小块(Chunks),每次备份时只上传那些真正发生了变化的块。

  • 优点:真正的增量备份、原生支持 S3、自带加密、去重效率极高。
  • 安装:apt install restic -y

操作步骤:

  1. 初始化仓库:

    export AWS_ACCESS_KEY_ID="你的ID"
    export AWS_SECRET_ACCESS_KEY="你的Key"
    restic -r s3:s3.amazonaws.com/你的桶名 init
  2. 执行备份:

    # 即使 .img 文件有 500G,Restic 也只会上传改动的那几百 MB
    restic -r s3:s3.amazonaws.com/你的桶名 backup /var/lib/vz/zfs.img

方案二:ZFS Native (最专业:快照流备份)

虽然你的 ZFS 住在文件里,但它依然是 ZFS。你可以利用 ZFS 原生的 send/receive 功能。这种方式备份的是“逻辑数据”的差异,而不是文件的字节差异。

实现思路:

  1. 创建快照:zfs snapshot mypool@backup_today
  2. 增量发送并流式上传:
    通过管道将 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) 虚拟机或容器。

  1. 安装 PBS:可以装在 LXC 容器里。
  2. 挂载 S3:使用 rclone mount 或 s3fs 将 S3 挂载到 PBS 的存储目录下。
  3. 备份:在 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 费用和速度差异很大。