rclone B2 后端深度解析:Backblaze B2 的配置、版本管理、SSE-C 加密与 backend 命令实战
本文以 rclone 官方 B2 后端文档为核心,系统讲解 rclone 对接 Backblaze B2 的完整实践:交互式配置流程、Application Key 鉴权(含 401 陷阱)、--b2-versions / --b2-version-at 版本管理、SSE-C 客户侧加密、分块上传与 SHA1 校验机制,以及 rclone backend lifecycle / cleanup / cleanup-hidden 三个后端专属命令的用法。同时结合仓库内 backend/b2/b2.go 与 backend/b2/upload.go 的源码,说明各配置项背后的实际实现,读完后你可以独立完成 B2 远程端的创建、同步、版本回看与生命周期治理,并理解每个参数在 API 调用层的作用。
路径约定
B2 是 Backblaze 的云端对象存储系统。rclone 中 B2 远程端的路径规范为 remote:bucket(lsd 命令可直接用 remote: 列出所有桶),也可以带子目录,例如 remote:bucket/path/to/dir。
从源码结构看,B2 属于典型的 BucketBased 后端:backend/b2/b2.go 中 NewFs 通过 f.features 声明了 BucketBased: true, BucketBasedRootOK: true,路径解析则委托给公共库 lib/bucket 的 bucket.Split,把根路径拆成 bucket 与 directory 两部分(setRoot 函数)。这也意味着 B2 的根(remote:)本身是合法的,可以直接列出全部桶。
配置流程
运行 rclone config 进入交互式配置向导:
rclone config
向导会引导你完成创建。鉴权需要二选一:Account ID(短十六进制串)+ Master Application Key(长十六进制串),或者直接使用 Application Key(官方推荐方式,详见下文)。
No remotes found, make a new one?
n) New remote
q) Quit config
n/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / Backblaze B2
\ "b2"
[snip]
Storage> b2
Account ID or Application Key ID
account> 123456789abc
Application Key
key> 0123456789abcdef0123456789abcdef0123456789
Endpoint for the service - leave blank normally.
endpoint>
Remote config
Configuration complete.
Options:
- type: b2
- account: 123456789abc
- key: 0123456789abcdef0123456789abcdef0123456789
- endpoint:
Keep this "remote" remote?
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
该远程端名为 remote,创建后即可这样使用——查看所有桶、创建桶、列出桶内容、把本地目录同步到远程桶(删除桶内多余文件):
rclone lsd remote:
rclone mkdir remote:bucket
rclone ls remote:bucket
rclone sync --interactive /home/local/directory remote:bucket
Application Key
B2 支持针对不同桶访问权限的多种 Application Key。rclone 需要 1.43 或更高版本 才能配合这类受限 Key 使用。
按照 Backblaze 文档创建一个具有所需权限的 Application Key 后,把 applicationKeyId 填进 rclone 的 account 项,把 Application Key 本身填进 key 项。注意:account 必须填 applicationKeyId 而不是主 Account ID,用主 Account ID 搭配 Application Key 时 B2 会返回 401 错误。
这一点在源码中有直接印证:backend/b2/b2.go 的 authorizeAccount 用 Basic Auth(UserName: account, Password: key)调用 /b2api/v4/b2_authorize_account 换取 API URL 与令牌;随后 NewFs 会检查返回的 Allowed.Buckets 白名单——若 Key 被限制在特定桶上,而当前远程端指向的桶不在其中,就会直接报错 you must use bucket(s) ... with this application key(见 NewFs 中 610–633 行附近的校验逻辑)。另外 401 会被 shouldRetry 识别为"令牌过期"信号,触发重新授权后自动重试。
基础能力:fast-list 与修改时间
--fast-list
B2 后端支持 --fast-list:用更少的 API 事务换取更多内存占用(一次性递归拉取整棵目录树)。对应实现即 backend/b2/b2.go 中的 ListR——它以 recurse=true 调用内部 list,不再逐目录分页。参见 rclone fast-list 说明。
修改时间
修改时间作为对象元数据存储,键为 X-Bz-Info-src_last_modified_millis,值是自 1970-01-01 起的毫秒数(Backblaze 标准写法)。其他工具也能用这个字段读取修改时间。
修改时间完整参与同步判断。注意:更新某个对象的修改时间会创建该对象的一个新版本(B2 不支持原地改元数据)。
源码佐证:
- 常量
timeKey = "src_last_modified_millis"与上传头timeHeader = "X-Bz-Info-src_last_modified_millis"定义在 backend/b2/b2.go; - 上传时由
timeString(modTime)把毫秒时间戳写进请求头(Update函数); SetModTime的实现是"把对象拷贝到自身并替换 Info 元数据"(info.Info[timeKey] = timeString(modTime)后调用f.copy),这正是"改时间会新增一个版本"的来源;- 解析侧
parseTimeStringHelper按十进制毫秒字符串还原为 UTC 时间。
文件名限制字符
在 默认限制字符集 之外,B2 额外替换反斜杠:
| 字符 | 值 | 替换为 |
|---|---|---|
\ |
0x5C | \(全角反斜杠) |
无效 UTF-8 字节同样会被替换,因为它们无法出现在 JSON 字符串中。
注意:2020 年 5 月起 Backblaze 已允许文件名包含 \,但 rclone 保持了原有编码不变,以免已有同步任务因编码差异而重新传输全部文件。如果你希望 rclone 不再替换 \,请在配置中修改 --b2-encoding,从编码字符串里去掉 BackSlash。
源码中默认编码声明为 encoder.Display | encoder.EncodeBackSlash | encoder.EncodeInvalidUtf8(backend/b2/b2.go),生成的文档默认值为 Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot,两者一致。
SHA1 校验和
上传与下载都会校验文件 SHA1,并参与同步比对(Hashes() 返回 hash.Set(hash.SHA1))。
- 大于
--b2-upload-cutoff的大文件按块上传时,SHA1 会按 Backblaze 建议以元数据X-Bz-Info-large_file_sha1形式存储在对象上; - 大文件要带 SHA1,源端必须支持 SHA1。本地磁盘支持,因此本地磁盘的大文件传输天然带 SHA1;
- 不支持 SHA1 的源(尤其是
crypt)上传的大文件将没有 SHA1 校验和,未来可能修复(上游 issue #1767); - 小于
--b2-upload-cutoff的文件无论源端是否支持,总是有 SHA1。
源码印证:
- 单文件上传路径(
Update)中,若源端没有现成 SHA1,rclone 会用hashAppendingReader(定义在 backend/b2/upload.go)在数据流末尾追加十六进制 SHA1 摘要,并把请求头X-Bz-Content-Sha1设为hex_digits_at_end,这正是 B2 API 约定的"摘要在末尾"模式; - 分块上传路径(
newLargeUpload)中,只有当!opt.DisableCheckSum || doCopy且源端能给出 SHA1 时,才写入request.Info[sha1Key](即X-Bz-Info-large_file_sha1)——--b2-disable-checksum选项正是从这里生效; - 下载侧,
openFile.Close用io.TeeReader边读边累积 SHA1,读完整个文件后同时比对长度与 SHA1,不一致则报corrupted on transfer。
传输调优:并发与内存
Backblaze 建议并行执行大量传输以获得最大速度。作者在配备 SSD 的笔记本上测试,最优设置约为 --transfers 32(更高数值可能略有提升,视硬件、文件大小与负载意愿而定);默认的 --transfers 4 对 B2 明显偏低。
注意:上传大于 200 MiB 的大文件默认使用 96 MiB 的 RAM 缓冲,任意时刻最多 --transfers 个这样的缓冲在用,这就构成了内存占用的上限。
这些数字都能在源码常量中找到:
minChunkSize = 5 * fs.Mebi
defaultChunkSize = 96 * fs.Mebi
defaultUploadCutoff = 200 * fs.Mebi
largeFileCopyCutoff = 4 * fs.Gibi // 5E9 is the max
(见 backend/b2/b2.go)
另外从源码结构看,B2 后端还有两个值得了解的传输细节:
- 上传 URL 缓存:
getUploadURL/returnUploadURL维护按 bucketID 索引的UploadURL队列,用完后归还复用,减少b2_get_upload_url调用次数; - 限流重试:内置
pacer(最小退避 10 ms、最大 5 min、指数衰减),对 429/503 会读取Retry-After响应头决定重试间隔,401 则自动重新授权后再试。
版本(Versions)管理
B2 默认保留文件的历史版本:rclone 上传新内容会生成新版本;删除文件时旧版本被"隐藏"(hidden)而非物理移除,仍然可用。
每个桶是否保留旧版本,可以通过 B2 控制台的生命周期设置调整,也可以在创建桶时用 --b2-lifecycle 参数指定,或在建桶后用 rclone backend lifecycle 命令设置。
以下是版本管理的完整操作面:
- 硬删除:
--b2-hard-delete让删除操作永久移除文件,而不是隐藏; - 查看旧版本:
--b2-versions让列表显示历史版本,并可用delete删除其中任意版本; - 时间旅行视图:
--b2-version-at显示桶在某个时间点的快照——其后删除的文件会显示,其后创建的文件会被隐藏; - 清理旧版本:
rclone cleanup remote:bucket删除所有旧版本(保留当前版本),也可以带路径只清理子树,如rclone cleanup remote:bucket/path/to/stuff。注意cleanup会顺带删除超过一天的未完成的分块上传;若要精确控制过期时间,可运行rclone backend cleanup b2:bucket -o max-age=1h,只删除一小时前的未完成大文件上传,保留旧版本; - 只删旧版本:
rclone backend cleanup-hidden remote:bucket删除所有旧(隐藏)版本,保留当前文件与未完成上传,同样支持带路径; - purge 与 delete 的区别:
purge桶时当前版本与旧版本一起删除,再删除桶本身;而delete只是把当前版本变成隐藏的旧版本。
一个完整的会话示例——列出版本、取回旧版本、清理旧版本:
$ rclone -q ls b2:cleanup-test
9 one.txt
$ rclone -q --b2-versions ls b2:cleanup-test
9 one.txt
8 one-v2016-07-04-141032-000.txt
16 one-v2016-07-04-141003-000.txt
15 one-v2016-07-02-155621-000.txt
取回一个旧版本:
$ rclone -q --b2-versions copy b2:cleanup-test/one-v2016-07-04-141003-000.txt /tmp
$ ls -l /tmp/one-v2016-07-04-141003-000.txt
-rw-rw-r-- 1 ncw ncw 16 Jul 2 17:46 /tmp/one-v2016-07-04-141003-000.txt
清理所有旧版本并确认:
$ rclone -q cleanup b2:cleanup-test
$ rclone -q ls b2:cleanup-test
9 one.txt
$ rclone -q --b2-versions ls b2:cleanup-test
9 one.txt
版本命名的注意事项
使用 --b2-versions 时,rclone 依赖文件名来区分对象是"版本"还是普通文件:版本名是在文件名与扩展名之间插入时间戳生成的,例如:
9 file.txt
8 file-v2023-07-17-161032-000.txt
16 file-v2023-06-15-141003-000.txt
如果桶里恰好存在与版本命名规则相同的真实文件,--b2-versions 的行为可能不可预测。
--b2-versions 模式详解
--b2-versions 打开后,rclone 会显示并操作历史版本。未开启时:
$ rclone -q ls b2:cleanup-test
9 one.txt
开启后:
$ rclone -q --b2-versions ls b2:cleanup-test
9 one.txt
8 one-v2016-07-04-141032-000.txt
16 one-v2016-07-04-141003-000.txt
15 one-v2016-07-02-155621-000.txt
当前版本不变,旧版本可见。版本后缀是对象上传到服务器的 UTC 时间(精确到毫秒)。使用 --b2-versions 时禁止一切文件写操作,既不能上传也不能删除(普通写),但删除版本是允许的——源码中 Update / OpenChunkWriter 会返回 errNotWithVersions(can't modify files in --b2-versions mode),而 Object.Remove 在 versions 模式下走 deleteByID 删除具体版本。
从源码看,版本列表来自 B2 的 /b2_list_file_versions API:backend/b2/b2.go 的 list 函数在 hidden || f.opt.VersionAt.IsSet() 时切换该端点;itemToDirEntry 用 object.UploadTimestamp.AddVersion(remote) 为同名旧对象生成带时间戳的展示名(同一名称的最新版保留原名,其余追加 -vYYYY-MM-DD-HHMMSS-SSS),并跳过 Action == "hide" 的隐藏标记对象。常量 maxVersions = 100 限制了 versions 模式下单名最多搜索的版本数;--b2-version-at 则过滤掉 UploadTimestamp 晚于指定时间的版本,并对同名对象只保留该时刻最新的一份。
数据用量(API 请求计数)
了解不同场景下向 B2 发送了多少请求很有用,因为 B2 按 API 调用计费:
所有 copy 类命令至少发送以下 4 个请求:
/b2api/v4/b2_authorize_account
/b2api/v1/b2_create_bucket
/b2api/v1/b2_list_buckets
/b2api/v1/b2_list_file_names
b2_list_file_names 每 1000 个文件发送一次,返回文件的校验和与修改时间。自 1.33 起,B2 配合 Crypt 使用时存在导致额外请求的已知问题(issue #818)。若本次 copy 无需上传任何文件,则不再发送更多请求。
单文件上传(无需分块)每文件 2 个请求:
/b2api/v1/b2_get_upload_url
/b2api/v1/b2_upload_file/
需要分块的大文件上传:2 个控制请求(开始/结束)外加每块 2 个请求:
/b2api/v1/b2_start_large_file
/b2api/v1/b2_get_upload_part_url
/b2api/v1/b2_upload_part/
/b2api/v1/b2_finish_large_file
这些路径与源码中的 rest.Opts{Path: ...} 调用一一对应(authorizeAccount、makeBucket、listBucketsToFn、list、getUploadURL、Update 与 backend/b2/upload.go 中的 newLargeUpload / getUploadURL / WriteChunk / Close)。
rclone link 与私有桶分享
rclone 支持为私有 B2 桶生成文件分享链接。针对单个文件:
./rclone link B2:bucket/path/to/file.txt
https://f002.backblazeb2.com/file/bucket/path/to/file.txt?Authorization=xxxxxxxx
对目录执行则得到目录级链接:
./rclone link B2:bucket/path
https://f002.backblazeb2.com/file/bucket/path?Authorization=xxxxxxxx
授权令牌(URL 中 ?Authorization= 之后的部分)可用于该目录下任意文件路径,例如:
https://f002.backblazeb2.com/file/bucket/path/to/file1?Authorization=xxxxxxxx
https://f002.backblazeb2.com/file/bucket/path/file2?Authorization=xxxxxxxx
https://f002.backblazeb2.com/file/bucket/path/folder/file3?Authorization=xxxxxxxx
源码中的 PublicLink / getDownloadAuthorization(backend/b2/b2.go)给出了两个实用约束:
- 生成分享链接要求当前 Key 具备
shareFiles权限(hasPermission("shareFiles")),否则会报sharing a file link requires the shareFiles permission——用受限 Application Key 时要确认勾选了该能力; - 令牌有效期由
--b2-download-auth-duration控制,范围 1 秒到一周(604800 秒),默认一周;桶类型为allPrivate或snapshot时才会在链接后附加?Authorization=,公有桶则直接返回裸链接。
标准选项
以下是 b2(Backblaze B2)特有的标准选项。
--b2-account
Account ID 或 Application Key ID。
属性:
- Config:
account - Env Var:
RCLONE_B2_ACCOUNT - Type: string
- Required: true
--b2-key
Application Key。
属性:
- Config:
key - Env Var:
RCLONE_B2_KEY - Type: string
- Required: true
--b2-hard-delete
远程删除时永久删除文件,否则为隐藏(保留版本)。
属性:
- Config:
hard_delete - Env Var:
RCLONE_B2_HARD_DELETE - Type: bool
- Default: false
源码中该选项直接决定 Object.Remove 走 deleteByID(/b2_delete_file_version,永久删除指定版本)还是 hide(/b2_hide_file,生成隐藏版本)。
高级选项
以下是 b2 的高级选项。
--b2-endpoint
服务 Endpoint,通常留空。
属性:
- Config:
endpoint - Env Var:
RCLONE_B2_ENDPOINT - Type: string
- Required: false
留空时源码使用默认值 https://api.backblazeb2.com(backend/b2/b2.go 中 defaultEndpoint)。
--b2-test-mode
调试用 X-Bz-Test-Mode 请求头标志字符串。
仅用于调试。设置为以下字符串之一会让 b2 返回特定错误:
- "fail_some_uploads"
- "expire_some_account_authorization_tokens"
- "force_cap_exceeded"
这些值会写入 "X-Bz-Test-Mode" 请求头(Backblaze 集成清单文档中有所记载)。
属性:
- Config:
test_mode - Env Var:
RCLONE_B2_TEST_MODE - Type: string
- Required: false
--b2-versions
在目录列表中纳入旧版本。
注意:启用后不允许任何文件写操作,不能上传或删除文件。
属性:
- Config:
versions - Env Var:
RCLONE_B2_VERSIONS - Type: bool
- Default: false
--b2-version-at
按指定时间点显示文件版本。
注意:启用后不允许任何文件写操作,不能上传或删除文件。
属性:
- Config:
version_at - Env Var:
RCLONE_B2_VERSION_AT - Type: Time
- Default: off
--b2-upload-cutoff
切换到分块上传的阈值。大于此大小的文件按 --b2-chunk-size 分块上传。
该值不应大于 4.657 GiB(== 5 GB)。
属性:
- Config:
upload_cutoff - Env Var:
RCLONE_B2_UPLOAD_CUTOFF - Type: SizeSuffix
- Default: 200Mi
--b2-copy-cutoff
切换到 multipart 服务端复制的阈值。大于此大小且需要服务端复制的文件,将按此大小分块复制。
最小值为 0,最大值为 4.6 GiB。
属性:
- Config:
copy_cutoff - Env Var:
RCLONE_B2_COPY_CUTOFF - Type: SizeSuffix
- Default: 4Gi
--b2-chunk-size
上传分块大小。上传大文件时把文件切成该大小。
必须能装入内存。这些分块缓存在内存中,最多可能有 --transfers 个分块同时进行。
最小值为 5,000,000 字节。
属性:
- Config:
chunk_size - Env Var:
RCLONE_B2_CHUNK_SIZE - Type: SizeSuffix
- Default: 96Mi
--b2-upload-concurrency
multipart 上传的并发度,即同一文件内并行上传的分块数。
注意分块存放在内存中,最多可能有 --transfers * --b2-upload-concurrency 个分块同时驻留内存。
属性:
- Config:
upload_concurrency - Env Var:
RCLONE_B2_UPLOAD_CONCURRENCY - Type: int
- Default: 4
--b2-disable-checksum
对大于 upload cutoff 的大文件禁用 SHA1 校验和。
通常 rclone 会在上传前计算输入流的 SHA1 并写入对象元数据,这有利于数据完整性检查,但会让大文件的上传启动产生较长延迟。
属性:
- Config:
disable_checksum - Env Var:
RCLONE_B2_DISABLE_CHECKSUM - Type: bool
- Default: false
--b2-download-url
自定义下载 Endpoint。
通常设置为 Cloudflare CDN URL,因为通过 Cloudflare 网络下载的数据 Backblaze 提供免费出口流量。rclone 处理私有桶的方式是发送 "Authorization" 头;如果自定义 Endpoint 会重写认证请求(例如 Cloudflare Workers),该请求头需要被正确处理。留空则使用 Backblaze 提供的下载 Endpoint。
提供的 URL 应包含协议,且不应以斜杠结尾、也不应包含 /file/bucket 子路径——rclone 会按 {download_url}/file/{bucket_name}/{path} 请求文件。
示例:
https://mysubdomain.mydomain.tld
(结尾不带 "/",不含 "file" 与 "bucket")
属性:
- Config:
download_url - Env Var:
RCLONE_B2_DOWNLOAD_URL - Type: string
- Required: false
源码中 getOrHead 处理了两种边角情况:Cloudflare 会剥掉 Content-Length 头,此时回退使用列表阶段读到的长度;某些代理返回 S3 风格头而非原生 B2 头(无 file ID),此时回退使用列表阶段得到的对象 ID(见 backend/b2/b2.go 的注释与代码)。
--b2-download-auth-duration
rclone link 生成的公开链接授权令牌的过期时间,单位为秒或带 ms|s|m|h|d 后缀的时长。
最小值 1 秒,最大值一周。
属性:
- Config:
download_auth_duration - Env Var:
RCLONE_B2_DOWNLOAD_AUTH_DURATION - Type: Duration
- Default: 1w
--b2-lifecycle
创建桶时设置已删除文件的保留天数。
建桶时该参数用于为整个桶创建一条生命周期规则:
- 为 0(默认)时不创建规则,采用 B2 默认行为——删除与覆盖都会生成版本并无限期保留;
- 大于 0 时创建单条规则,设定文件被删除或覆盖后多少天被永久删除(即 b2 文档中的 daysFromHidingToDeleting),最小为 1 天。
同时也可以在配置中启用 hard_delete,使删除操作不再产生版本(但覆盖仍会产生版本)。
创建桶之后再修改请使用 rclone backend lifecycle 命令(见下文)。
属性:
- Config:
lifecycle - Env Var:
RCLONE_B2_LIFECYCLE - Type: int
- Default: 0
源码中 makeBucket 在 f.opt.Lifecycle > 0 时向 /b2_create_bucket 请求附带 LifecycleRules(DaysFromHidingToDeleting 即该值)。
--b2-encoding
后端文件名编码,参见 overview 编码章节。
属性:
- Config:
encoding - Env Var:
RCLONE_B2_ENCODING - Type: Encoding
- Default:
Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot
--b2-sse-customer-algorithm
使用 SSE-C 时,存储该对象所用的服务器端加密算法。
属性:
- Config:
sse_customer_algorithm - Env Var:
RCLONE_B2_SSE_CUSTOMER_ALGORITHM - Type: string
- Required: false
- 示例:
""— None"AES256"— Advanced Encryption Standard(256 位密钥长度)
--b2-sse-customer-key
使用 SSE-C 时,提供 UTF-8 兼容字符串编码的对称加密密钥用于加解密数据。
也可以改用 --sse-customer-key-base64。
属性:
- Config:
sse_customer_key - Env Var:
RCLONE_B2_SSE_CUSTOMER_KEY - Type: string
- Required: false
- 示例:
""— None
--b2-sse-customer-key-base64
使用 SSE-C 时,提供 Base64 编码的对称加密密钥用于加解密数据。
也可以改用 --sse-customer-key。
属性:
- Config:
sse_customer_key_base64 - Env Var:
RCLONE_B2_SSE_CUSTOMER_KEY_BASE64 - Type: string
- Required: false
- 示例:
""— None
--b2-sse-customer-key-md5
使用 SSE-C 时可选提供密钥的 MD5 校验值。
留空时 rclone 会根据 sse_customer_key 自动计算。
属性:
- Config:
sse_customer_key_md5 - Env Var:
RCLONE_B2_SSE_CUSTOMER_KEY_MD5 - Type: string
- Required: false
- 示例:
""— None
--b2-description
远程端描述。
属性:
- Config:
description - Env Var:
RCLONE_B2_DESCRIPTION - Type: string
- Required: false
SSE-C 的源码行为
SSE-C(Customer 提供密钥的服务器端加密)在 B2 后端的处理逻辑集中在 NewFs(backend/b2/b2.go):
sse_customer_key与sse_customer_key_base64不可同时设置,否则报错b2: can't use both sse_customer_key and sse_customer_key_base64 at the same time;- 二者给一个即可:给了 Base64 就解码,给了原文就自动 Base64 编码,统一存为
SSECustomerKeyBase64; - 未提供 MD5 时自动用
md5.Sum计算并 Base64 编码; - 之后在上传、下载(
getOrHead附加X-Bz-Server-Side-Encryption-Customer-*三个头)以及服务端复制(copy中为源与目标都填入ServerSideEncryption配置)时都会带上这套头。
后端命令(backend commands)
B2 后端提供以下专属命令,统一通过
rclone backend COMMAND remote:
方式执行,帮助信息见 rclone backend 命令。这些命令也可以通过 rc 的 backend/command 在运行中的后端上执行。
lifecycle
读取或设置桶的生命周期规则。
rclone backend lifecycle remote: [options] [<arguments>+]
显示当前生命周期规则:
rclone backend lifecycle b2:bucket
输出类似如下(展示生命周期规则):
[
{
"daysFromHidingToDeleting": 1,
"daysFromUploadingToHiding": null,
"daysFromStartingToCancelingUnfinishedLargeFiles": null,
"fileNamePrefix": ""
}
]
若无规则(默认),返回 []。
重置当前生命周期规则:
rclone backend lifecycle b2:bucket -o daysFromHidingToDeleting=30
rclone backend lifecycle b2:bucket -o daysFromUploadingToHiding=5 -o daysFromHidingToDeleting=1
执行后会打印新的生命周期规则(格式同上)。rclone 只允许为整个桶(fileNamePrefix = "")设置生命周期。
B2 无法彻底关闭版本管理,最接近的做法是把 daysFromHidingToDeleting 设为 1 天;同时在配置中启用 hard_delete 可让删除不再产生版本(覆盖仍会产生版本)。
rclone backend lifecycle b2:bucket -o daysFromHidingToDeleting=1
选项说明:
daysFromHidingToDeleting:文件隐藏多少天后删除。0 表示关闭。daysFromStartingToCancelingUnfinishedLargeFiles:多少天后取消未完成的分块上传。daysFromUploadingToHiding:文件上传后多少天被隐藏。
从源码结构看,lifecycleCommand(backend/b2/b2.go)在传了任意 -o 参数时调用 /b2_update_bucket 写回整条规则,然后统一返回 bucket.LifecycleRules——所以无论读写,命令输出都是该桶当前的规则数组。
cleanup
移除未完成的分块上传。
rclone backend cleanup remote: [options] [<arguments>+]
该命令删除 age 超过 max-age(默认 24 小时)的未完成大文件上传。
配合 --interactive/-i 或 --dry-run 可以预演它将要做什么。
rclone backend cleanup b2:bucket/path/to/object
rclone backend cleanup -o max-age=7w b2:bucket/path/to/object
时长解析与 rclone 其余部分一致:2h、7d、7w 等。
选项:
max-age:要删除的上传的最大年龄。
cleanup-hidden
移除文件的旧版本。
rclone backend cleanup-hidden remote: [options] [<arguments>+]
该命令移除所有旧的隐藏版本。
同样支持 --interactive/-i 或 --dry-run 预演。
rclone backend cleanup-hidden b2:bucket/path/to/dir
三个命令与源码函数的对应关系很直接(backend/b2/b2.go 的 Command 分发器):
| 命令 | 实现 | 行为 |
|---|---|---|
lifecycle |
lifecycleCommand |
读/写桶生命周期规则 |
cleanup |
cleanupCommand → cleanUp(false, true, maxAge) |
只删"start"标记的未完成上传且超过 max-age 的条目 |
cleanup-hidden |
cleanupHiddenCommand → cleanUp(true, false, 0) |
只删隐藏(旧)版本,当前版本保留 |
底层的 purge(dir, oldOnly, deleteHidden, deleteUnfinished, maxAge) 是统一入口:rclone cleanup(即 Fs.CleanUp)等价于 oldOnly=true 且同时开启删隐藏与删未完成上传(默认 24 小时);rclone purge 则是 oldOnly=false,当前版本、旧版本一并删除后把桶删掉。删除操作按 --transfers 的并发度从 toBeDeleted 通道并行消费,并受 --interactive / --dry-run 保护(operations.SkipDestructive)。
限制(Limitations)
rclone about 不被 B2 后端支持——源码中 Fs 并未实现 About 接口。缺少该能力的后端无法为 rclone mount 计算剩余空间,也不能作为 rclone union 远程成员使用 mfs(most free space)策略。参见 不支持 rclone about 的后端列表 与 rclone about 命令。
小结
B2 后端把 Backblaze 的原生 REST API 完整映射到了 rclone 的文件系统抽象上:Basic Auth 换令牌的 authorize_account 流程、按 bucketID 索引的上传 URL 缓存、b2_list_file_names / b2_list_file_versions 双端点列表、hex_digits_at_end 风格的 SHA1 校验,以及隐藏版本与生命周期规则体系。日常使用记住三件事即可:
- 鉴权:
account填主 Account ID 或 applicationKeyId,Application Key 必须与 applicationKeyId 配套,版本要求 ≥ 1.43; - 吞吐:
--transfers 32起步,注意--transfers × --b2-chunk-size的内存上限; - 版本治理:用
--b2-versions/--b2-version-at查看历史,用rclone backend lifecycle控制保留天数,用cleanup/cleanup-hidden精确清理旧版本与残留分块。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust4.21 K637- DDeepSeek-V4.1-FlashDeepSeek-V4.1-Flash 是一个多模态混合专家(MoE)模型,拥有 5520 亿骨干参数,并支持最多一百万 token 的上下文长度。该模型原生支持图像和文本输入,并以自回归方式生成文本Python270
cherry-studio🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端TypeScript2 K146
hello-agents📚 《从零开始构建智能体》——从零开始的智能体原理与实践教程Python46066
new-apiAI模型聚合管理中转分发系统,一个应用管理您的所有AI模型,支持将多种大模型转为统一格式调用,支持OpenAI、Claude、Gemini等格式,可供个人或者企业内部管理与分发渠道使用。🍥 A Unified AI Model Management & Distribution System. Aggregate all your LLMs into one app and access them via an OpenAI-compatible API, with native support for Claude (Messages) and Gemini formats.Go20143
JeecgBoot🔥企业级低代码平台集成了AI应用平台,帮助企业快速实现低代码开发和构建AI应用!前后端分离架构 SpringBoot,SpringCloud、Mybatis,Ant Design4、 Vue3.0、TS+vite!强大的代码生成器让前后端代码一键生成,无需写任何代码! 引领AI低代码开发模式: AI生成->OnlineCoding-> 代码生成-> 手工MERGE,显著的提高效率,又不失灵活~Java34051