Syncthing
Syncthing 是一个开源文件同步客户端/服务器应用程序,使用 Go 语言编写,它实现了自己同样免费的 区块交换协议。Syncthing 节点之间的所有传输通信都使用 TLS 加密,所有节点都使用加密证书进行唯一标识。
安装
Syncthing 提供一个 #Web-GUI 用于控制和监控。GUI 封装,如 #Syncthing-GTK 和 #Syncthing Tray(在单独的软件包中提供)也存在。
运行 Syncthing
启动 Syncthing
从终端手动运行 syncthing
二进制文件。多个可选参数在 syncthing(1) 中描述。
自动启动 Syncthing
Syncthing 可以安装为 systemd 系统级服务或 systemd 用户服务,以便在启动时自动运行。
系统服务
将 Syncthing 作为系统服务运行可确保即使在用户没有活动会话时,它也能在启动时运行,它旨在用于服务器。启用并启动 syncthing@myusername.service
,其中 myusername 是 Syncthing 用户的实际名称。
syncthing@username.service
文件将不遵守该 umask 值,而是使用 SystemD 服务的默认值(通常为 0022
,这意味着全局可读性)。值得注意的是,任何使用不同权限系统的设备(例如 - 在 Android 上使用 Syncthing-Fork
时)都可能使从该设备下载的文件对系统上的任何用户全局可读,如果同步目录不在您的用户具有独占访问权限的另一个目录中。要为所有用户在服务中设置 umask
,请考虑使用 SystemD drop-in 文件
/etc/systemd/system/syncthing@.service.d/override.conf
[Service] UMask=0077
然后,重启任何相关的服务单元。
这将设置所有新下载的同步目录文件,使其仅对相关用户可读写。使用 chmod og-rwx -R <relevant directory here>
可以修复现有文件以具有更严格的权限。根据您的用例,您可能希望使用比“仅对运行 Syncthing 的特定用户可读/写”更宽松的权限 - 相应地更改 umask 值。
要为单个用户配置 Syncthing umask,只需在 drop-in 文件的路径中在 @
符号后添加用户名,以选择模板化 SystemD 单元的适当实例化。这将仅在为该单个用户启动 Syncthing 服务时覆盖 umask。
useradd -r
),则确保该用户具有有效的家目录,否则服务将立即失败。Syncthing 尝试将配置文件放入 $XDG_STATE_HOME/syncthing
或 $HOME/.local/state/syncthing
。用户服务:登录时
将 Syncthing 作为systemd 用户服务运行可确保 Syncthing 仅在用户登录系统后(例如,通过图形登录屏幕或 ssh)启动。此方法旨在用于(多用户)计算机。要运行用户服务,启动/启用 用户单元 syncthing.service
(即使用 --user
标志)。
用户服务:启动时
可以使用 Systemd/User#Automatic start-up of systemd user instances 在启动时(即,无需登录)启动 systemd-user 服务。
用户服务:挂载时
Syncthing systemd 用户服务可以在特定的(可选加密的)设备挂载后启动,并在设备卸载时停止。要创建依赖于挂载点的用户服务,在设备挂载后,通过运行 systemctl list-units -t mount
查找systemd 挂载名称。然后创建一个类似于以下内容的新服务
/home/$USER/.config/systemd/user/syncthing.service
[Unit] Description=Syncthing BindsTo=run-media-user-and-hash.mount [Service] ExecStart=/usr/bin/syncthing [Install] WantedBy=run-media-user-and-hash.mount
Syncthing-GTK
syncthing-gtkAUR 提供一个 GTK 图形用户界面、桌面通知以及与文件管理器 Nautilus、Nemo 和 Caja 的集成。Syncthing 可以由 Syncthing-GTK 启动:使用界面设置在启动时运行 syncthing-gtk,并声明是否启动 syncthing 守护程序。
Web-GUI
Syncthing 提供一个 Web 界面,默认情况下可通过 https://127.0.0.1:8384 访问。
Syncthing Tray
syncthingtrayAUR 通过提供基于 Qt 的系统托盘图标和桌面通知来补充 Web-GUI。存在桌面环境无关版本和用于 Plasma 的 Plasmoid。它还提供与 systemd 和 Dolphin 文件管理器的集成。
请注意,还有 syncthingtray-qt6AUR 软件包,它已经使用 Qt 6。使用此软件包是使用 Plasma 6 的 KDE 集成所必需的。
有关更多评论,请参阅 AUR 上的置顶评论。当您不确定配置时,也建议阅读上游的 README。
这些软件包还附带 syncthingctl 实用程序,允许从命令行与 Syncthing 交互。
配置
安装后,Syncthing 已经具有正确的启动配置。可以通过访问 Web 界面来添加新的服务器和/或文件夹。有关如何设置简单网络的详细说明,请阅读 Syncthing 入门指南。
首次成功启动后,将在 ~/Sync
创建默认存储库。您可以在 Web 管理界面中看到这一点。右侧是您已添加的节点列表。左侧是存储库列表,这些是您可以选择与其他节点共享的文件夹。
要添加另一个节点,请单击节点列表下方的“添加节点”。系统将提示您输入其节点 ID(可以通过在另一台机器上单击 编辑 > 显示 ID
找到),以及一个短名称和地址。如果您为地址指定“dynamic”,则将使用 Syncthing 公告服务器自动在节点之间交换地址。如果您想了解有关节点 ID 的更多信息,包括加密含义,您可以阅读相关的 Syncthing 文档页面。
保存配置后,Syncthing 服务器会自动重启。接下来,您可以更改默认节点的配置(单击其名称,然后单击 编辑
),或创建一个新的节点以共享数据。只需勾选您希望与之共享数据的节点,他们将有权访问它。
本地网络设置
在典型情况下,多台机器在 NAT(网络地址转换)路由器后共享一个 LAN(局域网),建议进行多功能配置:
- 在每个节点上激活本地和全局发现。这将允许在所有情况下进行发现,包括某些节点是笔记本电脑或 Android 手机等移动设备,并离开 LAN 并从外部连接到互联网的情况。这样,他们仍然可以通过全局发现找到。
- 为每台机器使用不同的 监听地址端口,如
tcp://:22010
、tcp://:22011
、tcp://:22012
等等。这将区分全局发现服务器上的节点,并避免当其他本地设备离开 LAN 时出现“已连接到自身 - 不应发生”消息。
- 如果在同一台机器上为不同的用户运行多个实例,请为每个用户的localAnnouncePort(IPv4 广播)设置不同的端口,以避免 Syncthing 投诉,并选择相同的 localAnnounceMCAddr(IPv6 多播),以便在没有全局发现的情况下在 LAN 上找到其他设备(请参阅 选项元素)。
- 如果同一台机器上的两个实例应该在没有全局发现的情况下找到彼此,请添加
tcp://127.0.0.1:xxxxx
作为设备的第二个地址,例如,tcp://127.0.0.1:22001
和tcp://127.0.0.1:22002
(请参阅 设备元素)。
- 如果可能,启用 UPnP 端口转发或手动将每个端口转发到 LAN 上的正确机器。当发现新节点时,Syncthing 尝试使用其配置的监听端口,默认情况下为 22000。如果此端口恰好已关闭,它将在本地寻找另一个端口:每当 Syncthing 中启用NAT 遍历时,它将尝试使用 UPnP 将随机外部端口映射到选择的内部监听端口,例如 22000。如果不支持 UPnP 或不希望这样做,则应手动将每个端口转发到 LAN 上的正确机器。最终,如果在双方都找不到开放端口,将使用 中继。
使用 inotify
inotify (inode notify) 是一个 Linux 内核子系统,其作用是扩展文件系统以注意文件系统的更改,并将这些更改报告给应用程序。Syncthing 支持 inotify,并且可以在各个文件夹的配置菜单中启用该功能。
参与基础设施建设
可以通过运行全局发现服务器或中继服务器来参与 Syncthing 基础设施。
运行中继
当无法在两个设备之间建立直接连接时,Syncthing 能够通过 中继 连接两个设备。中继连接以通常的方式进行端到端加密,因此中继除了知道 IP 地址和设备 ID 外,对连接一无所知。
任何人都可以运行 中继服务器,它将自动加入 Syncthing 中继池,并可供所有 Syncthing 用户使用。要运行您自己的中继,安装 syncthing-relaysrv 并 启动/启用 syncthing-relaysrv.service
。可以通过命令行配置速率限制和其他选项。这些选项可以在服务 drop-in 文件 的 ExecStart
指令中设置,如下所示
/etc/systemd/system/syncthing-relaysrv.service.d/override.conf
[Service] ExecStart= ExecStart=/usr/bin/syncthing-relaysrv -global-rate 500000 -provided-by relayprovidername
-listen
和 -status-srv
选项分别覆盖默认端口。运行发现服务器
全局发现 由 Syncthing 用于在互联网上查找对等节点。任何设备都会在启动时向发现服务器声明自身,发现服务器存储设备 ID、IP 地址、端口和当前时间。然后在请求时,对于给定的设备 ID,它以 JSON 格式返回存储的信息,例如。
例如,请求 https://discovery.syncthing.net/?device=ITZRNXE-YNROGBZ-HXTH5P7-VK5NYE5-QHRQGE2-7JQ6VNJ-KZUEDIU-5PPR5AM
返回 {"seen":"2020-02-29T14:56:08.34589801Z","addresses":["quic://212.121.228.172:22000","tcp://212.121.228.172:22000"]}
。
提供了一个公共 全局发现服务器 列表。此外,任何人都可以运行 发现服务器,要运行您自己的服务器,安装 syncthing-discosrv 软件包。
软件包提供的默认单元文件将数据存储在 /var/lib/syncthing-discosrv
,如果您不需要自定义任何标志,则似乎可以正常工作;请参阅 列表。
以下是一个示例替换单元文件,它将数据存储在 /var/discosrv
而不是 /var/lib/syncthing-discosrv
。用户/组 syncthing-discosrv
需要权限才能读取证书文件。您需要 编辑 systemd 单元文件以正确指向证书并进行您可能需要的任何其他配置更改。
syncthing-discosrv.service
[Unit] Description=Syncthing discovery server After=network.target [Service] User=syncthing Group=syncthing ExecStart=/usr/bin/syncthing-discosrv --db-dir /var/discosrv/discosrv.db --cert /var/discosrv/cert.pem --key /var/discosrv/key.pem Restart=on-failure SuccessExitStatus=2 PrivateDevices=true ProtectSystem=full ProtectHome=true NoNewPrivileges=true [Install] WantedBy=multi-user.target
要将客户端指向您的发现服务器,请将“全局发现服务器”变量在设置下更改为 https://yourserver:8443/
(默认端口)或您已重新配置的任何端口。该变量接受以逗号分隔的发现服务器列表。可以包含多个服务器,包括默认服务器。
如果您使用的是自签名证书,则客户端将拒绝连接,除非您将发现服务器 ID 附加到其域。ID 在启动发现服务器时输出到 stdout。修改全局发现服务器条目以添加 ID:https://yourserver.com:8443/?id=AAAAAAA-BBBBBBB-CCCCCCC-DDDDDDD-EEEEEEE-FFFFFFF-GGGGGGG-HHHHHHH
。
技巧与窍门
停止日志垃圾信息
即使 Syncthing 什么都不做,也可能非常嘈杂。可以覆盖服务 ExecStart 以直接过滤输出,而无需额外的脚本(根据需要调整“grep”)
/etc/systemd/system/syncthing@.service.d/nospam.conf
[Service] ExecStart= ExecStart=/bin/bash -c 'set -o pipefail; /usr/bin/syncthing -no-browser -no-restart -logflags=0 | grep -v "INFO: "'
在 VirtualBox 中运行
可以在 VirtualBox 虚拟机 (VM) 中本地和全局连接 Syncthing,同时将其网络适配器保持在 标准 NAT 模式(而不是连接到主机计算机适配器的 桥接网络)中。
要启用此模式,Syncthing 应在 VM 中监听与主机已使用的监听端口不同的端口。例如,如果主机使用默认的 22000 端口,则可以在 VM 中使用 22001。VM 中的监听端口可以通过 Syncthing 的 同步协议监听地址 在 GUI 设置中更改为 tcp://:22001
。
主机的 22001/TCP 端口必须在此配置中转发到 guest。这可以使用以下命令完成
$ VBoxManage modifyvm myvmname --natpf1 "syncthing,tcp,,22001,,22001"
在此设置中,不应需要中继:本地设备可以通过端口 22001 连接到 VM,而只要全局设备本身具有开放端口,即可访问全局设备。
通过代理运行
Syncthing 可以通过代理运行,以实现在企业防火墙后使用或通过 SSH 隧道传输。根据 使用代理 文档,需要设置 all_proxy
环境变量,并且它必须指示 socks5 代理类型。
- 如果服务是从脚本或命令行运行的,则必须事先设置变量,如下所示
export all_proxy="socks5://proxy_address:proxy_port" export no_proxy="127.0.0.1"
- 如果它作为服务运行,则必须在服务配置中定义变量,如下所示
/etc/systemd/system/syncthing@myusername.service.d/override.conf
[Service] Environment="all_proxy=socks5://proxy_address:proxy_port" Environment="no_proxy=127.0.0.1"
然后,您必须执行 daemon-reload 和 重启 syncthing@myusername.service
。
可以使用 systemd 在 syncthing@myusername.service
上根据 systemd#Editing provided units 部分 编辑 此文件。
Syncthing FUSE
SyncthingFUSE 是一个 FUSE 驱动程序,它提供对 Syncthing 共享的访问,而无需实际将其同步到本地存储。当您打开文件时,内容尽可能从本地缓存提供。如果缓存中没有内容,SyncthingFUSE 会向对等节点请求内容并将其添加到缓存中。但是,本地缓存不会增长超过固定大小。如果当前没有对等节点可用于该文件,则打开该文件将失败。
故障排除
数据库问题
有时,Syncthing 可能会受到数据库问题的影响。一个常见的症状是客户端报告“不同步的项目”,但即使在断开设备连接并重启 Syncthing 后也永远无法解决。要强制重新扫描文件并在下次启动 Syncthing 时重新同步数据库,请使用以下命令
$ syncthing --reset-database
只读文件系统错误,即使以 root 身份运行
如果 Syncthing 抱怨存在只读文件系统,即使用户(例如 root)具有写权限,请检查模板单元的定义
$ systemctl cat syncthing@.service
在 [Service]
部分中,有一个 Hardening
部分,在该部分下方,有一个 ProtectSystem
指令,默认设置为 full
。有关此指令的更多信息,请参阅 systemd.exec(5) § SANDBOXING。
创建一个 drop-in 文件 以覆盖该值,使其适合您的需求。如果您尝试同步 /etc
的子文件夹,则 ProtectSystem=true
应该可以解决问题。
其他
请参阅 调试 Syncthing。