rclone —— 云存储的统一 rsync

运维工具手册 03-文件与传输 6.5 KB 原文

rclone —— 云存储的统一 rsync

分类:03 文件与传输 适用:全平台,支持 70+ 存储后端(S3 / OSS / COS / MinIO / SFTP / WebDAV / Azure / GCS / OneDrive) 一句话:本地、对象存储、网盘之间用同一套命令复制、同步、校验、挂载。

1. 它解决什么问题

  • 把本地备份推到 OSS/COS/S3,还要能校验、能续传、能限速。
  • 跨云迁移几百 GB 数据,不写厂商专用脚本。
  • 把对象存储挂载成本地目录,给老程序用。
  • 定时镜像某个 bucket 到另一个 bucket。

2. 安装

# 官方脚本
curl https://rclone.org/install.sh | sudo bash

# 发行版
apt install -y rclone
dnf install -y rclone

# 版本检查,建议 1.65+
rclone version

3. 配置 remote

rclone config                # 交互式向导
rclone config file           # 查看配置文件位置(通常 ~/.config/rclone/rclone.conf)
rclone listremotes           # 列出已配置的 remote

交互流程(以 S3 兼容对象存储为例)

  1. n 新建 remote
  2. 名称,如 oss
  3. 类型选 s3(阿里云 OSS、腾讯云 COS、MinIO、七牛都兼容 S3 协议)
  4. provider 选 Other(或对应厂商)
  5. 填 access_key_id、secret_access_key
  6. endpoint 填区域地址
  7. region 按厂商要求(部分可留空)
  8. 测试通过后保存

常见后端的关键参数

后端 类型 关键配置
阿里云 OSS s3 endpoint oss-cn-hangzhou.aliyuncs.com,provider Alibaba
腾讯云 COS s3 endpoint cos.ap-guangzhou.myqcloud.com,provider TencentCOS
AWS S3 s3 provider AWS,region 必填
MinIO s3 endpoint http://10.0.0.8:9000,force_path_style = true
华为云 OBS s3 / obs endpoint obs.cn-north-4.myhuaweicloud.com
SFTP sftp host/port/user/key_file
WebDAV webdav url/user/pass

手写配置(便于批量部署):

[oss]
type = s3
provider = Alibaba
access_key_id = LTAIxxxxxxxx
secret_access_key = xxxxxxxx
endpoint = oss-cn-hangzhou.aliyuncs.com
acl = private

[minio]
type = s3
provider = Minio
access_key_id = minioadmin
secret_access_key = minioadmin
endpoint = http://10.0.0.8:9000
force_path_style = true
chmod 600 ~/.config/rclone/rclone.conf

4. 核心命令

命令 作用 是否删除目标多余文件
rclone copy 复制,目标多出来的保留 否
rclone sync 镜像,目标多余文件会被删除 是
rclone move 移动(成功后删源) 否
rclone check 校验两端一致性 —
rclone ls / lsd / lsl / lsjson 列表 —
rclone size 统计文件数与总大小 —
rclone delete 按条件删文件 —
rclone purge 清空目录(含目录本身) —
rclone mkdir / rmdir 建/删目录 —
rclone mount 挂载为本地文件系统 —
rclone bisync 双向同步 —
rclone copy /data/backup oss:mybucket/backup/           # 上传(增量)
rclone copy oss:mybucket/backup/ /data/restore/         # 下载
rclone sync /data/ oss:mybucket/data/ --dry-run         # 镜像,先试运行
rclone check /data/ oss:mybucket/data/ --size-only      # 校验
rclone size oss:mybucket/data/
rclone ls oss:mybucket/data/ | head
rclone lsd oss:mybucket/
rclone lsjson oss:mybucket/data/ --max-depth 1

5. 关键参数

-n, --dry-run              # 试运行,只打印将做什么
-P, --progress             # 实时进度
-v / -vv                   # 日志级别
--log-file=/var/log/rclone.log
--log-level=INFO

--transfers 8              # 并行传输文件数(默认 4)
--checkers 16              # 并行校验数(默认 8)
--bwlimit 10M              # 限速
--bwlimit "08:00,512k 19:00,10M"   # 分时段限速(工作时间限速)

--exclude '*.tmp'
--include '*.tar.gz'
--filter '- .git/**'
--max-age 24h              # 只传 24 小时内修改的
--min-size 1M
--max-size 10G
--exclude-if-present .nobackup   # 有此标记的目录跳过

--checksum                 # 按哈希校验(对象存储可能不支持,会退化为大小+时间)
--ignore-times             # 忽略时间,全部重传
--update                   # 跳过目标更新的文件
--backup-dir oss:mybucket/trash/$(date +%F)   # 被覆盖/删除的文件转到备份目录
--suffix .bak

--fast-list                # 用递归列表减少请求(内存换速度,超大 bucket 慎用)
--no-traverse              # 目标文件多时减少列举
--multi-thread-streams 4   # 大文件多线程分片
--s3-chunk-size 64M        # 分片大小
--s3-upload-concurrency 8

6. 实战场景

6.1 本地备份推到对象存储(带归档与限速)

#!/bin/bash
set -euo pipefail
SRC=/data/backup
DST=oss:company-backup/server01
DAY=$(date +%F)

rclone sync "$SRC/" "$DST/current/" \
  --transfers 8 --checkers 16 \
  --bwlimit "08:00,20M 20:00,100M" \
  --backup-dir "$DST/history/$DAY" \
  --log-file "/var/log/rclone-$DAY.log" \
  --log-level INFO \
  --stats 60s --stats-one-line

rclone check "$SRC/" "$DST/current/" --size-only --one-way

--backup-dir 让被覆盖和删除的文件进入历史目录,相当于软删除,比直接 sync 安全得多。

6.2 跨云迁移

# OSS → COS,服务端之间走公网
rclone copy oss:src-bucket/ cos:dst-bucket/ \
  --transfers 16 --checkers 32 \
  --fast-list --progress \
  --log-file /var/log/migrate.log

# 迁移后校验
rclone check oss:src-bucket/ cos:dst-bucket/ --size-only

数据量大时先用 --dry-run 估算:

rclone size oss:src-bucket/

6.3 只同步最近变化的文件

rclone copy /data/logs oss:bucket/logs/ --max-age 48h --transfers 8

6.4 挂载对象存储给应用读

mkdir -p /mnt/oss
rclone mount oss:mybucket /mnt/oss \
  --vfs-cache-mode writes \
  --vfs-cache-max-size 10G \
  --dir-cache-time 60s \
  --allow-other \
  --daemon

--vfs-cache-mode writes 让写操作先落本地缓存,避免对象存储不支持随机写导致失败。 卸载:fusermount -u /mnt/oss。

对象存储不适合当数据库/高并发小文件存储,mount 只用于读多写少、归档类场景。

6.5 加密备份(crypt)

rclone config    # 新建 remote,类型选 crypt
# remote 指向 oss:mybucket/encrypted
# 设置 password(务必保存好,丢失无法恢复)

rclone copy /data/backup secure:server01/ --progress
# 落盘是加密的,本地文件名也被加密

6.6 挂到 cron

# /etc/cron.d/rclone-backup
0 2 * * * root /usr/local/bin/rclone-backup.sh >> /var/log/rclone-cron.log 2>&1

cron 环境变量少,脚本里写全路径,或用 --config /root/.config/rclone/rclone.conf。

7. 常见坑

  1. sync 会删目标文件:本地目录挂载失败/为空时执行 sync,会把云端清空。永远先 --dry-run,并配 --backup-dir。
  2. 对象存储没有真正的目录:rclone delete 与 purge 行为不同,purge 连前缀一起删。
  3. 时间精度问题:S3 兼容存储的 mtime 精度可能是秒或毫秒,导致反复重传,用 --size-only 或 --checksum。
  4. --checksum 在对象存储上可能失效:分片上传的 ETag 不是 MD5,会退化为大小比较。
  5. --fast-list 吃内存:百万级对象可能占用数 GB,小内存机器别开。
  6. --transfers 开太大反而慢:受带宽与厂商限流影响,8~16 通常够,先小后大。
  7. 限速单位:--bwlimit 10M 是 10 MiB/s,不是 Mbit/s。
  8. 配置权限:rclone.conf 含密钥,必须 600,别提交到 git。
  9. Windows 路径:rclone copy D:\data remote:path,反斜杠与盘符要小心转义。
  10. mount 需要 FUSE:容器/精简系统要装 fuse3,并可能需要 --allow-other(需 user_allow_other)。
  11. bisync 不是万能的:首次要 --resync,冲突处理规则要提前定,生产慎用。
  12. 删除保护:给 bucket 开版本控制或合规保留,sync 误删还能找回。

8. 速查表

rclone config                                   # 配置向导
rclone listremotes
rclone lsd remote:                              # 列目录
rclone ls remote:path | head
rclone size remote:path
rclone copy SRC DST -P                          # 复制(增量,不删)
rclone sync SRC DST --dry-run                   # 镜像(先试运行)
rclone sync SRC DST -P --backup-dir remote:trash/$(date +%F)
rclone check SRC DST --size-only
rclone move SRC DST
rclone delete remote:path --min-size 100M
rclone purge remote:path                        # ⚠️ 清空
rclone mount remote:path /mnt/x --vfs-cache-mode writes --daemon
rclone copy SRC DST --max-age 24h --bwlimit 10M --transfers 8
rclone copy SRC DST --exclude '*.tmp' --include '*.tar.gz'
rclone —— 云存储的统一 rsync - 知识库 - 起航社区