copyparty 如何配置文件去重上传,在符号链接与硬链接两种方案间做选择
2026/9/11 23:14:51 网站建设 项目流程

copyparty 如何配置文件去重上传,在符号链接与硬链接两种方案间做选择

【免费下载链接】copypartyPortable file server with accelerated resumable uploads, dedup, WebDAV, SFTP, FTP, TFTP, zeroconf, media indexer, thumbnails++ all in one file项目地址: https://gitcode.com/GitHub_Trending/co/copyparty

copyparty 是一个单文件的可移植文件服务器(见 README.md),默认情况下,当有人上传一个服务器上已存在的文件时,上传会被"礼貌地拒绝",服务器会把已有文件完整复制一份到目标位置。如果你希望重复上传不占用双倍磁盘空间,就需要开启上传去重(dedup)。这篇文章说明如何开启去重,以及 copyparty 提供的两种去重实现——符号链接(symlink)与硬链接(hardlink)——各自的适用条件,帮助你根据自己的存储环境做出选择。

默认行为:不开去重时会发生什么

按 README.md "file deduplication" 一节的说明:

  • 未开启去重时,重复上传会被拒绝,服务器把已有文件完整拷贝到上传目标位置;
  • --dedup开启去重后,第二次上传同样的文件时,服务器创建的是一个指向最近一份完整副本的符号链接,而不是完整拷贝,从而节省磁盘空间;
  • 如果你的存储读取成本很高(例如 s3-glacier 这类归档存储),且有其他软件在改动你的文件、无法使用--safe-dedup=1,也可以反过来用--no-clone(或 volflagnoclone彻底禁用重复数据检测。

也就是说,--dedup改变的不是"能否发现重复",而是发现重复后落盘的方式:从完整拷贝变为链接。

符号链接与硬链接怎么选

README 明确说明:默认去重基于符号链接,"这些是极小的文件,指向该文件最近的一份完整副本"。你也可以改用硬链接(全局--hardlink-only或 volflaghardlinkonly),或者改用 reflink(--reflink/ volflagreflink)。文档给出的选择依据如下。

硬链接的优势(文档原文归纳):

  • 与其他软件兼容性更好:硬链接的行为与普通文件完全一致;
  • 你可以用其他文件管理器安全地移动、重命名文件——而符号链接需要由 copyparty 来管理,才能保证其指向仍然正确。

符号链接(默认方案)的优势:

  • 每个符号链接可以有自己独立的最后修改时间戳,而所有硬链接共享同一个时间戳;
  • 符号链接能让其他软件更明显地意识到"这不是普通文件",因此风险更低——硬链接看起来就是普通文件,其他软件可能假设编辑它不会影响别的副本。

文档中的关键警告:如果你编辑了一个被去重的文件的内容,那么该文件的所有其他副本也会被一起改掉。这一点在硬链接上尤其容易令人意外,因为它们看起来就是普通文件,但同一个文件实际存在于多个位置。

reflink(CoW,写时复制)作为第三个选项:README 称其"在你的文件系统正确支持时完全安全:任一文件都可以被编辑或删除而不影响其他副本",但也给出了明确的适用条件——仅支持 Linux 5.3 及以上、仅支持 Python 3.14 及以上,且仅部分文件系统可用(btrfs 大概可以,xfs 也许可以,zfs 曾有过 bug)。如果你的系统不满足这些条件,--reflink会在无法 reflink 时回退为完整拷贝(见--reflink的 help 说明)。

简化的决策路径(对应文档描述):

  1. 你希望用其他工具自由移动/重命名文件 → 硬链接更合适(--hardlink-only);
  2. 你的系统/文件系统满足 reflink 条件 → reflink 是文档描述中"最安全"的方案;
  3. 都没有特殊要求 → 用默认的符号链接即可,但要接受符号链接由 copyparty 管理这一前提。

跨卷去重(--xlink/ volflagxlink)文档自述"probably buggy and not recommended",不建议作为方案纳入考虑。

配置步骤

README 在开启去重时给出的强烈建议是:同时开启文件索引-e2dsa(或 volflage2dsa。原文警告:如果只开--dedup而不开启索引,也不使用--hardlink-only--reflink,那么重命名/删除文件将是不安全的;开启索引后则不强制要求硬链接(但你仍可能想要硬链接)。

命令行方式

在启动参数中加入--dedup-e2dsa。硬链接方案则再加--hardlink-only。例如(卷路径以文档示例/mnt/nas为参照,替换为你自己的挂载点):

# 符号链接去重(默认方案) python3 -m copyparty --dedup -e2dsa -v /mnt/nas::rwmda # 硬链接去重 python3 -m copyparty --dedup --hardlink-only -e2dsa -v /mnt/nas::rwmda

其中-e2dsa表示"启动时扫描并索引所有已挂载卷(包括只读卷)"。如果你不需要 reflink 的回退行为,--reflink也可按同样方式加入。

配置文件方式

README 给出的去重配置文件示例如下,其中[/media]段演示了"全局符号链接去重 + 单个卷使用硬链接"的混用写法(示例中的/mnt/nas/media为文档示例路径,实际使用时替换为你的卷路径):

[global] e2dsa # scan and index filesystem on startup dedup # symlink-based deduplication for all volumes [/media] /mnt/nas/media flags: hardlinkonly # this vol does hardlinks instead of symlinks

README 说明配置文件的用法是:把它保存为如foobar.conf,然后以python copyparty-sfx.py -c foobar.conf的方式启动。[global]段中可以使用所有--help列出的全局选项,而hardlinkonlyreflink等 volflags 写在对应卷的flags:下。更多配置写法可参考 docs/example.conf。

可选:加快去重过程

--safe-dedup控制去重时的校验严格程度(默认为50,即校验文件内容未被改动)。README 的 performance 一节指出:--safe-dedup 1通过跳过文件内容校验使上传期间的去重"快得多",其前提是没有其他软件在编辑或移动这些卷中的文件。

验证去重是否生效

文档提供的核对方式有两种:

  1. 观察落盘结果。重复上传同一文件后,检查目标位置:开启--dedup时,新位置应是一个指向最近完整副本的极小符号链接文件(硬链接方案下则表现为"看似普通文件"的副本)。同时对照默认行为——未开去重时你会看到一份完整拷贝——可以判断去重是否真的启用了。

  2. Prometheus 指标。README 的 prometheus 一节说明,指标端点/.cpr/metrics需要用--stats开启,且只有 admin 账户(账户权限串rwmda中的a)可以访问,格式为 openmetrics 1.0.0。其中有两项与去重直接相关:

    • cpp_dupe_bytes:去重所节省的磁盘空间(presumably saved by deduplication);
    • cpp_dupe_files:重复文件数量。

    若你希望减少 Prometheus 查询带来的服务器负载,可用--nos-dup关闭cpp_dupe_*指标。

限制与边界情况

  • 编辑会波及所有副本:对任何被去重的文件做内容编辑,都会同时改掉其他所有副本;这是硬链接与 reflink 之外的通性警告,README 将其列为去重使用的必读警告之一。
  • 索引排除项会阻断去重--no-idx--no-hash命中的文件不会被去重——如果用户上传了相同内容,也不会被识别为重复、不会被替换为链接。
  • PRTY_NO_SQLITE环境变量会禁用所有数据库相关功能,包括"大部分文件去重逻辑",因此去重依赖数据库(这也是建议开启索引的原因)。
  • --xlink(跨卷去重)不被推荐,文档自述可能存在 bug。
  • reflink 的平台约束:Linux 5.3+、Python 3.14+,且仅部分文件系统可靠(btrfs 可能可以,xfs 未定,zfs 曾有 bug);不满足条件时回退为完整拷贝。

配置完成后,重复上传只应产生一个指向已有完整副本的链接(或不满足条件时的完整拷贝),/.cpr/metrics中的cpp_dupe_files随之增长,即为文档所描述的去重生效状态。

【免费下载链接】copypartyPortable file server with accelerated resumable uploads, dedup, WebDAV, SFTP, FTP, TFTP, zeroconf, media indexer, thumbnails++ all in one file项目地址: https://gitcode.com/GitHub_Trending/co/copyparty

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询