rclone —— 云存储的统一 rsync
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 兼容对象存储为例)
n新建 remote- 名称,如
oss - 类型选
s3(阿里云 OSS、腾讯云 COS、MinIO、七牛都兼容 S3 协议) - provider 选
Other(或对应厂商) - 填
access_key_id、secret_access_key endpoint填区域地址region按厂商要求(部分可留空)- 测试通过后保存
常见后端的关键参数
| 后端 | 类型 | 关键配置 |
|---|---|---|
| 阿里云 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. 常见坑
sync会删目标文件:本地目录挂载失败/为空时执行sync,会把云端清空。永远先--dry-run,并配--backup-dir。- 对象存储没有真正的目录:
rclone delete与purge行为不同,purge连前缀一起删。 - 时间精度问题:S3 兼容存储的 mtime 精度可能是秒或毫秒,导致反复重传,用
--size-only或--checksum。 --checksum在对象存储上可能失效:分片上传的 ETag 不是 MD5,会退化为大小比较。--fast-list吃内存:百万级对象可能占用数 GB,小内存机器别开。--transfers开太大反而慢:受带宽与厂商限流影响,8~16 通常够,先小后大。- 限速单位:
--bwlimit 10M是 10 MiB/s,不是 Mbit/s。 - 配置权限:
rclone.conf含密钥,必须 600,别提交到 git。 - Windows 路径:
rclone copy D:\data remote:path,反斜杠与盘符要小心转义。 mount需要 FUSE:容器/精简系统要装fuse3,并可能需要--allow-other(需user_allow_other)。bisync不是万能的:首次要--resync,冲突处理规则要提前定,生产慎用。- 删除保护:给 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'