我用 Syncthing 把工作副本同步到本地开发服务器已经有好几个月了。

一开始我是登录后通过命令行手动运行它的。一切正常,所以后来改成以服务方式运行时,我也没多想。它启动了,也同步了一些数据,一切看起来都很好。

当然,直到出问题为止!🙂

原来日志里冒出了一堆错误,说开发服务器上的文件系统是只读的,导致 Syncthing 什么都同步不了,而我完全没注意到。

我还以为是个 bug,只是文件夹显示为 Out of Sync(不同步),实际上还是在同步的。结果我想错了。

折腾了好几个小时,在论坛里搜了好几轮 Google 也没找到任何线索,最后我找到了 ArchWiki 上关于 Syncthing 的文章,里面提到的正是我遇到的情况:

read-only file system error on /etc although run as root

这和我的情况一模一样,只不过出问题的文件夹不是 /etc,而是 /usr/local/src。

读完之后我才明白:如果你通过 systemd 运行 Syncthing(或者任何东西),并且把服务的 ProtectSystem 设成了 full,那么某些目录默认就会变成只读,/usr 就是其中之一。

要解决这个问题,你需要在服务配置里加一行,然后重启服务(别忘了先 daemon-reload):

ReadWritePaths=/usr/local/src

这样之后 Syncthing 就能正常工作了。