Chunker

Chunker

chunker 覆盖层会在上传到包装的远程存储时,将大文件透明地分割成较小的块,并在下载文件时再将它们透明地重新组装起来。这使得我们能够有效地克服存储提供商施加的大小限制。

配置

要使用它,首先按照该远程存储的配置说明设置底层的远程存储。你也可以使用本地路径名代替远程存储。

首先检查你选择的远程存储是否正常工作 - 这里我们将其称为 remote:path。请注意,remote:path 内的任何内容都会被分块,而外部的则不会。这意味着如果你使用的是基于存储桶的远程存储(例如 S3、B2、Swift),那么你可能应该将存储桶放在远程存储 s3:bucket 中。

现在使用 rclone config 配置 chunker。我们将其称为 overlay,以便将其与 remote 本身区分开来。

No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> overlay
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / Transparently chunk/split large files
   \ "chunker"
[snip]
Storage> chunker
Remote to chunk/unchunk.
Normally should contain a ':' and a path, e.g. "myremote:path/to/dir",
"myremote:bucket" or maybe "myremote:" (not recommended).
Enter a string value. Press Enter for the default ("").
remote> remote:path
Files larger than chunk size will be split in chunks.
Enter a size with suffix K,M,G,T. Press Enter for the default ("2G").
chunk_size> 100M
Choose how chunker handles hash sums. All modes but "none" require metadata.
Enter a string value. Press Enter for the default ("md5").
Choose a number from below, or type in your own value
 1 / Pass any hash supported by wrapped remote for non-chunked files, return nothing otherwise
   \ "none"
 2 / MD5 for composite files
   \ "md5"
 3 / SHA1 for composite files
   \ "sha1"
 4 / MD5 for all files
   \ "md5all"
 5 / SHA1 for all files
   \ "sha1all"
 6 / Copying a file to chunker will request MD5 from the source falling back to SHA1 if unsupported
   \ "md5quick"
 7 / Similar to "md5quick" but prefers SHA1 over MD5
   \ "sha1quick"
hash_type> md5
Edit advanced config? (y/n)
y) Yes
n) No
y/n> n
Remote config
--------------------
[overlay]
type = chunker
remote = remote:bucket
chunk_size = 100M
hash_type = md5
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y

指定远程存储

在正常使用时,请确保远程存储的名称中包含 :。如果指定的远程存储名称中没有 :,rclone 将使用同名的本地目录。

因此,如果你使用 /path/to/secret/files 作为远程存储,rclone 将对该目录中的文件进行分块处理。如果你使用 name 作为远程存储,rclone 将把文件放在当前目录下名为 name 的目录中。

分块处理

当 rclone 开始上传文件时,分块器会检查文件大小。如果文件大小不超过配置的分块大小,分块器会直接将文件传递给包装的远程存储(不过,请参阅下面的注意事项)。如果文件较大,分块器会将数据透明地切割成带有临时名称的小块,并实时逐个流式传输这些小块。

每个数据块将包含指定数量的字节,除了最后一个块,它可能包含较少的数据。如果文件大小事先未知(这称为流式上传),分块器会在内部创建一个临时副本,记录其大小,然后重复上述过程。

上传完成后,临时分块文件最终会被重命名。这种方案保证了操作可以并行运行,并且从外部看起来是原子操作。

类似的带有隐藏临时分块的方法也用于其他操作(复制/移动/重命名等)。如果操作失败,隐藏的分块通常会被删除,而目标复合文件将保持完整。

当请求下载复合文件时,分块器会通过按顺序连接数据块来透明地组装该文件。由于分割操作很简单,甚至可以手动将数据块连接在一起以获取原始内容。

list rclone 命令扫描包装的远程存储上的目录时,会考虑潜在的分块文件,将它们分组并组装成复合目录条目。任何临时分块都会被隐藏。

list 命令和其他命令有时会遇到缺少或无效分块的复合文件,例如被同名目录或其他文件遮挡。这通常意味着包装的文件系统被直接篡改或损坏。如果分块器检测到缺少分块,默认情况下会打印警告信息,跳过整个不完整的分块组,但会继续执行当前命令。

你可以设置 --chunker-fail-hard 标志,使命令在这种情况下以错误消息终止。

注意事项:目前,即使文件大小低于分块阈值,分块器也会在后端创建一个临时文件,然后对其进行重命名。这会导致不必要的 API 调用,并且在处理某些后端(如 Box)上主要由小文件组成的传输时,会严重限制吞吐量。

解决此问题的方法是通过 --min-size 仅对大于分块阈值的文件使用分块器,然后对其余文件进行单独的无分块调用。

分块文件名

默认的分块文件名格式是 *.rclone_chunk.###,因此默认情况下,分块文件名是 BIG_FILE_NAME.rclone_chunk.001BIG_FILE_NAME.rclone_chunk.002 等。你可以使用 name_format 配置文件选项配置其他文件名格式。该格式使用星号 * 作为基本文件名的占位符,使用一个或多个连续的井号 # 作为顺序分块编号的占位符。

必须有且仅有一个星号。连续井号的数量定义了表示分块编号的字符串的最小长度。如果十进制分块编号的位数少于井号的数量,会在左侧用零填充。如果十进制字符串更长,则保持不变。

默认情况下,编号从 1 开始,但还有一个选项允许用户从 0 开始,例如为了与旧版软件兼容。

例如,如果文件名格式是 big_*-##.part,原始文件名是 data.txt,并且编号从 0 开始,那么第一个分块将被命名为 big_data.txt-00.part,第 99 个分块将是 big_data.txt-98.part,第 302 个分块将变为 big_data.txt-301.part

请注意,list 命令仅在分块文件名与配置的格式匹配时才会组装复合目录条目,并将不符合格式的文件名视为普通的非分块文件。

使用 norename 事务时,分块文件名还会有一个唯一的文件版本后缀。例如,BIG_FILE_NAME.rclone_chunk.001_bp562k

元数据

除了数据分块,分块器默认会为复合文件创建元数据对象。该对象以原始文件名命名。

分块器允许用户完全禁用元数据(none 格式)。请注意,通常不会为小于配置分块大小的文件创建元数据。这可能会在未来的 rclone 版本中发生变化。

简单 JSON 元数据格式

这是默认格式。它支持复合文件的哈希总和和分块验证。元对象包含以下字段:

  • ver - 格式版本,当前为 1
  • size - 复合文件的总大小
  • nchunks - 文件中的数据分块数量
  • md5 - 复合文件的 MD5 哈希总和(如果存在)
  • sha1 - SHA1 哈希总和(如果存在)
  • txn - 标识文件的当前版本

没有复合文件名的字段,因为它简单地等于包装的远程存储上元对象的名称。有关哈希总和和修改时间处理的详细信息,请参考相应部分。

无元数据

你可以通过将元数据格式选项设置为 none 来禁用元对象。

在这种模式下,分块器会扫描目录中所有符合配置的分块文件名格式的文件,通过检测具有相同基本名称的分块来对它们进行分组,并将组名显示为虚拟复合文件。

这种方法比启用元数据的格式更容易出现分块缺失错误(尤其是最后一个分块缺失)。

哈希总和

只有当存在兼容的元数据时,分块器才支持哈希总和。因此,如果你选择 none 元数据格式,分块器将报告哈希总和为 UNSUPPORTED

请注意,默认情况下,元数据仅存储在复合文件中。如果文件小于配置的分块大小,分块器会将哈希请求透明地重定向到包装的远程存储,因此支持情况取决于该远程存储。

如果包装的远程存储不支持请求的哈希类型,你将看到空字符串作为小文件的哈希总和。

许多存储后端支持 MD5 和 SHA1 哈希类型,分块器也是如此。使用分块器时,你可以选择其中一种,但不能同时选择两种。

默认情况下,MD5 被设置为最受支持的类型。由于分块器会保留复合文件的哈希值,并在非分块文件时回退到包装的远程存储的哈希值,我们建议你选择与包装的远程存储支持的相同哈希类型,以便文件列表看起来一致。

如果你的存储后端不支持 MD5 或 SHA1,但你需要一致的文件哈希,可使用 md5allsha1all 配置分块器。这两种模式保证了所有文件都有给定的哈希值。如果包装的远程存储不支持该哈希类型,分块器会为所有文件(甚至是小文件)添加元数据。然而,这会使存储中的小文件数量翻倍,并产生额外的服务费用。

你甚至可以使用分块器通过设置 hash_type=sha1all 强制在任何其他远程存储中支持 md5/sha1,并通过设置 chunk_size=1P 有效地禁用分块,代价是需要额外的元数据文件。

通常,当文件被复制到分块器控制的远程存储时,分块器会向文件源请求兼容的文件哈希,如果未找到则进行实时计算。这会涉及一些 CPU 开销,但保证了给定的哈希总和可用。此外,如果源和目标的哈希总和类型不同,分块器会拒绝服务器端的复制或移动操作,这也会导致额外的网络带宽消耗。

在某些罕见情况下,这可能是不希望的,因此分块器提供了两个可选选项:sha1quickmd5quick。如果源不支持主要哈希类型,并且启用了快速模式,分块器会尝试回退到次要类型。这将节省 CPU 和带宽,但可能导致目标处的哈希总和为空。请注意后果:如果在源和目标之间未找到兼容的哈希总和,sync 命令将(有时是静默地)恢复到时间/大小比较。

修改时间

分块器使用包装的远程存储来存储修改时间,因此支持情况取决于该远程存储。对于小的非分块文件,分块器覆盖层只是简单地操作包装的远程存储文件的修改时间。

对于带有元数据的复合文件,分块器会获取和设置包装的远程存储上元数据对象的修改时间。

如果文件被分块,但元数据格式为 none,则分块器将使用第一个数据块的修改时间。

迁移

迁移到不同的分块大小、哈希类型、事务风格或分块命名方案的惯用方法是:

  • 将所有分块文件收集到一个目录下,并让你的分块器远程存储指向该目录。
  • 创建另一个目录(很可能在同一个云存储上),并配置一个新的远程存储,设置所需的元数据格式、哈希类型、分块命名等。
  • 现在运行 rclone sync --interactive oldchunks: newchunks:,所有数据将在传输过程中透明地转换。 这可能需要一些时间,但分块器会尽可能尝试使用服务器端复制。
  • 检查数据完整性后,你可以删除旧远程存储的配置部分。

如果 rclone 在处理大型复合文件的长时间操作过程中被终止,隐藏的临时分块可能会留在目录中。list 命令不会显示这些分块,但它们会占用你的账户配额。

请注意,deletefile 命令仅删除文件的活动分块。解决方法是使用包装的文件系统的远程存储来查看它们。

清除隐藏垃圾的简单方法是使用分块器远程存储将杂乱的目录复制到其他地方,然后清除原始目录。copy 命令只会复制活动分块,而 purge 命令会删除包括垃圾在内的所有内容。

注意事项和限制

分块器要求包装的远程存储支持服务器端的 move(或 copy + delete)操作,否则它会明确拒绝启动。这是因为在操作成功完成后,它会在内部将临时分块文件重命名为最终名称。

分块器在文件名中编码分块编号,因此在默认的 name_format 设置下,它会增加 17 个字符。此外,分块器在操作过程中会增加 7 个字符的临时后缀。许多文件系统将不带路径的基本文件名限制为 255 个字符。将 rclone 的 crypt 远程存储用作基本文件系统会将文件名限制为 143 个字符。因此,大多数文件的最大名称长度为 231 个字符,使用分块器覆盖 crypt 时为 119 个字符。有需要的用户可以将文件名格式更改为例如 *.rcc##,并节省 10 个字符(前提是每个文件最多有 99 个分块)。

请注意,使用复制并删除方法实现的移动操作可能会导致某些云存储提供商收取双倍费用。

当你在活动的远程存储上运行 rclone config 并更改分块文件名格式时,分块器不会自动重命名现有的分块。请注意,这样做的结果是,更改前被视为分块的某些文件可能会在目录列表中作为普通文件出现,反之亦然。对于分块大小也有同样的警告。

如果你确实需要更改关键的分块设置,应该按照上述说明进行数据迁移。

如果包装的远程存储不区分大小写,分块器覆盖层将继承该属性(因此你不能在同一目录中有名为 “Hello.doc” 和 “hello.doc” 的文件)。

rclone 版本 v1.54 及更早版本中包含的分块器有时可能无法检测到较新版本的 rclone 生成的元数据。我们建议用户保持 rclone 为最新版本,以避免数据损坏。

更改 transactions 设置很危险,需要进行显式迁移。

标准选项

以下是分块器(透明地对大文件进行分块/拆分)特有的标准选项。

–chunker-remote

要进行分块/合并的远程存储。

通常应包含 : 和路径,例如 “myremote:path/to/dir”、“myremote:bucket” 或 “myremote:"(不推荐)。

属性:

  • 配置项:remote
  • 环境变量:RCLONE_CHUNKER_REMOTE
  • 类型:字符串
  • 是否必需:是

–chunker-chunk-size

大于分块大小的文件将被拆分为多个分块。

属性:

  • 配置项:chunk_size
  • 环境变量:RCLONE_CHUNKER_CHUNK_SIZE
  • 类型:大小后缀
  • 默认值:2Gi

–chunker-hash-type

选择分块器处理哈希总和的方式。

除 “none” 模式外,所有模式都需要元数据。

属性:

  • 配置项:hash_type
  • 环境变量:RCLONE_CHUNKER_HASH_TYPE
  • 类型:字符串
  • 默认值:“md5”
  • 示例:
    • “none”
      • 对于非分块文件,传递包装的远程存储支持的任何哈希值。
      • 否则返回空值。
    • “md5”
      • 复合文件使用 MD5 哈希。
    • “sha1”
      • 复合文件使用 SHA1 哈希。
    • “md5all”
      • 所有文件使用 MD5 哈希。
    • “sha1all”
      • 所有文件使用 SHA1 哈希。
    • “md5quick”
      • 将文件复制到分块器时,会从源请求 MD5 哈希。
      • 如果不支持,则回退到 SHA1。
    • “sha1quick”
      • 类似于 “md5quick”,但优先使用 SHA1 而不是 MD5。

高级选项

以下是分块器(透明地对大文件进行分块/拆分)特有的高级选项。

–chunker-name-format

分块文件名的字符串格式。

有两个占位符:基本文件名(*)和分块编号(#…)。 必须有且仅有一个星号和一个或多个连续的井号。 如果分块编号的位数少于井号的数量,会在左侧用零填充。 如果编号的位数更多,则保持不变。 如果分块文件的名称与给定格式不匹配,则会被忽略。

属性:

  • 配置项:name_format
  • 环境变量:RCLONE_CHUNKER_NAME_FORMAT
  • 类型:字符串
  • 默认值:”*.rclone_chunk.###"

–chunker-start-from

最小有效分块编号。通常为 0 或 1。

默认情况下,分块编号从 1 开始。

属性:

  • 配置项:start_from
  • 环境变量:RCLONE_CHUNKER_START_FROM
  • 类型:整数
  • 默认值:1

–chunker-meta-format

元数据对象的格式或 “none”。

默认情况下为 “simplejson”。 元数据是一个以复合文件命名的小 JSON 文件。

属性:

  • 配置项:meta_format
  • 环境变量:RCLONE_CHUNKER_META_FORMAT
  • 类型:字符串
  • 默认值:“simplejson”
  • 示例:
    • “none”
      • 完全不使用元数据文件。
      • 需要哈希类型为 “none”。
    • “simplejson”
      • 简单 JSON 支持哈希总和和分块验证。
      • 它有以下字段:ver、size、nchunks、md5、sha1。

–chunker-fail-hard

选择分块器应如何处理缺少或无效分块的文件。

属性:

  • 配置项:fail_hard
  • 环境变量:RCLONE_CHUNKER_FAIL_HARD
  • 类型:布尔值
  • 默认值:false
  • 示例:
    • “true”
      • 报告错误并终止当前命令。
    • “false”
      • 警告用户,跳过不完整的文件并继续执行。

–chunker-transactions

选择分块器在事务期间应如何处理临时文件。

属性:

  • 配置项:transactions
  • 环境变量:RCLONE_CHUNKER_TRANSACTIONS
  • 类型:字符串
  • 默认值:“rename”
  • 示例:
    • “rename”
      • 事务成功后重命名临时文件。
    • “norename”
      • 保留临时文件名,并将事务 ID 写入元数据文件。
      • 不重命名事务需要元数据(元数据格式不能为 “none”)。
      • 如果你使用不重命名事务,应注意不要降级 Rclone,因为旧版本的 Rclone 不支持这种事务风格,会误解由不重命名事务操作的文件。
      • 此方法是实验性的,请勿在生产系统中使用。
    • “auto”
      • 根据后端的功能使用重命名或不重命名。
      • 如果元数据格式设置为 “none”,将始终使用重命名事务。
      • 此方法是实验性的,请勿在生产系统中使用。

–chunker-description

远程存储的描述。

属性:

  • 配置项:description
  • 环境变量:RCLONE_CHUNKER_DESCRIPTION
  • 类型:字符串
  • 是否必需:否