如何用 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项目地址: 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 策略会在目标上游中按需创建路径。
可选策略及文档中的描述如下:
| 策略 | 描述 |
|---|---|
| all | search 与 action 同类别等同 epall;create 类别作用于所有上游 |
| epall | search:按配置顺序取相对路径存在的第一项;action:作用于所有找到的;create:作用于相对路径存在的所有上游 |
| epff | 按上游响应时间,取相对路径存在的第一项 |
| eplfs | 在相对路径存在的上游中选剩余空间最少者 |
| eplus | 在相对路径存在的上游中已用空间最少者 |
| eplno | 在相对路径存在的上游中对象数量最少者 |
| epmfs | 在相对路径存在的上游中剩余空间最多者(create_policy 默认值) |
| eprand | 调用 epall 后随机返回一个上游 |
| ff | search/action 同 epff;create 取按响应时间先返回的上游(search_policy 默认值) |
| lfs / lus / lno / mfs | 分别按"剩余空间最少 / 已用空间最少 / 对象数最少 / 剩余空间最多"选择上游 |
| newest | 选 mtime 最大的文件或目录 |
| rand | 调用 all 后随机返回一个上游 |
配置项、环境变量和默认值(来自 union 文档的标准选项):
| 配置项 | 环境变量 | 默认值 |
|---|---|---|
upstreams | RCLONE_UNION_UPSTREAMS | 必填 |
action_policy | RCLONE_UNION_ACTION_POLICY | epall |
create_policy | RCLONE_UNION_CREATE_POLICY | epmfs |
search_policy | RCLONE_UNION_SEARCH_POLICY | ff |
cache_time | RCLONE_UNION_CACHE_TIME | 120(秒,仅在使用 path preserving 策略时有效) |
min_free_space(高级) | RCLONE_UNION_MIN_FREE_SPACE | 1Gi,剩余空间低于该值的远端不参与 lfs/eplfs 策略 |
使用基于配额的策略前先确认上游支持对应字段
lfs、eplfs、mfs、epmfs、lus、eplus、lno、eplno 这些策略依赖配额信息,只在你的上游支持相应字段时才应使用:
| 策略 | 所需字段 |
|---|---|
| lfs、eplfs | Free |
| mfs、epmfs | Free |
| lus、eplus | Used |
| lno、eplno | Objects |
检查方式是对每个上游运行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项目地址: https://gitcode.com/GitHub_Trending/rc/rclone
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考