介绍一下rclone

rclone是一款开源的基于命令行的同步和备份工具,它支持将本地文件系统与远程云存储服务(如Google Drive、OneDrive、Dropbox等)连接起来,实现文件的上传、下载、同步和备份。它不仅支持云存储服务,还可以连接FTP、SFTP、WebDAV等各种类型的存储服务。具有丰富的功能和高度可定制化的选项,例如文件加密、数据压缩、多线程传输等。

安装

rclone就是一个可执行文件,参见官方安装文档

配置

在windows下运行.\rclone.exe config,生成的配置文件会在%APPDATA%/rclone/rclone.conf,一个配置文件示例:

1
2
3
4
5
6
[alist]
type = webdav
url = http://localhost:5244/dav/
vendor = other
user = admin
pass = tScRc3AI1CV-5QUCAb2Ed2gos-ZB-7mT

在linux的话,生成的配置文件在~/.config/rclone/rclone.conf

可使用listremotes来查看添加的远程目录:

1
2
> rclone listremotes
alist:

也可以使用命令行参数–config来指定配置文件:rclone listremotes --config ./config/rclone.conf

使用docker

在当前目录创建一个config目录,将rclone.conf放到这个目录下。

再创建一个test目录用来测试。

最后运行:

1
docker run --network host --rm -v "$(pwd)/config:/config/rclone" -v "$(pwd)/test:/test" rclone/rclone copy alist:/test /test -v

同步

最主要的命令就是copysync,它们的作用都是将源目录同步到目标目录,区别在于copy不会删除目标目录中的文件,而sync会删除目标目录中的文件。

1
./rclone copy alist:/test ./test

不论是copy还是sync,都会在传输文件前根据文件修改日期、大小和checksum来判断是否有变动,避免无谓的传输。

实时同步

rclone mount虽然可以用来双向同步,但相比sync/copy它远远更不可靠。原因是sync/copy会有失败后重试机制,而mount是没有的。

所以如果对可靠性有要求,最好还是自己使用crontab来定时运行sync/copy,crontab的用法可以参考这篇博文:在docker里使用cron

挂载

在使用Jellyfin时,需要将远程源挂载为本地文件夹,Jellyfin才能使用。需要用到rclone mount命令。

挂载后,对文件的修改是会双向同步的,但会有很大的延迟(可能与缓存有关)。可使用–read-only进行只读挂载,在只读挂载模式下,对文件的修改会静默失败

VFS 虚拟文件系统

在使用rclone mount命令时,会使用VFS层。

缓存

默认是关闭缓存的,这样访问远程会极慢,所以在使用mount时要开启缓存。

比较关键的参数就两个:

1
2
--vfs-cache-mode CacheMode             Cache mode off|minimal|writes|full (default off)
--vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)

通常会设置为--vfs-cache-mode full --vfs-cache-max-size 1G

windows

安装

在windows下要使用挂载功能,需要安装WinFsp。它创建了一个模拟FUSE层,rclone通过cgofuse使用这个层。

在windows下,可以使用--network-mode参数来挂载成网络位置。

1
rclone mount alist:/test X: --network-mode --vfs-cache-mode full --vfs-cache-max-size 1G

出错

使用docker进行mount,需要加上--device /dev/fuse --cap-add SYS_ADMIN --security-opt apparmor:unconfined参数。
但不知道为何,容器对/test的修改没有同步给宿主。
留个坑吧。

1
docker run --network host --rm -v "$(pwd)/config:/config/rclone" -v "$(pwd)/test:/test:shared" --privileged --device /dev/fuse --cap-add SYS_ADMIN --security-opt apparmor:unconfined rclone/rclone mount alist:/test /test/mount --vfs-cache-mode full --vfs-cache-max-size 1G -vv

常用高级选项

长求总:

1
rclone copy alist:/test ./test --timeout 60m --transfers 2 --buffer-size 256M --use-mmap -v

timeout 超时

rclone默认是5分钟超时,在传输大文件时很容易超时,所以一般会指定一个更长的超时时间:

1
rclone copy alist:/test ./test --timeout 60m

transfers 并行传输文件数

rclone默认是4个文件并行传输。并行数越多,速度会越快,但对带宽和远程存储服务的响应速度也要求越高。通常错误率也会随之提高。

如果使用的远程存储服务响应较快,可以把这个值设置得大一些,比如自建的WebDAV、阿里云盘Open。
如果使用的远程存储服务是国内的抠门网盘,像115、百度等,可以设得小一点,比如2。如果使用高并行数,文件传输错误率会非常高。

1
rclone copy alist:/test ./test --transfers 2

buffer-size 缓存大小

为了加速文件传输,可以使用缓存。注意这个缓存是每一个transfer都会使用一份。

rclone默认是不使用缓存来减少内存使用量,如果内存不紧张,建议给个256M,rclone默认的文件分段大小就是256M。

搭配use-mmap来增加缓存释放的积极性,否则在上传超大文件夹时容易爆内存。

1
rclone copy alist:/test ./test --buffer-size 256M --use-mmap

输出详细日志

使用-v来输出详细日志,-vv变身唠叨狂魔。

HTTP头

有些远程源需要设置HTTP头。

比如阿里云盘,它会根据Referer头来判断是否跨域,如果从阿里云盘上拉取文件,需要加上--header "Referer:"参数:

1
rclone mount alist:/aliyun/resource ./resource --cache-dir ./cache --vfs-cache-mode full --vfs-cache-max-size 1G --header "Referer:"