文件同步是个大坑,在那些自架方案里我还没找到一个完全靠谱的。
我之前用的是群辉的 CloudStation。这个东西一般来说还是比较可靠的,我日常用它同步一个 2GB 一千多个文件的目录,基本没出过岔子。但是我曾经试图用它同步一个很大而且经常更新的目录,它就不干了。
在 VM 服务器装好以后,我最先考虑的是 git-annex,这个东西虽然强大而且灵活,但是并不适用于我的国情。在我的服务器里,我把同步的目录都用 samba 挂在群辉上,但是 git-annex 干啥都靠符号连接,在 samba 里会失效。
后来我又试了 Resilio Sync,也就是以前的 BT Sync。在正常工作一天之后,它把一部分文件同步成了空文件⋯⋯ 于是我赶紧把它删了,还好我有备份。
我现在用的是 Syncthing,总算是能凑合使用了,但也仅仅是凑合。我目前发现的问题有,
-
连接不稳定,谜之 disconnect。有时连的好好的,两分钟不管它,它啪叽就断了。然后断着断着它啪叽又连上了⋯⋯ 我一直不确定这到底是 feature 还是 bug。
-
似乎同时更新「大量」文件时会 conflict。我的这个 wiki 是我在本地有一堆 AsciiDoc 文件,和一个脚本,用来从这些 adoc 生成 HTML。而我喜欢在编辑的时候频繁保存和生成 HTML 来看效果。Syncthing 不时就会啪叽一下就 conflict 了⋯⋯ 这个对我来说暂时是无害的,只要把这些 conflict 文件删掉就好。但是我不明白它为什么会 conflict⋯⋯
在我用 Syncthing 以后还有一件奇怪的事。在编辑文件的时候,Emacs 会在同一个目录里生成一个 lock 文件,名叫 .#xxxxxx#
,这个文件是个符号连接。文件保存以后 Emacs 就会删掉这个连接。刚才说了,在服务器上同步目录是挂在 samba 上的,不支持符号连接,所以这个连接会变成一个普通的文件。但奇怪的是 Syncthing 会在服务器上试图把这个文件更名成那个(曾经)在编辑的文件,更奇怪的是更名会因为权限而失败,然后同步就会终止,告诉我有一个失败的文件。如果我进入那个 samba 挂载的目录,试图直接 mv 更名,同样会因为权限失败。我目前的解决办法是在 Emacs 里把 file locking 关掉,但是这件事情太走进科学了⋯⋯