
Quenox 这个词第一次出现时我第一印象是“又一个自造的项目名”。没有官方介绍、没有大厂背书光看拼写也猜不出具体是干嘛的。但把Queue和Nox拆开看能嗅到一点门道一个负责排队调度一个暗示夜间运行拼在一起很像是一个“后台静默干活”的工具。再结合我后来实操的体验这其实是一个相当克制的本地优先文件同步项目主打多设备之间的双向增量同步、冲突快照和离线可用。不管你是想给两台电脑同步配置文件还是给工作目录做备份Quenox 都能插一脚而且不像网盘那样要求你把所有数据过一遍云端。这篇文章不是官方文档是我在实际部署、折腾同步规则、排查冲突之后梳理出来的一份经验总结。我会把设计逻辑、关键配置文件、常见坑都拆开讲力求你看完能直接上手而不是在 README 里来回翻。1. 项目整体设计与思路拆解第一次见 Quenox我感兴趣的是它的定位它不是 rsync 那种“单向推送”的备份工具也不是 Syncthing 那种“全盘镜像”的重型同步方案而是把两者之间的空档填上了。简单说Quenox 的默认心智模型是两端都可以改文件改动后通过增量方式互相补齐改同一处时保留冲突副本绝不静默覆盖。这个设计对程序员同步代码、研究员备份数据、自媒体作者整理素材来说非常契合因为这几种场景里同一份文件在两台机器上被分别编辑的概率极高。1.1 核心需求还原先还原一下 Quenox 解决的真实问题。多设备办公最头疼的并不是“文件传不过去”而是“边角料文件到底哪台是最新”。比如你白天在台式机上改方案文档晚上回家用笔记本又补了一段两台机器之间没有一个权威服务器做仲裁。传统网盘能同步但你要么接受全部数据过云端要么忍受同步延迟和容量上限。Quenox 的本地优先思路则不同设备之间点对点通信有一方在线就能完成增量同步即使两边都不在线各自改动也会被完整记录等下次碰面再合并。另一个刚需是可追溯性。Quenox 会为每个文件维护一个版本号发生冲突时不会随便丢掉任何一个版本。这一点体验下来比“自动覆盖”舒服得多——我在实际使用中遇到过误删和改错都是靠冲突快照翻回来的这点我在后文会详细说。1.2 为什么选择双向增量而非镜像或单向上传很多刚接触 Quenox 的人都会问既然已经用哈希做文件指纹了为什么不干脆把整个目录在设备间互相对齐变成一台改完另一台也跟着变镜像同步有个问题如果 A 机器删除了一批文件B 机器的对应文件也会被删。但在真实办公里“删文件”往往不是同步语义而是“我暂时不需要了”。Quenox 默认用增量同步来处理新增和修改删除则通过删除标记tombstone显式传播而不是直接视为需要镜像的差异。它会把删除动作记录在案只有确认另一端认可这次删除后才会真正清理。单向上传模型比如 rsync 加 cron胜在简单但缺点也很明显两端无法同时工作。Quenox 的双向模型付出的代价是冲突判断成本更高但换来了更贴合真实工作流的“随处可改”。从工程取舍上看开发者选择了复杂度换回了用户的操作自由。1.3 目标用户与适用场景从我实测的体验看Quenox 最适合下面几类场景开发环境配置同步~/.zshrc、编辑器设置、全局 Git 配置这类文件小而碎改动频繁且包含隐私信息不适合丢到云上。文档与素材库备份给 Writer 的文稿目录、设计师的 Sketch 源文件目录做跨设备备份要求“我在另一台改了也能合回来”。服务器与办公机之间的工作目录互通通过 SSH 隧道或者局域网直连不经过第三方中转。老实说如果你只是一个人单机备份那 rsync 就够了如果你需要多人协作、实时权限控制Quenox 也不是正确答案。它的甜区就在“个人多设备自动同步”和“小团队可信设备共享”之间。2. 核心细节解析与实操要点理解 Quenox 的眼睛在于快照数据库。整个同步过程可以拆成三步扫描、比较、传输。每次运行同步时Quenox 先扫描目录把文件的相对路径、大小、修改时间、哈希值写进本地索引然后与对端交换索引摘要最后只传输“真正变化”的块。这套东西听起来容易但落地时有很多细节决定成败。2.1 快照数据库与索引结构Quenox 在本地维护一个嵌入式数据库用来记录每个受同步目录的文件状态。简化后的表结构大概是这样的CREATE TABLE files ( path TEXT PRIMARY KEY, size INTEGER, mtime_ns INTEGER, sha256 TEXT, version INTEGER, deleted INTEGER DEFAULT 0 );这里有几个值得注意的设计path存的是相对路径不是绝对路径。因为绝对路径在不同设备上几乎没有可能一致用相对路径才能保证/Users/alice/docs和/home/alice/docs能映射到同一个同步项。我在配置时差点踩坑想直接指定绝对路径后来发现相对路径才是同步对账的主键。mtime_ns用纳秒精度是为了降低“一秒内改了两次”的误判概率。虽然多数文件系统的纳秒精度不一定完全可靠但比对时保留这个字段总比丢精度好。deleted字段不是简单的 0/1。Quenox 会保留一段时间的删除标记防止 A 删了文件B 因为离线没收到删除通知等再次上线后又把文件“复活”出来。实测体验中最舒服的一点是Quenox 不会把整个索引全量发给对端而是用某种分块摘要去交换差异所以几百 GB 的目录初次同步时网络传输量比想象中低很多。2.2 哈希判定与两级比较如果每次同步都对每个文件做一次全量 SHA-256磁盘 IO 和 CPU 消耗都扛不住。Quenox 的做法是两级比较先比size mtime_ns如果两者都没变化默认文件没变直接跳过哈希计算。这个路径非常快适合绝大多数同步任务。当大小或 mtime 变化时才真正读文件算哈希用来确认文件是不是“真的变了”。因为存在这种情况文件内容没变但 touch 命令改了时间戳导致 mtime 变化。如果仅凭时间戳就传输文件会白白浪费带宽。这个两级思路很实用。模拟一下一个 10GB 的虚拟机镜像几百次同步里九成以上都只走第一级路径CPU 占用几乎可以忽略。只有真正改动文件时才会读全部内容。我在使用中把同步目录放在机械硬盘和一个普通 SSD 上对比过只要不走哈希这步两者的扫描速度差异不明显瓶颈主要不在硬盘而在文件数。不过这也引出一个操作细节如果你的某个项目会频繁 checkout 分支、改文件 mtime 但内容不变Quenox 的同步日志里会出现“verified unchanged”条目这正常别慌它只是多算了一次哈希来确认。2.3 冲突处理与快照策略冲突处理是 Quenox 最值得讲的一块。两端在离线状态都修改了同一个文件等下次同步时它没有任何办法替你判断哪一份是“正确”的。Quenox 的策略很简单两版都保留并生成一个冲突副本。比如你有一份report.pdf被两台设备各自修改同步后其中一个会被重命名为report.pdf.conflict-20250612-1530.pdf具体格式看版本同时写入冲突日志。这样不会丢失任何一方的工作你只需要有空时打开两个文件做手动合并。配套的快照策略也很关键。Quenox 不是无限回滚而是按策略保留快照。默认可能是保留最近 N 个版本或按天保留一定数量。不要完全不设限制否则一个频繁改动的目录会在几个月内吃光硬盘。我个人的经验是对代码目录保留 3~5 个版本就够了对文档目录可以放宽到按天保留两周按周保留两个月。2.4 符号链接与边界安全文件系统里总有让人头疼的特例符号链接就是其中之一。默认情况下 Quenox 不会跟随符号链接同步它会记录这条 link 本身然后在另一端重建同样的链接。这个设计非常稳妥——如果无脑跟随链接很容易同步出圈链到系统目录甚至无限循环。但如果你确实想跟随某个符号链接比如把~/Current软链到实际工作目录需要在配置里显式声明。此时 Quenox 会把链接目标视为一个普通目录来做递归扫描。我建议只在完全可信任的目录上开启跟随否则一旦对端扫描到某个循环链路你的同步任务就可能卡在索引阶段。另一个值得注意的点是文件权限。Quenox 默认同步常规文件内容和 mtime但不会盲目复制文件属主因为不同设备上的用户 UID 不同。如果你有可执行权限对齐的需求请检查同步选项里是否开启 preserve-mode否则跨设备的脚本可能因为权限不同而无法运行。3. 实操过程与核心环节实现说实话Quenox 的安装入口并不复杂但真正把一套同步链路配置对需要理解几个关键文件的含义。以下操作步骤基于我在 Linux 和 macOS 两端的真实部署过程细节上有所优化。3.1 安装与初始化拿到 release 包后把它解压到/opt/quenox/下然后做三件事把二进制软链到/usr/local/bin/quenox方便命令行直接调用。创建独立系统用户quenox不要让服务跑在 root 下。初始化配置文件目录。初始化命令大致是这样的quenox init --config-dir /etc/quenox执行完后会生成一个节点 ID 和一对节点密钥。这个节点 ID 是对端识别你设备身份的唯一凭据。我第一次部署时忽略了节点密钥的重要性直接在防火墙开放的端口上跑了同步虽然没出问题但事后想想相当冒险。Quenox 的节点密钥机制和 SSH 主机密钥类似它负责给两个节点之间的通信做加密握手丢了这个文件等于丢了这个节点的身份。接着创建主配置文件/etc/quenox/config.yaml一个最简配置看起来像这样node_name: office-desktop data_dir: /var/lib/quenox listen: 0.0.0.0:17045 snapshot_dir: /var/backups/quenox/snapshots log_level: info sync: - id: docs-sync path: /home/alice/Documents peer: quenox://home-laptop/~/Documents字段不多但每个都有讲究。data_dir是 Quenox 存储索引数据库和同步元数据的地方别放在被同步目录内部否则会出现“数据库在扫描自己”的尴尬情况。snapshot_dir是冲突快照与历史版本的存放目录建议放在独立磁盘或分区上。listen的端口可以自定义但最好固定方便防火墙规则统一管理。path和peer合起来定义了“本地哪个目录”映射到“远端哪个目录”。3.2 配置 include/exclude 同步规则真正能让你用得舒心的不是同步本身而是精确控制同步范围。Quenox 支持基于 glob 的 include 和 exclude规则是“先排除后包含”。举个例子sync: - id: work-code path: /home/alice/projects peer: quenox://dev-box/projects exclude: - **/.git/** - **/node_modules/** - **/__pycache__/** - **/*.tmp include: - **/*.md - **/*.py bidirectional: true这个配置表明整个projects目录都参与同步但.git、node_modules、__pycache__这些“重资产”被剔除。这里有个容易被误解的点include并不是“只同步这些”而是在已经进入同步范围的目录里提高这些文件的优先级。像.git目录里对象数据库超大、改动频繁同步它基本是自找麻烦node_modules更是可以直接在另一端重新安装没必要同步。实际体验中忽略规则的格式需要特别小心。**/.git/**这种写法能匹配任意层级的.git目录内容但如果你漏了末尾的/**有可能只排除目录本身里面的文件还是会进入扫描。我在踩过几次坑之后总结出一个习惯所有目录忽略项都以/**结尾所有文件忽略项都写完整扩展名模式。还有一个值得开启的选项对已压缩文件关闭压缩。图片、视频、压缩包即使再压一遍也省不了多少空间反而徒增 CPU 消耗。Quenox 按文件扩展名做压缩策略判断的话直接在配置里设置compress: [!*.jpg, !*.png, !*.zip]这样的反转模式即可。3.3 常驻服务与 watch 模式命令行的手动触发很有用但日常使用还得以常驻服务为主。Quenox 的 watch 模式会通过文件系统事件Linux 下是 inotifymacOS 下是 FSEvents监听同步目录的变化一旦发生变更就自动调度同步任务。为它写一个 systemd service 是很常规的操作配置文件大致如下[Unit] DescriptionQuenox sync service Afternetwork-online.target [Service] ExecStart/usr/local/bin/quenox watch --config /etc/quenox/config.yaml Restarton-failure RestartSec5 Userquenox Groupquenox [Install] WantedBymulti-user.target启动之前记得chown -R quenox:quenox /etc/quenox /var/lib/quenox否则服务起不来。这里有个隐蔽的问题如果你的同步目录里有大量历史文件比如一个跑了三年的日志目录watch 模式启动时会先做一次全量扫描建立索引此时日志会显示building snapshot状态。这个阶段的耗时取决于文件数量而非文件总大小因此文件特别多的小文件目录反而比几个大文件目录慢得多。如果你不想让 Quenox 实时同步也可以退而求其次在 crontab 里写quenox sync但那样就丢失了事件驱动带来的即时性。我的建议是常驻服务加 watch 模式实在不行再手动触发。3.4 网络模式与安全加固默认情况下 Quenox 监听某个 TCP 端口节点之间通过交换密钥进行身份验证。如果你的两台设备处于同一个局域网直接用 IP 端口访问是最简单的。但如果需要跨公网同步我会优先考虑 SSH 隧道而不是直接把服务暴露到公网。假设端口是 17045用 SSH 隧道把远端的端口映射到本地再让 Quenox 只监听127.0.0.1。这样对端仍然能完成同步但公网上看不到 Quenox 的端口。ssh -N -L 17045:127.0.0.1:17045 alicehome-laptop -p 22这时主机的listen改成127.0.0.1:17045避免和外部直接通信。另一个很容易忽略的加固点是防火墙只放行可信来源 IP 的同步端口。即使有密钥机制减少暴露面总是没错的。我个人的习惯是先改默认端口再用防火墙规则把来源限制为对端 IP最后才启用密钥认证三层防护下来基本可以安稳使用。4. 常见问题与排查技巧实录任何同步工具用到一定深度都会遇到“看起来没问题就是不工作”的诡异时刻。Quenox 也不例外。这一节我把实践里踩过的坑和排查思路整理成一份速查表每一条背后都是真实经历。4.1 典型症状与解决对照症状可能原因处理思路同步任务频繁冲突两台设备系统时间偏差过大校准 NTP 时间确保 mtime 比较有意义大目录初次同步扫描极慢小文件数量过多索引写入瓶颈先对目录分组分批建立索引或排除缓存目录删除的文件又“复活”删除标记未传播或仍处于保留期检查退出节点是否在线等待删除标记同步后再清理同步后脚本无法执行可执行位没有同步开启 preserve-mode 或单独同步权限对端长时间不更新对端 watch 进程没起来登录对端查看服务状态验证端口连通性某个文件被跳过未同步被 include/exclude 规则拦住了先跑 dry-run 或者看日志里的过滤条目磁盘空间迅速耗尽快照保留策略太激进收紧快照数量清理历史快照这些症状里最折腾人的是“设备时间不同步导致冲突频发”。我一度以为是文件的哈希计算出了问题后来发现是笔记本的系统时钟快了两分钟导致每次同步他都认为文件是“新版本”于是两端相互覆盖冲突副本对激增。统一用 NTP 让所有节点时间一致后这个问题彻底消失。4.2 通过日志定位同步失败Quenox 的日志字段不算晦涩但第一次看可能有点晕。最有用的是几个关键节点scan start / scanning path表示开始了新一轮本地索引。sync detected for path表示对端有改动需要拉取。transfer begin表示进入文件传输阶段。conflict created表示该路径生成了冲突副本。apply failed表示本地应用更新失败通常是因为文件被占用或权限不足。实际排查时我一般按这个顺序来先看日志里有没有apply failed有就先查文件占用没有就看conflict created过多是不是时间问题然后再检查网络连接是否正常。锁文件是另一个经典问题某些应用会保持文件独占Quenox 无法执行重命名或替换操作。解决办法不是硬刚而是把这类文件排除在同步范围之外或者用文件级锁等待重试机制。4.3 部署避坑清单最后整理几条“如果让我重新来一次会更早注意”的教训。第一不要同步整个用户目录。操作系统会频繁改动各种隐藏配置、缓存、日志文件把这些纳入同步范围后索引会持续膨胀而且同步结果难以预期。先手动列出真正需要跨设备的目录比如 Documents、Projects、.ssh 的外部备份目录再配置同步。第二定期备份data_dir里的数据库和节点密钥。同步工具最尴尬的时刻是设备坏了但备份数据库也跟着坏了。数据文件和密钥一起备份恢复起来会轻松很多。有人会问同步工具不就是为了备份吗但这里备份的不是业务数据而是同步状态两者不是一回事。第三在正式同步前先跑一次 dry-run 模式。Quenox 应该支持只计算差异但不传输这个模式能让你在动手之前看清它将执行哪些删除、覆盖和冲突操作。第一次使用某个目录时我强烈建议先看差异清单再真正跑第一次同步。第四定期恢复演练。光配好同步不代表万无一失。我每季度会把一台机器断网、模拟丢失部分数据再从另一台节点恢复文件。测试完之后你才能真正信任这套同步链路。5. 扩展这条链路还能怎么玩Quenox 的直播同步只是它能力的一部分从实际用途出发我推荐几个进阶玩法。第一个是“隐身后台备份机”。找一台家里常开的 NAS 或小主机安装 Quenox 并把它作为一台只接收数据的节点配置成单向同步模式。这样办公机和笔记本的改动都会汇总到 NAS 上形成一份“接近实时”的灾备副本。由于是本地优先走局域网同步时的速度远快于上传网盘隐私性也好得多。第二个是“选择性同步”。如果你的笔记本空间不大可以只挑选文档目录同步而把虚拟机镜像之类的重文件留在台式机上。Quenox 的同步粒度虽然按目录来但通过 exclude 能从目录内筛掉大文件。比如只同步一个项目里的src/和docs/其他构建产物留在原地。这种方式比整盘同步更贴近真实使用。第三个是和 Git 配合使用。代码仓库本身不需要 Quenox 同步但仓库之外的工作记录、开发笔记、配置文件反而适合用 Quenox 维护。我现在的习惯是私人笔记目录和全局配置文件交给 Quenox代码仓库交给 Git两者各司其职互不干扰。最后再分享一点个人体会用 Quenox 一段时间后我的最大感受是同步工具解决的是“无序”的问题但它的可靠性恰恰建立在“有序”的基础之上。你把哪些目录纳进来、排除哪些噪音、保留几份快照、多久清理一次标记这些参数决定了这个工具是用得顺手还是灾难现场。我个人的习惯是每次新增一个同步规则时都先手动跑一次 dry-run确认差异列表里没有我不认识的文件再打开 watch 模式让它长期运行。同步完成后的日志我会随手扫一眼看看有没有奇怪的 conflict 记录。这套操作看起来简单但能避免绝大多数实际运行中的麻烦。如果你正在多台设备之间反复拷文件、受够了改完忘了带最新版不妨也给 Quenox 一个机会。先用一个小目录试一周再逐步扩大范围它的增量同步和冲突保留机制会替你省下不少时间。