使用 rclone 对接 Mail.ru Cloud:账号配置、哈希秒传优化与运维完整指南
【免费下载链接】rclone"rsync for cloud storage" - Google Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Wasabi, Google Cloud Storage, Azure Blob, Azure Files, Yandex Files项目地址: https://gitcode.com/GitHub_Trending/rc/rclone
Mail.ru Cloud 是俄罗斯互联网公司 Mail.Ru Group 推出的云存储服务,rclone 自 v1.50 起通过mailru后端对其提供完整支持。本文以 docs/content/mailru.md 官方文档为主体,结合 backend/mailru/ 目录下的实际源码,为你完整讲解「应用专用密码」的正确获取方式、交互式配置流程、MailruHash 哈希算法与「按哈希秒传」(speedup)优化原理、回收站清理、配额查询及全部可调参数,读完即可把 Mail.ru Cloud 作为rsync for cloud storage的一员无缝接入自己的同步体系。
Mail.ru Cloud 后端能力一览
根据文档描述,rclone 的mailru后端具备如下特性:
- 路径深度无限制:例如
remote:directory/subdirectory这样的多层路径可正常使用; - 文件带修改时间、目录不带:文件的
last modified time属性精度可达 1 秒,目录没有该属性(因此会显示为 "Jan 1 1970"); - 删除即进回收站:删除的文件默认被移动到云端回收站而非直接物理删除;
- 支持公开链接分享:文件与目录可通过公网链接共享;
- 上传前必须知晓文件大小:不支持部分上传(partial uploads)或流式上传,因此诸如流媒体直传等场景无法使用;
- 免费账号单文件上限 2G,付费账号不限;
- 存储端对全部文件维护哈希并做透明去重:哈希算法是经过改良的 SHA1(下文 MailruHash 一节详述);
- 支持“按哈希秒传”:若某个文件已存在于 Mail.ru 云端(含所有用户账户),本地只需提交文件哈希即可完成“上传”,无需真实传输数据——这一优化在 rclone 中被原生支持,即下文介绍的 speedup 特性。
从源码看,该后端的注册入口位于 backend/mailru/mailru.go#L80-L82,其中通过fs.Register注册了名为mailru(描述为 "Mail.ru Cloud")的后端,同时用hash.RegisterHash("mailru", "MailruHash", 40, mrhash.New)注册了专属哈希类型MailruHash(40 位十六进制字符,对应 20 字节 SHA1 摘要)。
前置准备:注册账号并生成「应用专用密码」
官方文档特别强调了一个最容易踩坑的点:rclone 无法使用你的普通登录密码,否则会报类似oauth2: server response missing access_token的错误。原因是该后端走 OAuth2 流程(见 backend/mailru/api/m1.go#L13-L14 中定义的OAuthURL = "https://o2.mail.ru/token"与OAuthClientID = "cloud-win"),而应用专用密码是客户端换取令牌的凭证。
按文档指引,你需要先在 cloud.mail.ru 注册账号并选择套餐(tariff),然后为 rclone 单独创建一个应用专用密码:
- 点击页面右上角的用户图标;
- 进入「安全 / Пароль и безопасность」;
- 找到「外部应用密码 / Пароли для внешних приложений」并点击创建;
- 为密码命名,例如
rclone; - 选择权限级别(关键):文档明确说明,仅勾选 "Full access to Cloud"(WebDav)目前无法让 rclone 正常工作,必须选择"Full access to Mail, Cloud and Calendar"(即全部协议 all protocols)这一档权限;
- 复制生成的密码——在 rclone 中填入该密码,普通登录密码一律无效。
该后端配置过程不需要本地浏览器参与授权,属于纯用户名/密码式 OAuth 换取流程。从 backend/mailru/mailru.go#L71-L77 可以看到其 OAuth 配置:ClientID固定为cloud-win,认证与令牌端点均指向https://o2.mail.ru/token,且采用oauth2.AuthStyleInParams(参数内传凭据)。
交互式创建 remote:rclone config 全流程
运行rclone config即可进入交互式配置向导,核心步骤与官方文档给出的典型会话一致:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> remote Type of storage to configure. Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value [snip] XX / Mail.ru Cloud \ "mailru" [snip] Storage> mailru User name (usually email) Enter a string value. Press Enter for the default (""). user> username@mail.ru Password This must be an app password - rclone will not work with your normal password. See the Configuration section in the docs for how to make an app password. y) Yes type in my own password g) Generate random password y/g> y Enter the password: password: Confirm the password: password: Skip full upload if there is another file with same data hash. This feature is called "speedup" or "put by hash". It is especially efficient in case of generally available files like popular books, video or audio clips [snip] Enter a boolean value (true or false). Press Enter for the default ("true"). 1 / Enable \ "true" 2 / Disable \ "false" speedup_enable> 1 Edit advanced config? (y/n) y) Yes n) No y/n> n Remote config Configuration complete. Options: - type: mailru - user: username@mail.ru - pass: *** ENCRYPTED *** - speedup_enable: true Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y需要说明的配置细节:
- user字段通常是完整邮箱地址(如
username@mail.ru); - pass字段必须填写上一步生成的应用专用密码。若打算用非交互方式(脚本化)配置,可先用
rclone obscure对密码进行混淆后再写入配置文件,因为文档注明该字段输入必须经过 obscure 处理; - speedup_enable(秒传开关)默认即为
true,建议保持开启,除非你的源文件多为独有或已加密内容。
创建完成后,即可像使用其他云端一样使用该 remote,例如:
# 查看顶层目录 rclone lsd remote: # 新建目录 rclone mkdir remote:directory # 列出目录内容 rclone ls remote:directory # 将本地目录同步到远端(删除目标端多余文件,--interactive 会在删除前征询确认) rclone sync --interactive /home/local/directory remote:directoryMailruHash:改良版 SHA1 哈希算法
Mail.ru Cloud 为所有文件维护哈希并用于存储端透明去重。这个哈希算法在 backend/mailru/mrhash/mrhash.go 中有完整实现,其规则由包注释与代码共同给出:
- 小文件(≤ 20 字节):哈希即文件数据本身右补零(zero-padded)至 20 字节。代码见 backend/mailru/mrhash/mrhash.go#L65-L71:当累计写入字节数
total <= Size(即 20)时,直接拷贝原始内容到 20 字节数组并补零输出; - 大文件:哈希值为「文件数据」加上「文件长度的十进制字符串表示」拼接后整体做 SHA1 的摘要,见 backend/mailru/mrhash/mrhash.go#L72-L80(
endString := strconv.Itoa(d.total)后再写入 SHA1); - 初始化种子:
Reset()会先向 SHA1 内部写入字符串"mrCloud"作为起始种子,见 backend/mailru/mrhash/mrhash.go#L94-L99,这是它与标准 SHA1 不同(即“改良”)的关键所在; - 输出长度:最终输出 20 字节摘要,经十六进制编码后为 40 个字符,这也对应 backend/mailru/mailru.go#L81 中注册哈希时的长度参数
40。
后端在比较或校验文件时会使用MailruHash这个哈希类型;对应测试可参考 backend/mailru/mrhash/mrhash_test.go。
在文档的 “Modification times and hashes” 一节中说明的是同一逻辑,但刻意省略了mrCloud种子这一实现细节,这里通过源码将其补全。
speedup:按哈希秒传的实现与参数调优
Mail.ru 云端对已存在的文件支持「按哈希登记即上传完成」——服务端会在所有 Mail.ru 用户的全部账户中按哈希检索文件。因此,对于热门的书籍、视频、音频等普遍存在的内容,rclone 只需提前算出源文件哈希并提交,即可跳过数据本体传输。
触发条件(eligibleForSpeedup)
从 backend/mailru/mailru.go#L1743-L1768 的实现看,一个文件要进入秒传流程必须同时满足:
- 全局开关
SpeedupEnable为真; - 文件大小处于合理区间:必须大于20 字节(等于哈希块大小),大于等于
speedupMinSize = 512字节(小于平均网络包大小的数据秒传不划算,见 backend/mailru/mailru.go#L57),并且小于SpeedupMaxDisk阈值; - 文件名匹配
speedupGlobs(由SpeedupPatterns解析而来,若为*则全部尝试,见 backend/mailru/mailru.go#L1771-L1790); - rclone 能预先得知文件大小——流式或部分上传场景因无法预知大小,会直接跳过该优化。
三级哈希计算路径
rclone 会依据文件大小选择不同的提前哈希策略(见 backend/mailru/mailru.go#L1629-L1691):
- 小文件直接在内存中计算哈希(受
speedup_max_memory约束); - 更大的文件先以本地文件为源直接计算;
- 更大的文件会把数据先写入**临时磁盘缓冲(spool)**再计算,避免耗尽内存;
- 任一环节秒传失败都会自动回退为普通完整上传(
trySpeedup = false)。
相关参数速查
| 参数(flag) | 类型 | 默认值 | 作用 |
|---|---|---|---|
--mailru-speedup-enable | bool | true | 全局开关,是否尝试按哈希秒传 |
--mailru-speedup-file-patterns | string | "*.mkv,*.avi,*.mp4,*.mp3,*.zip,*.gz,*.rar,*.pdf" | 参与秒传的文件名通配模式(逗号分隔、不区分大小写,支持*与?)。置空""完全禁用;设"*"全部尝试;也可只保留音视频或归档/PDF 子集 |
--mailru-speedup-max-disk | SizeSuffix | 3Gi | 超过该大小的文件不再尝试秒传(提前哈希会消耗本地磁盘/内存)。设0完全禁用秒传;设1G表示大于 1GB 直接普通上传 |
--mailru-speedup-max-memory | SizeSuffix | 32Mi | 大于该值的文件将始终在磁盘上做哈希,用于限制哈希阶段占用的 RAM。设0则哈希一律走临时磁盘;设256M表示最多可让哈希占用 256MB 内存 |
这些参数的配置定义位于 backend/mailru/mailru.go#L102-L173,与文档中 “Advanced options” 一节完全一致。值得一提的是:当源文件为独有内容或加密内容时,秒传必然不命中,等于白耗一次哈希计算,此时可考虑直接关闭以省去本地哈希开销。
清空回收站:释放被占用的配额
Mail.ru Cloud 中删除文件/目录实际上只是移入回收站——回收站对 rclone 不可见(在网页端才看得到),且其中的文件仍然占用账户总配额。文档给出的清理方式是:
rclone cleanup remote:该命令不接受任何路径参数,会一次性永久删除该账号回收站内的全部文件。其底层实现可参见 backend/mailru/mailru.go#L1512-L1549:它携带access_token与账号邮箱信息向/api/m1/trashbin/empty发起 POST 请求,并依据响应状态码(200视为成功)返回结果。
配额查看:rclone about
用rclone about remote:即可查看当前账号的空间配额与已用量。实现上对应 backend/mailru/mailru.go#L1552-L1581,该命令请求/api/m1/user,并从响应的Body.Cloud.Space.BytesTotal与BytesUsed字段分别解析出总量与已用量——与 Mail.ru 网页端「云空间」数值一致。
标准与高级参数全表
mailru后端除前面介绍的速度相关参数外,还包含下列可配置项(全部注册逻辑见 backend/mailru/mailru.go#L86-L216):
标准选项
| 参数 | 配置键 / 环境变量 | 必填 | 说明 |
|---|---|---|---|
--mailru-client-id | client_id/RCLONE_MAILRU_CLIENT_ID | 否 | OAuth Client Id,通常留空即可(后端内置默认cloud-win) |
--mailru-client-secret | client_secret/RCLONE_MAILRU_CLIENT_SECRET | 否 | OAuth Client Secret,通常留空 |
--mailru-user | user/RCLONE_MAILRU_USER | 是 | 用户名,通常为邮箱 |
--mailru-pass | pass/RCLONE_MAILRU_PASS | 是 | 应用专用密码;必须使用rclone obscure处理后再写入,普通密码无效 |
--mailru-speedup-enable | speedup_enable/RCLONE_MAILRU_SPEEDUP_ENABLE | 否 | 是否启用按哈希秒传,默认true |
高级选项
| 参数 | 配置键 / 环境变量 | 默认值 | 说明 |
|---|---|---|---|
--mailru-token | token/RCLONE_MAILRU_TOKEN | - | OAuth Access Token 的 JSON blob,正常由流程自动生成 |
--mailru-auth-url | auth_url/RCLONE_MAILRU_AUTH_URL | - | 认证服务器地址,留空使用提供商默认值 |
--mailru-token-url | token_url/RCLONE_MAILRU_TOKEN_URL | - | 令牌服务器地址,留空使用提供商默认值 |
--mailru-client-credentials | client_credentials/RCLONE_MAILRU_CLIENT_CREDENTIALS | false | 是否使用 RFC 6749 定义的 OAuth2 Client Credentials 流程(并非所有后端都支持) |
--mailru-speedup-file-patterns | speedup_file_patterns | 见上文 | 参与秒传的文件名模式 |
--mailru-speedup-max-disk | speedup_max_disk | 3Gi | 秒传的最大文件尺寸门槛 |
--mailru-speedup-max-memory | speedup_max_memory | 32Mi | 内存哈希的尺寸上限 |
--mailru-check-hash | check_hash/RCLONE_MAILRU_CHECK_HASH | true | 复制时发现校验和不匹配或无效时:true报错失败,false忽略并继续 |
--mailru-encoding | encoding/RCLONE_MAILRU_ENCODING | 见下 | 文件名编码策略 |
--mailru-description | description/RCLONE_MAILRU_DESCRIPTION | - | remote 的描述信息 |
受限字符与 encoding
除 overview 中描述的默认受限字符集外,Mail.ru 后端还会替换以下字符(替换为对应的全角字符):
| 字符 | 值 | 替换为 |
|---|---|---|
" | 0x22 | " |
* | 0x2A | * |
: | 0x3A | : |
< | 0x3C | < |
> | 0x3E | > |
? | 0x3F | ? |
\ | 0x5C | \ |
\| | 0x7C | | |
同时,非法 UTF-8 字节也会被替换——因为它们无法存在于 JSON 字符串中。以上限制在源码中的落点即--mailru-encoding的默认值:
Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Del,Ctl,InvalidUtf8,Dot对应 backend/mailru/mailru.go#L207-L215 中的encoder.Display | EncodeWin | EncodeBackSlash | EncodeInvalidUtf8组合。
已知限制
- 单文件大小上限取决于账号:免费账号单文件最大 2GB,付费套餐不限;账户的总上传量上限请以 Mail.ru 官网公布为准;
- 大小写不敏感:Mail.ru Cloud 不区分文件名大小写,因此同一目录下不能同时存在
Hello.doc与hello.doc,否则会冲突。
如果你希望进一步从代码层验证上述行为,可重点翻阅 backend/mailru/mailru.go(后端注册、选项定义、Put/秒传与 CleanUp/About 实现)、backend/mailru/mrhash/mrhash.go(哈希算法)与对应的测试文件 backend/mailru/mailru_test.go。
【免费下载链接】rclone"rsync for cloud storage" - Google Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Wasabi, Google Cloud Storage, Azure Blob, Azure Files, Yandex Files项目地址: https://gitcode.com/GitHub_Trending/rc/rclone
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考