Hasher

Hasher

Hasher 是一个特殊的覆盖式后端,用于创建能够处理其他远程存储校验和的远程存储。它的主要功能包括:

  • 模拟后端未实现的哈希类型
  • 缓存校验和,以帮助解决大型本地文件或 (S)FTP 文件哈希计算缓慢的问题
  • 从外部 SUM 文件预热校验和缓存

入门指南

要使用 Hasher,首先按照目标远程存储的配置说明设置底层远程存储。你也可以使用本地路径名代替远程存储。请确保你的基础远程存储可以正常工作。

在这里,我们将基础远程存储称为 myRemote:path。请注意,myRemote:path 内的所有内容都将由 Hasher 处理,而外部的内容则不会。这意味着,如果你使用的是基于存储桶的远程存储(如 S3、B2、Swift),则应将存储桶设置为 s3:bucket 这样的远程存储。

现在,你可以选择进行交互式配置或手动配置。

交互式配置

运行 rclone config 命令:

No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> Hasher1
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / Handle checksums for other remotes
   \ "hasher"
[snip]
Storage> hasher
Remote to cache checksums for, like myremote:mypath.
Enter a string value. Press Enter for the default ("").
remote> myRemote:path
Comma separated list of supported checksum types.
Enter a string value. Press Enter for the default ("md5,sha1").
hashsums> md5
Maximum time to keep checksums in cache. 0 = no cache, off = cache forever.
max_age> off
Edit advanced config? (y/n)
y) Yes
n) No
y/n> n
Remote config
--------------------
[Hasher1]
type = hasher
remote = myRemote:path
hashsums = md5
max_age = off
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y

手动配置

运行 rclone config path 命令查看当前活动配置文件的路径, 通常是 YOURHOME/.config/rclone/rclone.conf。 用你喜欢的文本编辑器打开该文件,找到基础远程存储的配置部分, 然后按照以下示例为 Hasher 创建新的配置部分:

[Hasher1]
type = hasher
remote = myRemote:path
hashes = md5
max_age = off

[Hasher2]
type = hasher
remote = /local/path
hashes = dropbox,sha1
max_age = 24h

Hasher 基本上接受以下参数:

  • remote 是必需的,
  • hashes 是一个以逗号分隔的支持的校验和类型列表 (默认值为 md5,sha1),
  • max_age - 校验和值在缓存中保留的最长时间, 0 表示完全禁用缓存, off 表示“永久”缓存(即直到文件被更改)。

确保 remote 中包含 :(冒号)。如果指定的远程存储没有冒号,那么 rclone 将使用同名的本地目录。因此,如果你使用 /local/path 作为远程存储,rclone 将处理该目录的哈希值。 如果你直接使用 remote = name,那么 rclone 将把文件 放在当前目录下名为 name 的目录中

使用方法

基本操作

现在,你可以使用 Hasher2:subdir/file 来代替基础远程存储。 当文件被完全读取或覆盖时,Hasher 会自动用新的校验和更新缓存,例如:

rclone copy External:path/file Hasher:dest/path

rclone cat Hasher:path/to/file > /dev/null

若要刷新子树中所有已缓存的校验和(即使是基础后端不支持的校验和),方法是重新下载该子树中的所有文件。例如,在命令行中使用任何支持的哈希算法执行 hashsum --download 命令(我们只关注重新读取文件):

rclone hashsum MD5 --download Hasher:path/to/subtree > /dev/null

rclone backend dump Hasher:path/to/subtree

您可以使用自定义后台命令打印或删除哈希和缓存:

rclone backend dump Hasher:dir/subdir

rclone backend drop Hasher:

从 SUM 文件预填充数据

Hasher 支持两个后端命令:通用的 SUM 文件 import 命令,以及速度更快但一致性稍差的 stickyimport 命令。

rclone backend import Hasher:dir/subdir SHA1 /path/to/SHA1SUM [--checkers 4]

除了 SHA1,也可以使用远程存储支持的任何哈希算法。最后一个参数可以指向一个本地的 SUM 格式文本文件,或者是一个 其他远程存储:路径 的 SUM 格式文本文件。

该命令会解析 SUM 文件,然后遍历第一个参数指定的路径,对当前的文件指纹进行快照,并相应地填充缓存条目。

  • SUM 文件中的路径会被视为相对于 hasher:dir/subdir
  • 该命令不会检查提供的值是否正确。你必须清楚自己在做什么。
  • 这是一次性操作。SUM 文件不会“附加”到远程存储上。如果对象的指纹发生变化,缓存条目之后仍可能被覆盖。
  • 根据树的大小,遍历树的过程可能会花费较长时间。你可以增加 --checkers 参数的值来加快速度。如果你不在乎文件指纹和一致性,也可以使用 stickyimport 命令。
rclone backend stickyimport hasher:path/to/data sha1 remote:/path/to/sum.sha1

stickyimportimport 类似,但速度要快得多,因为它不需要对现有文件进行状态检查,也不需要进行初始的树遍历。它不会将缓存条目绑定到文件指纹上,而是创建仅与文件名绑定的 粘性 条目,忽略文件大小、修改时间等信息。此类哈希条目只能通过 purgedeletebackend drop 命令,或者对文件进行完全重新读取/写入操作来替换。

配置参考

标准选项

以下是 Hasher(为其他远程存储提供更好的校验和)特有的标准选项。

–hasher-remote

需要缓存校验和的远程存储(例如 myRemote:path)。

属性:

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

–hasher-hashes

以逗号分隔的支持的校验和类型列表。

属性:

  • 配置项:hashes
  • 环境变量:RCLONE_HASHER_HASHES
  • 类型:逗号分隔列表
  • 默认值:md5,sha1

–hasher-max-age

校验和在缓存中保留的最长时间(0 表示不缓存,off 表示永久缓存)。

属性:

  • 配置项:max_age
  • 环境变量:RCLONE_HASHER_MAX_AGE
  • 类型:时长
  • 默认值:off

高级选项

以下是 Hasher(为其他远程存储提供更好的校验和)特有的高级选项。

–hasher-auto-size

自动更新小于此大小的文件的校验和(默认禁用)。

属性:

  • 配置项:auto_size
  • 环境变量:RCLONE_HASHER_AUTO_SIZE
  • 类型:大小后缀
  • 默认值:0

–hasher-description

远程存储的描述。

属性:

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

元数据

底层远程存储支持的任何元数据都会被读取和写入。

有关更多信息,请参阅 元数据 文档。

后端命令

以下是 Hasher 后端特有的命令。

使用以下方式运行这些命令:

rclone backend COMMAND remote:

下面的帮助信息将解释每个命令需要哪些参数。

有关如何传递选项和参数的更多信息,请参阅 backend 命令。

这些命令可以使用 rc 命令 backend/command 在运行的后端上执行。

drop

删除缓存

rclone backend drop remote: [选项] [<参数>+]

完全删除校验和缓存。 使用示例: rclone backend drop hasher:

dump

转储数据库

rclone backend dump remote: [选项] [<参数>+]

转储当前远程存储覆盖的缓存记录

fulldump

完全转储数据库

rclone backend fulldump remote: [选项] [<参数>+]

转储数据库中的所有缓存记录

import

导入 SUM 文件

rclone backend import remote: [选项] [<参数>+]

从 SUM 文件修改哈希缓存,并根据文件大小/时间将校验和绑定到文件上。 使用示例: rclone backend import hasher:subdir md5 /path/to/sum.md5

stickyimport

快速导入 SUM 文件

rclone backend stickyimport remote: [选项] [<参数>+]

从 SUM 文件填充哈希缓存,而不验证文件指纹。 使用示例: rclone backend stickyimport hasher:subdir md5 remote:path/to/sum.md5

实现细节(高级)

本节解释了各种 rclone 操作在 Hasher 远程存储上的工作原理。

免责声明。本节描述的是当前的实现方式,在未来的 rclone 版本中可能会发生变化!

Hashsum 命令

rclone hashsum(或 md5sumsha1sum)命令将执行以下操作:

  1. 如果请求的哈希类型由底层支持,则直接传递。
  2. 如果对象大小小于 auto_size,则下载对象并即时计算 请求的 哈希。
  3. 如果请求的哈希类型不支持且对象大小足够大,则构建对象的 指纹(包括大小、如果支持的修改时间、如果有的话第一个找到的 其他 哈希)。
  4. 如果在缓存中为请求的远程存储找到了严格匹配项,则返回存储的哈希。
  5. 如果找到了远程存储但指纹不匹配,则清除该条目并进入步骤 6。
  6. 如果未找到远程存储、没有请求的哈希类型或在步骤 5 之后:下载对象,即时计算所有 支持的 哈希并存储在缓存中;返回请求的哈希。

其他操作

  • 任何时候请求哈希时,遵循上述 hashsum 命令的步骤 1 - 4 的逻辑。
  • 每当文件被 完整 上传或下载时,捕获数据流以即时计算所有支持的哈希并更新数据库。
  • 服务器端的 move 操作将更新现有缓存条目的键。
  • deletefile 操作将删除单个缓存条目。
  • purge 操作将删除被清除路径下的所有缓存条目。

请注意,将 max_age 设置为 0 将完全禁用校验和缓存。

如果将 max_age 设置为 off,缓存中的校验和将永远不会过期,除非你完全重写或删除文件。

缓存存储

缓存的校验和以 bolt 数据库文件的形式存储在 rclone 缓存目录下,通常是 ~/.cache/rclone/kv/。每个 基础 后端维护一个数据库,命名格式为 BaseRemote~hasher.bolt

指向单个基础后端的多个 alias 的校验和将存储在同一个数据库中。所有本地路径都被视为指向 local 后端的别名(除非是加密或分块的),并存储在 ~/.cache/rclone/kv/local~hasher.bolt 中。

数据库可以在多个 rclone 进程之间共享。