Syncthing 如何同步群晖相册到其它设备

20 min read

Syncthing 是一款开源的文件同步软件,可以在多台设备之间同步文件。要将群晖(Synology)NAS上的相册同步到其他设备,可以按照以下步骤操作:

  1. 在群晖上安装 Syncthing: 首先,需要在群晖的套件中心中安装 Docker。安装完成后,在 Docker 中搜索 Syncthing 镜像并进行安装。启动 Syncthing 容器,并设置需要同步的文件夹。
  2. 配置文件夹: 在 Syncthing 的 Web 界面中,点击“添加文件夹”按钮,然后选择群晖上的相册文件夹。为文件夹指定一个唯一的名称和文件夹 ID。确保选择“发送和接收”模式,以便在所有设备之间双向同步。
  3. 在其他设备上安装 Syncthing: 根据设备类型,在其官方网站(https://syncthing.net/)下载合适的版本。安装并启动 Syncthing。
  4. 添加设备: 在群晖的 Syncthing Web 界面上,点击“添加设备”按钮。输入其他设备的 Syncthing 设备 ID(可以在该设备的 Syncthing Web 界面中找到)。确保勾选“分享文件夹”选项,并选择在步骤2中创建的文件夹。点击“保存”按钮。
  5. 同意设备请求: 在其他设备的 Syncthing Web 界面中,接受来自群晖设备的请求。选择要同步的文件夹,并指定一个本地存储位置。点击“保存”按钮。
  6. 等待同步: 现在,设备之间的连接已经建立。文件同步将自动开始。同步完成的时间取决于文件的大小和网络速度。

Syncthing 的 Web 界面操作

在 Syncthing 的 Web 界面中,添加文件夹的过程如下:

  1. 打开 Syncthing Web 界面:访问群晖上 Syncthing 容器的 Web 界面。通常,它的地址为 http://<群晖的IP地址>:<端口号>。端口号是在设置 Syncthing Docker 容器时指定的。

  2. 添加文件夹:在 Syncthing Web 界面中,找到左下角的“添加文件夹”按钮并点击。这将打开一个新的窗口,用于配置文件夹设置。

  3. 选择文件夹:在“文件夹路径”输入框中,输入或浏览到群晖上的相册文件夹。确保你有访问此文件夹的权限。例如,文件夹路径可能类似于:/volume1/photo 或 /volume1/homes/username/photo。

  4. 分配名称和 ID:在“文件夹标签”输入框中,为文件夹指定一个唯一的名称,例如“群晖相册”。在“文件夹 ID”输入框中,输入一个唯一的标识符,如“synology-photo”。文件夹 ID 在同步过程中用于识别文件夹,不同设备间的相同文件夹需要具有相同的文件夹 ID。

  5. 选择同步模式:在“文件夹类型”下拉菜单中,选择“发送和接收”。这将确保文件夹在所有设备之间双向同步。这意味着,如果您在任何设备上添加、修改或删除文件,这些更改将在所有其他设备上同步。

  6. 其他设置:根据需要,您可以调整其他设置,例如版本控制、忽略文件等。当配置完成后,点击右下角的“保存”按钮。这将把文件夹添加到 Syncthing 中,准备与其他设备同步。

完成以上步骤后,您需要将此文件夹与其他设备共享,并在这些设备上接受共享请求。同步过程将在设备之间自动进行。

Syncthing同步文件的策略

在使用 Syncthing 同步多个文件夹时,如果本地不同文件夹中存在相同的文件(文件名和内容完全相同),Syncthing 会将它们视为不同的文件,因为 Syncthing 是基于文件夹的同步,而不是文件级别的同步。因此,每个文件夹都会将其视为独立的文件并分别处理。

如果你在本地设备的多个文件夹中有相同的文件,并希望将它们同步到远程设备,Syncthing 将为每个文件夹创建一个单独的同步过程。这意味着,尽管文件在本地设备上是相同的,但在远程设备上,它们将在各自对应的文件夹中各存一份。这可能会导致远程设备上的存储空间被重复占用。

如果你希望避免在远程设备上存储重复文件,你可以尝试以下解决方案:

  1. 在本地设备上使用符号链接(symlinks)或硬链接(hardlinks)将相同的文件链接到不同的文件夹。这样,你可以在本地设备上维护一个单一的文件副本,而在远程设备上,这些链接将作为单独的文件同步。

  2. 调整文件夹结构,将所有相同的文件移动到一个公共文件夹中,并在需要的地方使用链接。这样,你可以将一个文件夹与远程设备同步,而不是多个包含重复文件的文件夹。

  3. 使用第三方工具或脚本来识别并删除远程设备上的重复文件。这种方法可能需要定期运行工具或脚本来清理重复文件。

rsync 增量同步过程

要让 rsync 在同步过程中忽略已存在的文件,您可以使用 --ignore-existing 选项。以下是如何在 rsync 中使用 --ignore-existing 选项的示例:

rsync -av --ignore-existing --exclude '@eaDir' /var/services/homes/username/Photos/ /volume1/docker/syncthing/config/pixel_acf5-照片/Camera/

在这个示例中,

--ignore-existing 选项告诉 rsync 忽略目标位置已存在的文件。NAS Photos源文件夹路径是 /var/services/homes/username/Photos/,这里的目标文件夹路径是 /volume1/docker/syncthing/config/pixel_acf5-照片/Camera/

-av 表示使用归档模式(保留文件属性)并显示详细输出。

--exclude '@eaDir' 告诉 rsync 忽略所有名为 @eaDir 的文件夹。

请将 /source/directory//destination/directory/ 替换为实际的源和目标文件夹路径。

注意: 请谨慎使用此命令,因为它会删除所有匹配的目录及其内容。在执行此命令之前,请确保您已备份所有重要数据,并且确实希望删除这些目录。

递归删除目录文件夹下的所有 @eaDir 目录

如果之前上传的目录已包含了@eaDir 目录,可以递归删除文件夹下的所有 @eaDir 目录,您可以在命令行中使用 find 命令。以下是在 Unix 或类 Unix 系统(如 Linux 或 macOS)上递归删除文件夹下的所有 @eaDir 目录的方法:

find /volume1/docker/syncthing/config/pixel_acf5-照片/Camera -type d -name "@eaDir" -print -exec rm -rf {} +

在这个示例中,/path/to/your/folder 是您想要递归删除所有 @eaDir 目录的文件夹路径。将其替换为实际路径。在这个示例中,-print 选项将在删除每个匹配的 @eaDir 目录之前输出其路径。这样,您可以在执行过程中看到正在删除的目录记录。

注意: 此命令将删除所有匹配的目录及其内容,因此在执行之前,请确保您已备份所有重要数据,并且确实希望