首页
/ rclone settier 命令深度指南:云端对象存储分层与归档分级实战

rclone settier 命令深度指南:云端对象存储分层与归档分级实战

2026-09-07 12:38:00作者:江焘钦

导读

本文围绕 rclone 的 settier 命令,系统讲解如何在远程对象存储上调整对象的存储层级(Storage Class / Tier),覆盖其适用场景、命令语法、底层执行链路与各后端(如 AWS S3、Azure Blob、Oracle Object Storage 等)的差异化实现。读完本文,你将掌握用单条命令批量把云端对象降级到冷存储或归档层、在需要时重新热化的完整方案,并理解 rclone 在源码层面如何探测后端能力、遍历目录并把 tier 请求下发到不同云厂商 API。

settier 命令是什么

rclone settier 用于在远程存储上更改对象的存储层级(storage tier / storage class),前提是目标后端支持多级存储。不少云存储服务在单个对象上提供不同的存储等级,例如:

  • AWS S3 与 Glacier:标准存储(STANDARD)、低频访问(STANDARD_IA)、Glacier 归档等;
  • Azure Blob Storage:Hot、Cool、Archive 等多级访问层;
  • Google Cloud Storage:Regional Storage、Nearline、Coldline 等。

该命令自 rclone v1.44 版本引入,官方描述为 "Changes storage class/tier of objects in remote.",其对应源码位于 cmd/settier/settier.go,完整的自动生成文档为 docs/content/commands/rclone_settier.md

重要前提:改层后对象可能无法立即访问

需要注意,某些 tier 变更会让对象暂时无法直接访问:

  • Azure Blob 归档(Archive)层会把对象置于"冻结"状态,需要先把 tier 改回 Hot/Cool 才能恢复访问(即解冻/再水合 rehydrate);
  • S3 迁移到 Glacier 后,对象也会处于不可直接访问的状态。

所以在做批量降级/归档前,务必评估这些对象后续是否仍需要被立即读取。

命令语法与三种典型用法

settier 的命令形态非常简洁:

rclone settier tier remote:path [flags]

其中 tier 是目标存储层名称(具体取值取决于后端,例如 S3 的 GLACIER、Azure 的 Cool),remote:path 是待操作对象的远程路径。settier 本身仅接受这两个位置参数(源码中通过 cmd.CheckArgs(2, 2, command, args) 校验),同时命令还保留了一个本地选项:

  -h, --help   help for settier

用法一:对单个对象改层

rclone settier Cool remote:path/file

remote:path/file 这一个对象改为 Cool 层。实现上,该调用会进入单文件直达路径 operations.SetTierFile,对文件对象直接调用其 SetTier

用法二:配合 rclone 过滤器只处理特定文件

rclone --include "*.txt" settier Hot remote:path/dir

结合 rclone 的过滤体系,可以在一次遍历中只对匹配 *.txt 的文件执行改层,适合"只归档日志、只热化文档"这类按文件名分类的操作。注意过滤器选项需放在子命令之前。

用法三:整目录批量改层

rclone settier tier remote:path/dir

直接给出目录,rclone 会遍历该目录(含子目录)并把其中所有文件逐层处理,例如对一个大目录整体迁移到归档层以节省存储成本。

后端能力探测:为什么有些远程会直接报错

并非所有后端都支持分层。settier 在运行前会做一次能力探测,核心代码位于 cmd/settier/settier.goRun 中:

isSupported := fsrc.Features().SetTier
if !isSupported {
    return fmt.Errorf("remote %s does not support settier", fsrc.Name())
}
return operations.SetTier(context.Background(), fsrc, tier)

即:先读取远程的功能特性标志 Features().SetTier,若为 false 则直接报错 "remote ... does not support settier",不会发起任何请求。该标志定义在 fs/features.go 中的 Feature flags 结构体里(注释为 "allows set tier functionality on objects")。

从源码检索可以确认,在 backend 目录下声明 SetTier: true 的存储后端包括:

此外,一些包装型(wrapper)后端也会把 SetTier 能力透传下去(当底层对象实现了对应接口时),包括 archivecombinecompresscrypthasherunion(分别见各自 backend 目录下的特性声明)。这类后端并不代表"新增"分层能力,而是将上层的 settier 请求转发给被包装的底层远程。因此对加密层(crypt)、压缩层(compress)或 union 等远程使用 settier 是可行的,只要其最终落盘的底层后端支持。

从接口设计看,rclone 在 fs/types.go 中为对象定义了可选的 fs.SetTierer 接口(SetTier(tier string) error)以及配套的 fs.GetTiererGetTier() string),任何实现了该接口的对象即可参与改层操作。

底层执行链路:目录遍历与逐对象下发

当入参是目录时,命令会进入 fs/operations/operations.goSetTier

func SetTier(ctx context.Context, fsrc fs.Fs, tier string) error {
    return ListFn(ctx, fsrc, func(o fs.Object) {
        objImpl, ok := o.(fs.SetTierer)
        if !ok {
            fs.Errorf(fsrc, "Remote object does not implement SetTier")
            return
        }
        err := objImpl.SetTier(tier)
        if err != nil {
            fs.Errorf(fsrc, "Failed to do SetTier, %v", err)
        }
    })
}

可见其执行模型是:

  1. 通过 ListFn 递归列出目标目录下的所有对象(目录参数会触发递归遍历);
  2. 对每个对象做一次类型断言,检查它是否实现了 fs.SetTierer
  3. 调用该对象的 SetTier(tier) 发起真实的云端请求;
  4. 单个对象失败不会中断整体流程,而是记录错误日志后继续处理其余对象。

同一文件中还提供了面向单文件的 SetTierFile 实现,差别在于它在对象未实现 SetTierer 接口时会直接返回 error,而非仅打日志。

后端实现差异:S3 与 Azure Blob 的改层原理

AWS S3:服务端复制副本并替换存储类

S3 后端的 SetTier 实现位于 backend/s3/s3.go。它先把传入的 tier 统一转为大写(tier = strings.ToUpper(tier)),然后构造一次携带 StorageClass 的服务端 CopyObject 请求,对对象自身发起同桶同名复制(即 copy-in-place),利用 MetadataDirectiveCopy 保留原元数据,最终把对象副本落到新的存储类上,成功后同步更新本地缓存的对象 storageClass。也就是说,S3 上"改层"在底层是一次元数据级别的复制操作,因此复制权限(copy 权限)是执行成功的必要条件。

Azure Blob:原生 Set Blob Tier API

Azure Blob 后端的 SetTier 位于 backend/azureblob/azureblob.go,流程更直接:

  1. 先用 validateAccessTier 校验传入 tier 是否为 Azure 支持的值(不合法直接报错,例如 tier %s not supported by Azure Blob Storage);
  2. 与对象当前层比较,若已处于目标层则直接返回(幂等,避免无效请求);
  3. 调用 Azure SDK 的 blb.SetTier,并把 RehydratePriority 设为 Standard;
  4. 请求通过 pacer 进行限速与失败重试(shouldRetry);
  5. 成功后同步本地 accessTier 缓存并输出 Debug 日志。

因此 Azure 上把 Archive 对象重新置为 Hot/Cool,实际上触发的就是带再水合优先级的解冻过程。

其他后端

Oracle Object Storage、以及 S3 兼容生态中的众多服务商,同样通过各自 API 支持分层;对不同提供商,settier 支持的 tier 名称清单以该服务商配置中声明的存储类为准(对 S3 类而言对应各 provider 的 YAML 配置)。

实践注意事项

  • 归档有成本与延迟代价:降级到 Archive/Glacier 类冷层通常能降低存储账单,但对象会冻结或不可直接访问,需要再次改层触发解冻/再水合后才能读取,请按业务访问频率设计分层策略。
  • 大小写处理因后端而异:S3 实现中 tier 会被强制大写后再调用 API;而 Azure 的校验逻辑按后端定义的合法值匹配,因此传入 tier 前应查阅目标后端文档确认合法取值(如 Azure 的 Hot/Cool/Archive 对应字母大小写)。
  • 先确认后端能力:如果远程不支持分层,命令会立即返回形如 remote xxx does not support settier 的错误,不会有任何云端改动。
  • 支持组合包装远程:crypt、compress、union、combine、hasher、archive 等包装后端会透传能力,适合加密层/归档文件上的批量改层场景。
  • 本地选项有限,全局选项请另查:settier 自身只有 -h/--help,其余通用全局选项(如 --include/--exclude 过滤器、--dry-run、日志级别等)参见 rclone 全局 flags 文档

相关命令与延伸阅读

settier 与对象存储生命周期管理密切相关。若需查看存储类/tier 读取能力(GetTier),可在支持的分层后端上通过其他 rclone 输出命令观察对象属性;而完整的命令族、全局 flags 与各后端能力矩阵,可继续阅读 rclone 命令总览文档

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.76 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
860
1.35 K
docsdocs
暂无描述
Markdown
899
5.83 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
925
1.85 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.84 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
533
601
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.03 K
525
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.37 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
395