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
stickyimport
与 import
类似,但速度要快得多,因为它不需要对现有文件进行状态检查,也不需要进行初始的树遍历。它不会将缓存条目绑定到文件指纹上,而是创建仅与文件名绑定的 粘性 条目,忽略文件大小、修改时间等信息。此类哈希条目只能通过 purge
、delete
、backend 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
(或 md5sum
或 sha1sum
)命令将执行以下操作:
- 如果请求的哈希类型由底层支持,则直接传递。
- 如果对象大小小于
auto_size
,则下载对象并即时计算 请求的 哈希。 - 如果请求的哈希类型不支持且对象大小足够大,则构建对象的
指纹
(包括大小、如果支持的修改时间、如果有的话第一个找到的 其他 哈希)。 - 如果在缓存中为请求的远程存储找到了严格匹配项,则返回存储的哈希。
- 如果找到了远程存储但指纹不匹配,则清除该条目并进入步骤 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 进程之间共享。