【乐享】使用Rclone挂载OneDrive或OSS并实现开机自动挂载
Last updated on June 25, 2024 am
前提概要
我在搭建Navidrome那篇文章中提及挂载OneDrive,但是我试了网上的好几种方法,最后总结出这篇精华版,敬请欣赏。还有,精华中的精华在天坑板块,可以看看。
实现原理
rclone可以将云存储挂载为一个FUSE文件系统的本地硬盘,然后就可以实现本机程序的读写。除了使用rclone之外,还有其他实现方法,比如Github这个项目,也是使用FUSE,但是我的系统版本太老(CentOS7),且更新很麻烦,就失败了。所以最后还是使用rclone。
注意事项
- rclone和ossfs不能共存,所以使用ossfs挂载了oss存储的同学需要先卸载ossfs,然后用rclone挂载,方法类似,下文会有提及
- rclone的性能配置比较重要,不然很容易将服务器卡死,我的小小阿里云就是每天晚上,甚至下午不定时宕机,很影响
业务使用。
下文同样会提及不同的性能设置。但是,我的一个宗旨是,如果业务量不大,或者向我这样只是个人使用的话,设置得越少越好。
安装
注意,如果你打算将rclone部署在远程服务器上,请在你自己的电脑上也安装rclone的相同版本,后面会提及。
Linux
安装软件一向是Linux里面及其方便的事情,命令如下:
Redhet系(CentOS/RHEL/Fedora/RockyLinux):
1 |
|
Debian系(Debian/Ubuntu/Linux Mint/Pop!_OS):
1 |
|
macOS
建议使用brew安装,类似Linux上的包管理器(其实就是包管理器)
1 |
|
Windows及其他系统
去rclone官网下载安装,应该都会罢😜
https://rclone.org/downloads/
注意,涉及到Windows的环境适配,可以看挂载OSS这一部分,里面有方法。
配置
安装完成后,运行命令(当然是用root用户)
1 |
|
输出:
1 |
|
输入n,进入下一步,输入挂载远程的名字,比如rc
,然后选择存储类型。不同版本rclone的列表可能不太一样,比如我这个版本的是这样的:
1 |
|
下面进行分情况讨论😀。
注意不要无脑回车!
OneDrive
找到OneDrive,我这里是26,输入并回车。
client_id&secret_id
后面的client_id和secret_id全部留空。这两个数据在配置cloudreve的OneDrive需要用到,但是rclone不需要:
1 |
|
OneDrive地域
然后选择OneDrive的地域,一般都是第一个global。如果你买的是其它地域的版本,你应该会知道,选择对应的区域即可。国际版,输入1,回车:
1 |
|
高级选项
配置高级设置?算了,能看到这篇文章的在运维方面基本上不是很专业(包括我),我们就不折腾高级选项了。直接回车:
1 |
|
授权rclone使用OneDrive
不要无脑回车!
这里要注意,如果你的rclone部署在服务器或远程机器,输入n;如果你是在自己的电脑上部署,并且装有浏览器(我觉得不会有人的电脑连浏览器都不会装吧),就输入y。大部分人是部署在服务器上的(应该吧),输入n,回车,输出如下:
1 |
|
在你手上安装有rclone的电脑上输入命令rclone authorize "onedrive"
,接着应该会弹出浏览器,登陆你的OneDrive账号(如果你是E5白嫖版就登陆分配了OneDrive空间的账号,如果是教育版就登陆学校给你或者你自己买的账号),然后允许访问
接着你就有你的token代码了。千万不要泄露这一串代码!拥有这一串代码的任何人都可以直接访问你的文件,然后把图中选中的部分拷贝到服务器端:
继续下一步
选择OneDrive类型和位置
一般来说选择个人或商业版,无论你是E5白嫖还是教育版或者是家庭版拼车亦或是真的买了Microsoft 365个人版😅
1 |
|
输入1,回车,下一步,选择位置,一般都只有一个:
1 |
|
(6个星号是手动打码😝)
输入0,回车,下一步
确认信息
基本上都是对的,这时终于可以无脑回车两下了。
1 |
|
然后输入q,回车,退出rclone设定。
OSS
阿里云官方文档有教程,懒得去找的可以看下面,我帮你拷过来了
主要特点
- Rclone支持文件同步、文件传输、加密、挂载等。
- Rclone支持多种系统,能让您将存储空间挂载到本地文件系统中,并通过多种协议提供服务。
关于Rclone的介绍,请参见Rclone。
操作步骤
在Windows操作系统下,通过Rclone挂载存储空间的步骤如下:
- 下载并按照页面指引安装Winfsp。
以下载winfsp-1.12.22339版本为例。下载地址,请参见Winfsp。 - 下载Rclone工具。
以下载rclone-v1.60.1-windows-amd64版本为例。Rclone是一个命令行程序,下载后,只需解压到本地任意目录即可,此处以解压到D:\Rclone目录为例。 - 配置Rclone。
- 将D:\Rclone添加到环境变量。
- 打开命令行窗口,输入rclone –version,然后按下Enter。
返回rclone v1.60.1,表明Rclone已成功安装。
- 打开命令行窗口,输入rclone –version,然后按下Enter。
- 输入rclone config命令,然后按下Enter。
- 输入n,按下Enter,然后新建new remote。
以new remote命名为test-remote为例。
- 输入n,按下Enter,然后新建new remote。
- 输入磁盘名称,例如oss-disk,然后按下Enter。
- 选择包含Amazon S3 Compliant Storage的选项,即输入5,然后按下Enter。
- 选择包含Alibaba Cloud Object Storage System (OSS)的选项,即输入2,然后按下Enter。
- 执行到env_auth>,按下Enter。
- 执行到access_key_id>,输入OSS的访问密钥AccessKey ID,然后按下Enter。
- 执行到secret_access_key> ,输入OSS的访问密钥AccessKey Secret,然后按下Enter。
- 执行到endpoint>,输入访问OSS的endpoint,然后按下Enter。
- 以访问华东1(杭州)外网为例,endpoint填写为oss-cn-hangzhou.aliyuncs.com。如果是ECS上的Windows环境,您可以使用oss-cn-hangzhou-internal.aliyuncs.com的内网endpoint。
- 执行到acl>,选择Object读写权限。
该选项仅对新上传的Object有效。您可以根据实际需求选择合适的读写权限。此处以选择default(私有权限)为例,即输入1,然后按下Enter。
- 执行到acl>,选择Object读写权限。
- 执行到storage_class>,选择Object的存储类型。
此处以选择default(继承Bucket存储类型)为例,即输入1,然后按下Enter。
- 执行到storage_class>,选择Object的存储类型。
- 执行到Edit advanced config? (y/n) ,输入n,然后按下Enter。
- 输入q,完成所有配置。
至于挂载,你可以用阿里云官方给的命令,这是Windows版返回The service rclone has been started信息,或者啥也没输出,表示挂载成功。此时,您还可以查看到examplebucket(E:)的磁盘。1
rclone mount oss-disk:/examplebucket E: --cache-dir D:\disk-cache --vfs-cache-mode writes
也可以看下文我给出的命令及解释。
- 输入q,完成所有配置。
挂载
基本
先瞥一眼所有的rclone远程,如我的是这样的:
1 |
|
Windows版挂载看上面阿里云的版本,但下面的表格有注意事项需要看一看。Linux及macOS的话先要在本地新建一个文件夹作为本地挂载位置,比如说我的是/home/stephenzeng/Music
,然后命令如下:
1 |
|
现在来解释一下各个量。
上面的示例 | 含义 |
---|---|
OneDrive | 挂载远程的名字 |
/Music | 挂载云存储的位置,比如我的音乐全部放在OneDrive里Music文件夹下,就是这个 |
/home/stephenzeng/Music | 本地挂载的位置,cd到这里你就可以看到你的云存储的文件 |
–allow-other | 允许其他用户访问。如果使用rclone挂载的云空间的程序不是用root运行的,就要加上。比如我的Navidrome是用stephenzeng这个用户运行的 |
–allow-non-empty | 允许挂载到本地非空目录上,加不加都无所谓。注意,Windows不支持,所以不能加 |
–buffer-size | 设置每个文件最大占用的内存空间,单位为M,G等 |
有关–vfs的量下文有。
同理,如果输出The service rclone has been started信息,或者啥也没输出,表示挂载成功。可以cd到对应本地挂载目录看看是否正常,然后进入下一步。
VFS技术
这里会出现问题。这时rclone的一种缓存技术,可以先让云存储的文件缓存在本地以实现更加高效的读写。不过据我使用下来,挂载OneDrive的时候使用VFS(Full mode)会导致OneDrive文件无法正常显示,我不知道是不是网络的问题。而在挂载OSS时使用VFS,在缓存更新时会因为小文件过多而占用大量硬盘资源导致服务器死机(就是ping得通但是所有web服务都无法访问),特别是像阿里云这样还™限制硬盘IO的。
如果你想试试的话,可以去看看rclone官网,我把关键部分用GPT-4翻译在下面了。不想看的同学右边有分段标签,可以跳过。
VFS - 虚拟文件系统
此命令使用 VFS 层。这将 rclone 使用的云存储对象适配成更像磁盘文件系统的东西。
云存储对象有许多与磁盘文件不同的属性——你不能扩展它们或写入它们的中间部分,因此 VFS 层需要处理这些问题。由于没有一种正确的方法来处理这些问题,因此下面解释了各种选项。
VFS 层还实现了目录缓存——这会将有关文件和目录的信息(但不是数据)缓存到内存中。
VFS 目录缓存
使用 --dir-cache-time
标志,你可以控制一个目录在被认为是最新且不从后端刷新之前的时间。通过 VFS 进行的更改将立即出现或使缓存失效。
1 |
|
然而,通过 web 界面或不同的 rclone 副本直接在云存储上进行的更改,只有在目录缓存到期后才会被拾取,如果配置的后端不支持轮询更改。如果后端支持轮询,更改将在轮询间隔内被拾取。
你可以向 rclone 发送 SIGHUP
信号以刷新所有目录缓存,无论它们有多旧。假设只有一个 rclone 实例在运行,你可以这样重置缓存:
1 |
|
如果你使用 远程控制 配置 rclone,那么你可以使用 rclone rc 来刷新整个目录缓存:
1 |
|
或单个文件或目录:
1 |
|
VFS 文件缓冲
--buffer-size
标志决定了用于提前缓冲数据的内存量。
每个打开的文件将尝试始终在内存中保留指定量的数据。缓冲的数据绑定到一个打开的文件,不会共享。
此标志是每个打开文件使用的内存的上限。缓冲区只会为已下载但尚未读取的数据使用内存。如果缓冲区为空,则只会使用少量内存。
rclone 用于缓冲的最大内存量可以达到 --buffer-size * 打开的文件数
。
VFS 文件缓存
这些标志控制 VFS 文件缓存选项。文件缓存是使 VFS 层看起来与普通文件系统兼容所必需的。可以禁用它,但会牺牲一些兼容性。
例如,如果你想同时读写一个文件,你需要启用 VFS 缓存。详见下文。
注意,VFS 缓存与缓存后端是分开的,你可能会发现你需要其中一个或两个。
1 |
|
如果使用 -vv
运行,rclone 将打印文件缓存的位置。文件存储在用户缓存文件区域,这取决于操作系统,但可以通过 --cache-dir
或设置适当的环境变量进行控制。
缓存有 4 种不同的模式,通过 --vfs-cache-mode
选择。缓存模式越高,rclone 的兼容性越高,但会使用更多的磁盘空间。
注意,文件只有在关闭且在 --vfs-write-back
秒内未被访问时才会回写到远程。如果 rclone 在有未上传的文件时退出或崩溃,这些文件将在下次使用相同标志运行 rclone 时上传。
如果使用 --vfs-cache-max-size
或 --vfs-cache-min-free-size
,请注意缓存可能会超过这些配额,原因有二。首先,因为它仅在每次 --vfs-cache-poll-interval
检查一次。其次,因为打开的文件不能从缓存中驱逐。当 --vfs-cache-max-size
或 --vfs-cache-min-free-size
超过时,rclone 将尝试首先从缓存中驱逐最少访问的文件。rclone 将从最长时间未访问的文件开始。此缓存清理策略是高效的,更相关的文件可能会保持缓存状态。
--vfs-cache-max-age
将在设定的时间经过后从缓存中驱逐文件。默认值为 1 小时,将开始驱逐缓存中已 1 小时未访问的文件。当访问缓存文件时,1 小时计时器将重置为 0,并将在 1 小时后再次驱逐。使用标准符号指定时间,s、m、h、d、w。
你不应该运行两个使用相同 VFS 缓存且具有相同或重叠远程的 rclone 副本,如果使用 --vfs-cache-mode > off
。如果这样做,可能会导致数据损坏。你可以通过给每个 rclone 自己的缓存层次结构使用 --cache-dir
来解决这个问题。如果使用的远程不重叠,则不需要担心这个问题。
–vfs-cache-mode off
在此模式下(默认模式),缓存将直接从远程读取并直接写入远程,而不会在磁盘上缓存任何内容。
这将意味着某些操作是不可能的
- 文件不能同时打开进行读取和写入
- 打开进行写入的文件不能被寻址
- 打开进行写入的现有文件必须设置 O_TRUNC
- 使用 O_TRUNC 打开进行读取的文件将被打开为只写
- 仅打开进行写入的文件将表现得好像提供了 O_TRUNC
- 忽略打开模式 O_APPEND、O_TRUNC
- 如果上传失败,无法重试
–vfs-cache-mode minimal
这与“off”非常相似,除了同时打开进行读取和写入的文件将缓冲到磁盘。这意味着打开进行写入的文件将更加兼容,但使用最少的磁盘空间。
这些操作是不可能的
- 仅打开进行写入的文件不能被寻址
- 打开进行写入的现有文件必须设置 O_TRUNC
- 仅打开进行写入的文件将忽略 O_APPEND、O_TRUNC
- 如果上传失败,无法重试
–vfs-cache-mode writes
在此模式下,打开进行读取的文件仍然直接从远程读取,打开进行写入和读写的文件首先缓冲到磁盘。
此模式应支持所有正常的文件系统操作。
如果上传失败,将以指数递增的间隔重试,最长可达 1 分钟。
–vfs-cache-mode full
在此模式下,所有读取和写入都缓冲到磁盘并从磁盘读取。当从远程读取数据时,这也会缓冲到磁盘。
在此模式下,缓存中的文件将是稀疏文件,rclone 将跟踪已下载的文件部分。
因此,如果应用程序仅读取每个文件的开头部分,则 rclone 只会缓冲文件的开头部分。这些文件在缓存中将显示为其完整大小,但它们将是仅包含已下载数据的稀疏文件。
此模式应支持所有正常的文件系统操作,其他方面与 --vfs-cache-mode writes
相同。
读取文件时,rclone 将提前读取 --buffer-size
加上 --vfs-read-ahead
字节。--buffer-size
缓存在内存中,而 --vfs-read-ahead
缓存在磁盘上。
使用此模式时,建议不要将 --buffer-size
设置得太大,并根据需要将 --vfs-read-ahead
设置得大一些。
重要 并非所有文件系统都支持稀疏文件。特别是 FAT/exFAT 不支持。如果缓存目录位于不支持稀疏文件的文件系统上,rclone 的性能会非常差,并且如果检测到这样的文件系统,它将记录一条错误消息。
指纹识别
VFS 的各个部分使用指纹识别来查看本地文件副本是否相对于远程文件发生了变化。指纹由以下部分组成:
- 大小
- 修改时间
- 哈希值
在对象上可用时。
在某些后端上,读取这些属性中的一些是缓慢的(它们每个对象需要额外的 API 调用,或每个对象需要额外的工作)。
例如,hash
在 local
和 sftp
后端上很慢,因为它们必须读取整个文件并对其进行哈希处理,而 modtime
在 s3
、swift
、ftp
和 qinqstor
后端上很慢,因为它们需要进行额外的 API 调用来获取它。
如果你使用 --vfs-fast-fingerprint
标志,那么 rclone 将不会在指纹中包含这些慢操作。这使得指纹识别不那么准确,但速度更快,并将改善缓存文件的打开时间。
如果你在 local
、s3
或 swift
后端上运行 vfs 缓存,那么建议使用此标志。
注意,如果你更改此标志的值,缓存中文件的指纹可能会失效,并且需要重新下载这些文件。
VFS 分块读取
当 rclone 从远程读取文件时,它会以块的形式读取它们。这意味着 rclone 不是请求整个文件,而是读取指定的块。这可以通过仅请求实际读取的远程块来减少某些远程的下载配额使用,但代价是增加了请求数量。
这些标志控制分块:
1 |
|
rclone 将开始读取大小为 --vfs-read-chunk-size
的块,然后每次读取时加倍块的大小。当 --vfs-read-chunk-size-limit
被指定且大于 --vfs-read-chunk-size
时,每个打开的文件的块大小将仅加倍直到达到指定值。如果值为“off”,即默认值,则禁用限制,块大小将无限增长。
使用 --vfs-read-chunk-size 100M
和 --vfs-read-chunk-size-limit 0
,将下载以下部分:0-100M、100M-200M、200M-300M、300M-400M 等。
当指定 --vfs-read-chunk-size-limit 500M
时,结果将是 0-100M、100M-300M、300M-700M、700M-1200M、1200M-1700M 等。
将 --vfs-read-chunk-size
设置为 0
或“off”将禁用分块读取。
VFS 性能
这些标志可用于启用/禁用 VFS 的功能,以提高性能或出于其他原因。另见 分块读取 功能。
特别是 S3 和 Swift 从 --no-modtime
标志(或使用 --use-server-modtime
以获得略有不同的效果)中受益匪浅,因为每次读取修改时间都需要一个事务。
1 |
|
有时 rclone 会收到乱序的读取或写入请求。rclone 将等待短时间以获取顺序读取或写入,而不是进行寻址。这些标志仅在不使用磁盘缓存文件时生效。
1 |
|
使用 VFS 写缓存(--vfs-cache-mode
值为 writes 或 full)时,可以设置全局标志 --transfers
以调整从缓存并行上传修改文件的数量(相关的全局标志 --checkers
对 VFS 没有影响)。
1 |
|
VFS 大小写敏感性
Linux 文件系统是大小写敏感的:两个文件可以仅通过大小写区分,打开文件时必须使用确切的大小写。
现代 Windows 的文件系统不区分大小写但保留大小写:虽然可以使用任何大小写打开现有文件,但创建文件时使用的确切大小写会被保留,并且可供程序查询。同一目录中的两个文件不允许仅通过大小写区分。
通常,macOS 上的文件系统是不区分大小写的。可以使 macOS 文件系统区分大小写,但这不是默认设置。
--vfs-case-insensitive
VFS 标志控制 rclone 如何处理这两种情况。如果其值为“false”,rclone 将按原样将文件名传递给远程。如果标志为“true”(或在命令行中出现而没有值),rclone 可能会执行如下所述的“修正”。
用户可以指定一个文件名来打开/删除/重命名等,该文件名的大小写与存储在远程上的不同。如果参数引用了一个具有完全相同名称的现有文件,则将使用磁盘上现有文件的大小写。然而,如果找不到完全相同名称的文件,但存在仅通过大小写区分的名称,rclone 将透明地修正名称。此修正仅在请求现有文件时发生。rclone 创建的新文件名的大小写敏感性由底层远程控制。
注意,运行 rclone 的操作系统(目标)的大小写敏感性可能与 rclone 提供的文件系统(源)的大小写敏感性不同。该标志控制是否执行“修正”以满足目标。
如果在命令行中未提供该标志,则其默认值取决于运行 rclone 的操作系统:在 Windows 和 macOS 上为“true”,否则为“false”。如果提供了该标志但没有值,则为“true”。
--no-unicode-normalization
标志控制是否对名称不同但在 Unicode 方面 规范等价 的文件名执行类似的“修正”。Unicode 规范化对 macOS 用户特别有帮助,因为 macOS 更喜欢使用 NFD 形式,而大多数其他平台使用 NFC。因此,强烈建议在 macOS 上保持 false
的默认值,以避免编码兼容性问题。
在应用大小写和 Unicode 规范化后,如果目录中存在多个重复文件名,--vfs-block-norm-dupes
标志允许隐藏这些重复项。这会带来性能权衡,因为 rclone 将不得不在列出目录时扫描整个目录以查找重复项。因此,如果不需要,建议禁用此功能。然而,macOS 用户可能希望考虑使用它,否则,如果远程目录包含 NFC 和 NFD 版本的相同文件名,将会出现一个奇怪的情况:挂载中将显示两个版本的文件,并且两个版本都似乎可以编辑,但实际上编辑任一版本只会导致 NFD 版本在底层被编辑。--vfs-block-norm-dupes
通过检测此场景、隐藏重复项并记录错误来防止这种混乱,类似于 rclone sync
中的处理方式。
VFS 磁盘选项
此标志允许你手动设置有关文件系统的统计信息。当这些统计信息无法自动正确读取时,它可能很有用。
1 |
|
设置开机自启 & 自动刷新
原理很简单,创建一个系统级服务,然后设置为开机自启就好了。进入/etc/system/systemd
这个目录,创建一个service文件,假如命名为onedrive.service
,文件内容如下
1 |
|
其中,ExecStart=
后面是你的执行命令,这里要使用应用的绝对路径,默认情况下rclone的绝对路径就是/usr/bin/rclone
,你也可以通过如下命令which rclone
查看,输出的就是绝对路径。这个文件模板也可用作其他命令的自启动,需要更改的项大概只有Description
和User
。然后刷新系统服务,开启并设置为开机自启动,顺便附上systemctl的常见用法。
1 |
|
另外,OneDrive需要定期刷新,否则登陆token会很容易失效,特别是长时间不使用的情况下。刷新也很简单,定期ls一下就好了。比如我是在宝塔里设定每小时进行刷新,计划事件如下:
最后试着重启一下,看看行不行。
天坑
- 一定注意要看看有无其他的挂载类软件已经占用了文件,否则rclone可能会于它产生冲突而造成资源占用过高,严重时会像我这样每天晚上服务器都要宕机。这是我这里的罪魁祸首
davfs2
,这还是我问GPT才发现的。 - 基于rclone占用的内存不是一般的大,经常把服务器的swap全部用完还不够,特别是音乐多的情况下,所以我在onedrive.service里面加了内存控制,规定rclone占用到400MB的时候就开始节约用内存,到1GB的时候就强制退出重启rclone。每次重启都可以将已经占用的内存释放,就挺好。另外,rclone也只是在navidrome扫库的时候,也就是半夜12:00差不多,因此平时是没事的
尾声
至此,你的云存储应该就已经挂载到本地了。有任何疑问可以在下面评论区说说,我会定期来看。