基于 7z 的 NAS 到网盘备份解决方案,支持增量、分卷、加密、压缩
故事背景
曾经,我组建了一个极空间的 NAS。往里面塞了两块 12T 的硬盘,将 20 年来的照片,音乐,电影,游戏、代码、文档都导了进去。虽然两块硬盘互为备份的机制一定程度解决了硬盘可能出现的寿命问题,但心里总是没底,毕竟两块硬盘在物理层面是放在一起的,万一出个什么断电或者天灾什么的,两块硬盘一起坏了怎么办?将数据备份到网盘是一个不错的选择。但问题马上出现,NAS 上的文件至少有几十万到上百万,有些文件的目录层级还藏的很深,还有一些超过 10G 的巨型文件。绝大多数网盘都无法处理这种海量文件和巨型文件的情况,另外,照片库是一个非常隐私的东西,我也不想直接把照片传到网盘上,被大数据精准营销,有些文件,比如游戏和电影资源,还可能会直接被网盘封杀,另外,每隔一段时间,我都需要向网盘上传新增的文件,很难整理出哪些文件是新的,将以上问题总结起来就是——
- 要支持海量小文件的备份
- 要支持单个过大的文件的备份
- 要支持先加密再上传到网盘
- 要支持增量备份(你也不想每次备份完都上传几个 T 的文件吧)
首先想到的方案是直接通过 7-Zip 分卷加密压缩,但是这样意味着当我想从网盘中取出某一个文件时,必须要把整整 2~3T 的文件全部下下来。后来我了解到了 Duplicati,这也是很多极空间用户的选择。他可以直接通过 Docker 的方式部署在极空间,实现文件的加密备份,你可以手动设置每个备份文件的最大大小,更方便的是需要某个文件时,只需要从网盘下载相关的分卷即可。但使用以后,我又发现以下两个问题——

- Duplicati 生成的备份文件,必须由 Duplicati 读取,即使它产生的 AES 文件可以通过 AES Crypt 命令行解密,解密后的文件结构也难以恢复,我就是不想绑定这个工具!
- 备份文件名是完全随机的 hash 值,难以快速找到某个文件在哪个分卷中。有时出门在外,家里没网,想从网盘找个文件,完全没辙!
对此,我想出了以下备份方案——
总体思想:保持目录结构的同时,大文件分卷,小文件合并,使用 7-Zip 进行加密压缩
- 递归 NAS 目录,如果目录小于指定的分卷大小,直接整目录压缩为一个文件
- 如果目录大于指定的分卷大小,没有子目录,就将整目录分卷压缩
- 如果目录大于指定的分卷大小,有子目录,对子目录执行以上判断,对子文件执行分卷压缩
- 支持增量备份,每次备份生成文件列表,文件列表中记录有文件的大小和修改时间,根据这两个属性判断文件是否有改动,后续备份只需要将新的备份目录上传到网盘即可,无需重新上传完整的备份
这样当我在异地需要从网盘取回某个指定文件时,只需要到对应的目录,下载对应的压缩文件,用 7-Zip 解压,输入密码即可,只需要一个解压软件,其他任何工具都不需要装,是不是非常方便!
最近出了一个以 Spec Coding(规约编程)为卖点的 AI IDE 名叫 Kiro,正好拿这个项目试试水!你可以查看 requirements.md、design.md、tasks.md 来看看 Kiro 是如何从 0 完成整个项目的,真的很强!
项目已开源:https://github.com/imaegoo/zbak
如果你认为这个备份方法适合你,欢迎下载使用!工具现支持命令行调用,也支持 Docker 调用。我是直接在极空间上的 Docker 跑的。

工作原理
备份流程
- 增量检测 - 扫描源目录,比对文件索引,识别新增、修改和删除的文件
- 智能压缩 - 根据目录大小和结构选择压缩策略:
- 小目录(< 分卷大小):单文件压缩
- 大目录无子目录:分卷压缩
- 大目录有子目录:递归处理
- 并发执行 - 使用工作池并发处理多个压缩任务
- 索引更新 - 更新文件索引,记录备份信息
- 时间戳管理 - 将备份文件存储在时间戳目录中
恢复流程
- 发现备份 - 扫描时间戳目录,识别所有压缩文件
- 按序恢复 - 按时间顺序依次解压备份文件
- 覆盖更新 - 新版本文件覆盖旧版本
- 删除处理 - 删除索引中标记为已删除的文件
目录结构
备份出来的目录就长这样,保持源目录结构的同时,拆分了大文件,合并了小文件,全部实现加密压缩,每次备份都生成一个时间戳命名的目录。
1 | target_dir/ |
配置说明
写个 config.yaml 跟程序放一起就行。
| 配置项 | 类型 | 必需 | 说明 |
|---|---|---|---|
source_dir | string | 是 | 需要备份的源目录路径 |
target_dir | string | 是 | 存储备份文件的目标目录路径 |
volume_size | int64 | 是 | 分卷大小(字节),建议4GB(4294967296) |
password | string | 是 | 加密密码,用于7zip AES-256加密 |
concurrency | int | 是 | 并发压缩任务数,建议设置为CPU核心数 |
compression_level | int | 否 | 压缩级别 (0-9),默认为1(极速)。0=存储,1=极速,5=正常,9=最大压缩 |
性能特点
- 内存稳定 - 处理大量小文件时保持稳定的内存使用
- 高效索引 - 使用哈希表实现O(1)查找性能
- 并发优化 - 合理利用CPU资源,支持多任务并发处理
- 缓冲写入 - 日志记录使用缓冲写入,提高I/O性能
基于 7z 的 NAS 到网盘备份解决方案,支持增量、分卷、加密、压缩


