背景
一句话概括:zerotier + syncthing 用于文件同步,网络有时不稳定;多平台同步,涉及跨系统的问题。
环境:zerotier + syncthing
syncthing:局域网网同步软件。可以自动向其他设备同步指定文件夹的文件,同步功能类似onedrive。
zerotier:内网穿透工具。可以搭建虚拟局域网,这里为 syncthing 提供局域网网环境。
由于设备和虚拟机比较多比较杂,我使用 zerotier(内网穿透)+ syncthing(局域网同步) 实现文件夹的同步。
这套方案的好处是:可以和其他服务一起复用虚拟局域网,且 syncthing 不需要部署额外服务器————云服务器只需要部署 zerotier 提供公网IP即可,迁移极其方便,适合以学生身份薅云服务器的羊毛。
缺点是:内网穿透有时网络不稳定,这种情况下 syncthing 偶尔会无法秒传,导致莫名其妙的冲突。
涉及设备:win10、debian13、Android14
白笔记本:debian13黑笔记本:debian13手机:Android14(红米,MIUI版本)台式机:win10虚拟机:win10(开着tun模式的梯子,宿主机为台式机)- 其他设备(与本事件完全无关的设备)
起因
一句话概括:在 黑笔记本 上误操作,使其中一个CA证书的文件名称改为了 . ,导致同步故障。
- 我想要将
某CA证书传输给所有设备,所以放到了共享文件夹。 - (不知道怎么操作的,也许是我复制/改名时误操作了)。
- syncthing 由
黑笔记本向台式机和虚拟机同步失败,报冲突,发现这个.文件。 - 在黑笔记本上发现可以直接看见的
.文件,在文件管理器可以点开,是个CA证书,属性、信息 和某CA证书一模一样。
暴露问题
一句话概括:这个文件可以用 rm . 直接删除,大多数设备恢复正常,但手机仍然显示同步失败,手机认为还有 . 这个文件没同步过来。
- 不同于正常目录中的
.,黑笔记本中名称为.的文件可以用 ls 直接看到。 - 使用
rm .直接删除后,台式机和虚拟机都恢复正常。 - 第二天发现
手机的 syncthing 同步出现冲突,这个冲突通常类似于 git 中的文件冲突。排查后发现在黑笔记本认为最新进度应该有 79 个文件,手机认为最新进度应该有 80 个文件,手机在试图下载第 80 个文件时报错,而黑笔记本没有报错。 - 在手机的界面上,这个
第 80 个文件的名称正是.,连文件路径都一模一样。 - 我感到格外困惑:
黑笔记本上已经没有这个文件了,但是手机认为有,那应该是缓存卡住了吧?是不是想办法刷新一下它的缓存就好了? - (折腾了很久,没有效果)
问题解决
一句话概括:名称为 '.'$'\r' 的文件被部分设备显示为 .
- 点开冲突项仔细查看,突然发现
手机认为有这个文件的地方不是黑笔记本,而是白笔记本。 - 打开白笔记本的 syncthing 管理界面,发现
白笔记本也和手机一样认为现在应该有 80 个文件。 - 我找到了这个文件,在白笔记本中,它不叫
.,而叫'.'$'\r':
- 与
黑笔记本不同,使用ls查看,看不到这个文件;使用ls -a查看,可以看到这个文件,它叫'.'$'\r',可能由黑笔记本同步过来; - 在
黑笔记本中,这个CA文件名字就叫.,但是与目录的.的高亮颜色不同,且可以直接用rm .删除。
rm '.'$'\r'删除这个文件,手机上的冲突解除。
原因推测
- 我一度以为是我的网络问题导致冲突,从结果来看也许与这个无关。
- 同步过来的
某CA证书可能被我误操作改名成了.,第一次冲突也由此产生。 '.'$'\r'这个文件可能由黑笔记本根据.同步过来。但在删除时,syncthing认为'.'$'\r'与.不同名,于是没有把'.'$'\r'删除。于是导致了不同设备间存在差异但都不认为自己有问题的局面,第二次冲突由此产生。- 希望这只是一个bug,希望我的电脑没中病毒。
1 个帖子 - 1 位参与者