如何用 rclone union 后端把多个网盘合并成一个统一视图并选择写入策略?

【免费下载链接】rclone "rsync for cloud storage" - Google Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Wasabi, Google Cloud Storage, Azure Blob, Azure Files, Yandex Files 【免费下载链接】rclone 项目地址: https://gitcode.com/GitHub_Trending/rc/rclone

当你同时持有几个网盘(或本地目录),希望用一个 remote 名称就能列出、读取和写入这些远端的内容时,rclone 的 union 后端(v1.44 引入)可以把多个上游远端合并成一个统一视图。完成本任务后,你可以:用一条 rclone lsd remote: 命令列出所有上游的顶层目录,用一条 rclone copy 命令把新文件写入指定的上游,并且通过 action_policy、create_policy、search_policy 三个策略项决定"写入落到哪个上游"。本文的操作路径来自 union 后端文档。

用 rclone config 配置 union remote

先确认所有要合并的上游远端都已经配置完成,然后运行交互式配置:

rclone config

在菜单中选择 n) New remote,输入名称后在 Type of storage to configure 中填入 union。文档给出的交互过程节选如下("epall"、"epmfs"、"ff" 分别为三项策略的默认值,直接回车即采用):

Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / Union merges the contents of several remotes
   \ "union"
[snip]
Storage> union
List of space separated upstreams.
Can be 'upstreama:test/dir upstreamb:', '\"upstreama:test/space:ro dir\" upstreamb:', etc.
Enter a string value. Press Enter for the default ("").
upstreams> remote1:dir1 remote2:dir2 remote3:dir3
Policy to choose upstream on ACTION class.
Enter a string value. Press Enter for the default ("epall").
action_policy>
Policy to choose upstream on CREATE class.
Enter a string value. Press Enter for the default ("epmfs").
create_policy>
Policy to choose upstream on SEARCH class.
Enter a string value. Press Enter for the default ("ff").
search_policy>
Cache time of usage and free space (in seconds). This option is only useful when a path preserving policy is used.
Enter a signed integer. Press Enter for the default ("120").
cache_time>

其中:

  • upstreams 是空格分隔的上游列表,可以写本地路径,也可以写已配置的远端,例如 remote1:dir1 remote2:dir2 remote3:dir3。
  • 上游路径中可以直接带子目录,例如 mydrive:private/backup。此时对 union remote 的操作会映射到该子目录:rclone mkdir backup:desktop 与 rclone mkdir mydrive:private/backup/desktop 完全等价。
  • 上游路径中的 .. 段没有特殊处理,按普通路径段透传,例如 backup:../desktop 等同于 mydrive:private/backup/../desktop。
  • 带空格的上游需要整体加引号,文档示例格式为 "upstreama:test/space:ro dir" upstreamb:。

用 :ro、:nc、:writeback 标记上游的写入行为

每个上游末尾可以追加标签来控制写入行为,这直接影响后续策略的过滤规则:

标签含义
:ro只读:文件只从这里读取,从不写入
:nc不创建:不在此创建新的文件或目录
:writeback在其它远端找到的文件会写回这里(见后文 writeback 小节)

例如 remote:directory/subdirectory:ro 表示该上游只读。过滤规则在 union 文档 中明确给出:

  • search 类策略不做任何过滤;
  • action 类策略会过滤掉标记为 :ro 的远端;
  • create 类策略会过滤掉标记为 :ro 或 :nc 的远端;
  • 如果所有远端都被过滤掉,操作会返回错误。

选择写入策略:action / create / search 三类

union 后端把所有操作分成三类,每一类各自分配一个策略,策略决定执行该操作时选用哪个上游:

类别说明覆盖的操作
action写入已存在的文件move、rmdir、rmdirs、delete、purge,以及 copy、sync 作为目标且文件已存在时
create创建不存在的文件copy、sync 作为目标且文件不存在时
search读取和列出文件ls、lsd、lsl、cat、md5sum、sha1sum,以及 copy、sync 作为源时
N/A不适用策略size、about

策略分两种基本类型:以 ep 开头的是 path preserving(existing path),只考虑"相对路径已经存在"的上游;非 path preserving 策略会在目标上游中按需创建路径。

可选策略及文档中的描述如下:

策略描述
allsearch 与 action 同类别等同 epall;create 类别作用于所有上游
epallsearch:按配置顺序取相对路径存在的第一项;action:作用于所有找到的;create:作用于相对路径存在的所有上游
epff按上游响应时间,取相对路径存在的第一项
eplfs在相对路径存在的上游中选剩余空间最少者
eplus在相对路径存在的上游中已用空间最少者
eplno在相对路径存在的上游中对象数量最少者
epmfs在相对路径存在的上游中剩余空间最多者(create_policy 默认值)
eprand调用 epall 后随机返回一个上游
ffsearch/action 同 epff;create 取按响应时间先返回的上游(search_policy 默认值)
lfs / lus / lno / mfs分别按"剩余空间最少 / 已用空间最少 / 对象数最少 / 剩余空间最多"选择上游
newest选 mtime 最大的文件或目录
rand调用 all 后随机返回一个上游

配置项、环境变量和默认值(来自 union 文档的标准选项):

配置项环境变量默认值
upstreamsRCLONE_UNION_UPSTREAMS必填
action_policyRCLONE_UNION_ACTION_POLICYepall
create_policyRCLONE_UNION_CREATE_POLICYepmfs
search_policyRCLONE_UNION_SEARCH_POLICYff
cache_timeRCLONE_UNION_CACHE_TIME120(秒,仅在使用 path preserving 策略时有效)
min_free_space(高级)RCLONE_UNION_MIN_FREE_SPACE1Gi,剩余空间低于该值的远端不参与 lfs/eplfs 策略

使用基于配额的策略前先确认上游支持对应字段

lfs、eplfs、mfs、epmfs、lus、eplus、lno、eplno 这些策略依赖配额信息,只在你的上游支持相应字段时才应使用:

策略所需字段
lfs、eplfsFree
mfs、epmfsFree
lus、eplusUsed
lno、eplnoObjects

检查方式是对每个上游运行 rclone about remote: [flags],看输出中是否存在所需字段。rclone about 文档 展示了典型输出(文档示例,数值因远端而异):

Total:   17 GiB
Used:    7.444 GiB
Free:    1.315 GiB
Trashed: 100.000 MiB
Other:   8.241 GiB

字段说明中 Free 是本用户可用空间,Used 是已用空间,Objects 是对象总数;并非所有后端都打印所有字段,后端未提供的信息不会包含在输出里。另外 overview 文档 明确说明:没有 about 能力的后端无法确定剩余空间,因此不能作为 union remote 中使用 mfs(most free space)策略的成员。若你的上游属于这类后端,应选择 ff、epall、newest、rand 等不依赖配额的策略。

验证统一视图是否生效

配置完成后,按文档给出的命令逐个验证:

列出 remote1:dir1、remote2:dir2、remote3:dir3 三个上游的顶层目录:

rclone lsd remote:

列出三个上游的所有文件:

rclone ls remote:

把另一个本地目录复制进 union,文档示例为:

rclone copy C:\source remote:source

文档说明这条复制会落到 remote3:dir3。这里不要把它理解为"永远落到最后一个上游"——写入目标是 create 策略决定的,示例环境下策略行为正好选中 remote3:dir3;如果你修改了 create_policy,落点会按策略规则变化。

如果你给某个上游加了子目录前缀(如 mydrive:private/backup),可以用 mkdir 验证路径映射:执行 rclone mkdir backup:desktop,然后在 mydrive 下确认 private/backup/desktop 已创建,两者应当一致。

可选分支:用 :writeback 搭一个简单的缓存

把 :writeback 标签加在一个上游上,可以构造简单的缓存系统。union 文档 给出的配置示例:

[union]
type = union
action_policy = all
create_policy = all
search_policy = ff
upstreams = /local:writeback remote:dir

其行为:

  • 读取文件时,如果文件在 remote:dir 而不在 /local,rclone 会先把整个文件复制到 /local,再返回 /local 中该文件的引用。复制使用等同 rclone copy 的方式,配置了 --multi-thread-streams 时会使用它,所有复制都会记录 INFO 级别日志;
  • 写入文件时,会同时写入 remote:dir 和 /local;
  • upstreams 可以加任意多个远端,但 :writeback 标签只能有一个;
  • rclone 除了把文件写回之外不会管理 :writeback 远端,过期清理、控制大小需要你自行处理。

限制与边界

  • size、about 两个操作在 union 下标记为 N/A,不参与任何策略。
  • 策略行为受标签过滤约束:action 排除 :ro,create 排除 :ro 与 :nc;全部被过滤时操作返回错误。
  • 上游 metadata 方面,union 支持底层远端所支持的任意 metadata 的读写(见 union 文档 Metadata 一节)。
  • cache_time 只对 path preserving 策略有效,默认 120 秒,用于缓存用量与剩余空间查询结果。

完成上述配置与验证后,你就可以把 remote: 当作单一远端使用,写入落点由三类策略分别控制;后续如需调整,只需改 action_policy / create_policy / search_policy 三个配置项或对应的 RCLONE_UNION_* 环境变量。

【免费下载链接】rclone "rsync for cloud storage" - Google Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Wasabi, Google Cloud Storage, Azure Blob, Azure Files, Yandex Files 【免费下载链接】rclone 项目地址: https://gitcode.com/GitHub_Trending/rc/rclone

更多推荐