关于 Rclone

Rclone是一个命令行程序,用于管理云存储上的文件。它是云服务商网页存储界面的功能丰富的替代品。超过40种云存储产品支持rclone,包括S3对象存储、企业和消费者文件存储服务,以及标准传输协议。

Rclone具有强大的云存储等效程序,类似于Unix命令rsync、cp、mv、mount、ls、ncdu、tree、rm和cat。Rclone的语法非常熟悉,并支持shell管道和–dry-run保护。它可以通过命令行、脚本或其API使用。

用户称 rclone 为“云存储的瑞士军刀”和“难以分辨的魔术技术”。

Rclone真正关注您的数据,始终保留时间戳并验证校验和。在带宽受限、断断续续的连接或受配额限制的情况下,可以从上次成功传输的文件重新开始传输。您可以检查文件的完整性。在可能的情况下,rclone使用服务器端传输来最小化本地带宽使用率,并在不使用本地磁盘的情况下将文件从一个提供商传输到另一个提供商。

虚拟后端将本地和云文件系统包装起来,应用加密、压缩、块处理、哈希和合并。

Rclone将任何本地、云或虚拟文件系统挂载为磁盘,适用于Windows、macOS、Linux和FreeBSD,并通过SFTP、HTTP、WebDAV、FTP和DLNA提供服务。

Rclone是成熟的开源软件,最初受rsync启发并使用Go编写。友好的支持社区熟悉各种用例。官方的Ubuntu、Debian、Fedora、Brew和Chocolatey存储库中包括rclone。建议从rclone.org下载最新版本。

Rclone在Linux、Windows和Mac上被广泛使用。第三方开发人员使用rclone命令行或API创建创新的备份、恢复、GUI和业务流程解决方案。

Rclone负责与云存储进行通信,为您节省大量工作。

以上内容翻译自 rclone 官网:https://rclone.org
本文要做的工作是:Ubuntu系统下利用Rclone(配合Alist)将网盘挂载成本地磁盘

关于Alist:https://alist.nn.ci

其实 Alist 就是一个图形界面版的 Rclone,相当于是各家网盘客户端的一个汇总。
项目非常优秀,社区活跃。

这是我部署的一个版本:https://alist.cuffs.cf

前置步骤

按 Alist 文档,安装并成功挂载网盘。

安装 Rclone

Linux 环境下执行以下脚本安装 Rclone。

sudo -v ; curl https://rclone.org/install.sh | sudo bash

执行 rclone --version 命令来查看是否安装成功。能够正确显示版本信息就表示成功了。

root@22-12-28-0417:~# rclone --version
rclone v1.62.2
- os/version: ubuntu 20.04 (64 bit)
- os/kernel: 5.15.0-1021-oracle (aarch64)
- os/type: linux
- os/arch: arm64 (ARMv8 compatible)
- go/version: go1.20.2
- go/linking: static
- go/tags: none

Rclone 挂载 WebDav

以下是我的挂载过程:

root@22-12-28-0417:~# rclone config
2023/06/01 12:26:24 NOTICE: Config file "/root/.config/rclone/rclone.conf" not found - using defaults
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n

Enter name for new remote.
name> dav

Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
 1 / 1Fichier
   \ (fichier)
 2 / Akamai NetStorage
   \ (netstorage)
 3 / Alias for an existing remote
   \ (alias)
 4 / Amazon Drive
   \ (amazon cloud drive)
 5 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, China Mobile, Cloudflare, ArvanCloud, DigitalOcean, Dreamhost, Huawei OBS, IBM COS, IDrive e2, IONOS Cloud, Liara, Lyve Cloud, Minio, Netease, RackCorp, Scaleway, SeaweedFS, StackPath, Storj, Tencent COS, Qiniu and Wasabi
   \ (s3)
 6 / Backblaze B2
   \ (b2)
 7 / Better checksums for other remotes
   \ (hasher)
 8 / Box
   \ (box)
 9 / Cache a remote
   \ (cache)
10 / Citrix Sharefile
   \ (sharefile)
11 / Combine several remotes into one
   \ (combine)
12 / Compress a remote
   \ (compress)
13 / Dropbox
   \ (dropbox)
14 / Encrypt/Decrypt a remote
   \ (crypt)
15 / Enterprise File Fabric
   \ (filefabric)
16 / FTP
   \ (ftp)
17 / Google Cloud Storage (this is not Google Drive)
   \ (google cloud storage)
18 / Google Drive
   \ (drive)
19 / Google Photos
   \ (google photos)
20 / HTTP
   \ (http)
21 / Hadoop distributed file system
   \ (hdfs)
22 / HiDrive
   \ (hidrive)
23 / In memory object storage system.
   \ (memory)
24 / Internet Archive
   \ (internetarchive)
25 / Jottacloud
   \ (jottacloud)
26 / Koofr, Digi Storage and other Koofr-compatible storage providers
   \ (koofr)
27 / Local Disk
   \ (local)
28 / Mail.ru Cloud
   \ (mailru)
29 / Mega
   \ (mega)
30 / Microsoft Azure Blob Storage
   \ (azureblob)
31 / Microsoft OneDrive
   \ (onedrive)
32 / OpenDrive
   \ (opendrive)
33 / OpenStack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ (swift)
34 / Oracle Cloud Infrastructure Object Storage
   \ (oracleobjectstorage)
35 / Pcloud
   \ (pcloud)
36 / Put.io
   \ (putio)
37 / QingCloud Object Storage
   \ (qingstor)
38 / SMB / CIFS
   \ (smb)
39 / SSH/SFTP
   \ (sftp)
40 / Sia Decentralized Cloud
   \ (sia)
41 / Storj Decentralized Cloud Storage
   \ (storj)
42 / Sugarsync
   \ (sugarsync)
43 / Transparently chunk/split large files
   \ (chunker)
44 / Union merges the contents of several upstream fs
   \ (union)
45 / Uptobox
   \ (uptobox)
46 / WebDAV
   \ (webdav)
47 / Yandex Disk
   \ (yandex)
48 / Zoho
   \ (zoho)
49 / premiumize.me
   \ (premiumizeme)
50 / seafile
   \ (seafile)
Storage> 46

Option url.
URL of http host to connect to.
E.g. https://example.com.
Enter a value.
url> http://127.0.0.1:5244/dav

Option vendor.
Name of the WebDAV site/service/software you are using.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
 1 / Nextcloud
   \ (nextcloud)
 2 / Owncloud
   \ (owncloud)
 3 / Sharepoint Online, authenticated by Microsoft account
   \ (sharepoint)
 4 / Sharepoint with NTLM authentication, usually self-hosted or on-premises
   \ (sharepoint-ntlm)
 5 / Other site/service or software
   \ (other)
vendor> 5

Option user.
User name.
In case NTLM authentication is used, the username should be in the format 'Domain\User'.
Enter a value. Press Enter to leave empty.
user> dijk

Option pass.
Password.
Choose an alternative below. Press Enter for the default (n).
y) Yes, type in my own password
g) Generate random password
n) No, leave this optional password blank (default)
y/g/n> y
Enter the password:
password:
Confirm the password:
password:

Option bearer_token.
Bearer token instead of user/pass (e.g. a Macaroon).
Enter a value. Press Enter to leave empty.
bearer_token> 

Edit advanced config?
y) Yes
n) No (default)
y/n> 

Configuration complete.
Options:
- type: webdav
- url: http://127.0.0.1:5244/dav
- vendor: other
- user: dijk
- pass: *** ENCRYPTED ***
Keep this "dav" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> 

Current remotes:

Name                 Type
====                 ====
dav                  webdav

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q
  • 没看懂?下面进入逐条解析。
  1. 输入命令 rclone config 命令,首先它会 Notice 你它要创建一个配置文件,然后给了你三个选项。这里选择第一个,输入n创建新的远程存储。然后它提示你为这个远程存储输入个名字,自己起个名字就好。

  1. 接下来让你选择要添加哪种类型的远程存储,给你列了一个长长…的菜单,选项数高达50个。在这里输入 WebDav 的序号。

  1. 如图

  1. 接下来输入 WebDav 服务的用户名和密码。

  1. 接下来的东西不用理,连续3个回车,退出就好。

  • 测试是否挂载成功。

执行命令 rclone lsd dav:/ --max-depth 1 观察结果是否和 Alist 网页上根目录一致。

关于这个命令,rclone lsd 表示列出目录,然后是 远程存储名:路径名 ,对应我这里是 dav:/--max-depth 1 表示最多显示 1 层目录结构。

挂载远程存储到本地

使用 rclone mount 命令将远程存储挂载到本地。

rclone mount remote:path /path/to/mountpoint [flags]

这个命令有许多选项,参考官方文档:https://rclone.org/commands/rclone_mount/#options

中文翻译版本如下:

  • --allow-non-empty: 允许挂载到非空目录上(不支持Windows)。
  • --allow-other: 允许其他用户访问文件系统(不支持Windows)。
  • --allow-root: 允许root用户访问文件系统(不支持Windows)。
  • --async-read: 使用异步读取(不支持Windows)(默认 true)。
  • --attr-timeout Duration: 缓存文件/目录属性的时间(默认为 1s)。
  • --daemon: 在后台运行mount并退出父进程。如果希望监控输出,可以使用 --log-file 和 --log-format=pid,…来跟踪。(不支持Windows)
  • --daemon-timeout Duration: rclone响应内核的时间限制(不支持Windows)(默认为0s)。
  • --daemon-wait Duration: 等待守护进程准备好挂载的时间。在Linux上是最大等待时间,在OSX/BSD上则是常量睡眠时间。(不支持Windows)(默认为 1m0s)。
  • --debug-fuse: 调试FUSE内部代码,需要 -v。
  • --default-permissions: 让内核根据文件模式执行权限控制(不支持Windows)。
  • --devname string: 设置设备名称,默认为 remote:path。
  • --dir-cache-time Duration: 目录项缓存在缓存中的时间(默认为5m0s)。
  • --dir-perms FileMode: 目录权限 (默认为 0777)。
  • --file-perms FileMode: 文件权限 (默认为 0666)。
  • --fuse-flag stringArray: 直接传递给 libfuse/WinFsp 的标志或参数(如有必要,请重复)。
  • --gid uint32: 覆盖文件系统设置的 gid 字段(不支持Windows)(默认为 1000)。
  • -h, --help: 获取有关mount选项的帮助信息。
  • --max-read-ahead SizeSuffix: 预取顺序读取的字节数(不支持Windows)(默认为128Ki)。
  • --network-mode: 将文件系统视为远程网络驱动器,而不是固定磁盘驱动器(仅支持 Windows)。
  • --no-checksum: 在上传/下载时不进行校验和比较。
  • --no-modtime: 不读写修改时间(可以加速处理)。
  • --no-seek: 不允许在文件中搜索。
  • --noappledouble: 忽略 Apple Double(._) 和 .DS_Store 文件(仅支持OSX)(默认为true)。
  • --noapplexattr: 忽略所有 “com.apple.*” 扩展属性(仅支持OSX)。
  • -o, --option stringArray: 传递给 libfuse/WinFsp 的选项(如有必要,请重复)。
  • --poll-interval Duration: 轮询变更之间等待的时间,必须小于 dir-cache-time 并仅适用于支持的远程文件系统(设置为 0 可禁用)(默认为 1m0s)。
  • --read-only: 仅允许只读访问。
  • --uid uint32: 覆盖文件系统设置的 uid 字段(不支持Windows)(默认为1000)。
  • --umask int: 覆盖文件系统设置的权限位(不支持Windows)(默认为2)。
  • --vfs-cache-max-age Duration: 缓存中对象的最大年龄(默认为1h0m0s)。
  • --vfs-cache-max-size SizeSuffix : 缓存中所有对象的最大总大小(默认为 off)。
  • --vfs-cache-mode CacheMode: 缓存状态off|minimal|writes|full (默认为 off)。
  • --vfs-cache-poll-interval Duration: 轮询缓存的间隔时间,查找陈旧的对象(默认为1m0s)。
  • --vfs-case-insensitive: 如果找不到文件名,则查找其大小写不敏感的匹配项。
  • --vfs-disk-space-total-size SizeSuffix: 指定磁盘的总空间大小(默认为 off)。
  • --vfs-fast-fingerprint: 使用快速(不太准确)指纹来进行更改检测。
  • --vfs-read-ahead SizeSuffix: 在使用 cache-mode 为 full 时,额外预读取比 --buffer-size 大的字节。
  • --vfs-read-chunk-size SizeSuffix: 按块读取原始文件(默认为 128 Mi)。
  • --vfs-read-chunk-size-limit SizeSuffix: 如果大于 --vfs-read-chunk-size,在每个块读取之后将块大小加倍,直到达到限制 (“off” 表示无限制)(默认为 off)。
  • --vfs-read-wait Duration: 在寻求之前等待连续的读取时间 (默认为 20ms)。
  • --vfs-used-is-size rclone size: 使用rclone大小算法计算已使用空间。
  • --vfs-write-back Duration: 当使用 cache 时,在最后一次使用之后写回文件的时间(默认为5s)。
  • --vfs-write-wait Duration: 在顺序写入之前等待的时间(默认为1s)。
  • --volname string: 设置卷名称(仅支持 Windows 和 OSX)。
  1. 首先创建两个目录
mkdir /webdav_cache /webdav
  1. 安装 fuse 软件包
sudo apt install fuse3
  1. 挂载 dav 存储到本地
rclone mount dav:/ /webdav --cache-dir /webdav_cache --allow-other --vfs-cache-mode writes --allow-non-empty --daemon &

挂载完成后,就可以切换到 /webdav 目录下访问文件了。

开机自动挂载

你可以使用 systemd 服务来实现系统启动时自动挂载 webdav 目录。

下面是如何创建一个 systemd 服务:

  1. 打开终端并以 root 用户身份登录。

  2. 创建一个名为 rclone-webdav.service 的新 systemd 服务文件,命令如下:

sudo vim /etc/systemd/system/rclone-webdav.service
  1. 在打开的文件中,添加以下配置信息:
[Unit]
Description=Mount WebDAV directory using rclone
After=network-online.target
   
[Service]
User=root
Type=simple
ExecStart=/usr/bin/rclone mount dav:/ /webdav --cache-dir /webdav_cache --allow-other --vfs-cache-mode writes --allow-non-empty
   
[Install]
WantedBy=multi-user.target
  1. 保存并关闭文件。

  2. 更新 systemd 配置并启用新创建的服务,命令如下:

sudo systemctl daemon-reload
sudo systemctl enable rclone-webdav.service
  1. 最后,重启系统或运行以下命令启动该服务:
sudo systemctl start rclone-webdav.service

现在,rclone 将在系统启动时自动执行并挂载你的 webdav 目录。要确认服务是否正在运行,请使用以下命令检查其状态:

systemctl status rclone-webdav.service

Windows 下 Rclone 挂载 WebDav

2024-01-28 更新:

用 Ubuntu 用习惯了,写这篇博客的时候竟然没有说明大前提是 Ubuntu 系统。

现在补充 Windows 下 Rclone 挂载 WebDav 的方法。

  1. 下载Rclone

  2. 将Rclone添加到PATH环境变量

    • 右键点击此电脑 => 属性 => 高级系统设置

    • 环境变量 => Path => 编辑 => 新建 => 添加 rclone.exe的路径

  3. windows 下挂载本地磁盘依赖于 Winfsp,需要下载安装 Winfsp

  4. 在 windows 命令行使用 rclone 挂载 webdav,这里和 Linux 上没有区别。

  5. 将 webdav 挂载为本地磁盘。参考执行下面的命令。

    rclone.exe mount webdav:/ R: --vfs-cache-mode writes --cache-dir D:/webdav_cache
  6. 开机自动挂载

最后一步是我摸索了很长时间,目的就是想找一种优雅的自动挂载方法。

一开始的思路是使用windows的计划任务,开机自动执行 rclone,windows 定时任务怎么设置可以参考这篇文章。

https://dijk.eu.org/posts/auto-login-campus-network/

但是我尝试了几次,每次确实能够执行 rclone 程序,但是在资源管理器中还是看不到远程磁盘。

后来查到了这篇博客:https://mailberry.com.cn/2023/11/use-rclone-on-windows10-alist-webdav/

这里使用 RcloneBrowser,感觉友好但不够优雅,需要一直开启 RcloneBrowser。

类似地,还看到了 https://zhuanlan.zhihu.com/p/539980226 我没有完全尝试他的方法,我只是写了个脚本来执行rclone.exe mount webdav:/ R: --vfs-cache-mode writes --cache-dir D:/webdav_cache,但这样的话,如果退出了终端,rclone进程也被杀死了。

我还尝试过使用 nssm 来创建一个服务,但也莫名奇妙没有实现自动挂载。

… …

最后的最后,折腾了这么久,让我感觉到人生苦短啊!

Life is short?

那我用Python吧,

首先下载和安装Python,注意检查环境变量。

编写脚本,我这里叫做 rclone_mount.py ,cmd 根据实际情况修改。

#! pythonw
import subprocess

def run_rclone():
    cmd = 'rclone.exe mount webdav:/ R: --vfs-cache-mode writes --cache-dir D:/webdav_cache'
    subprocess.Popen(cmd, shell=True)

if __name__ == '__main__':
    run_rclone()

现在,只需要在命令行中执行 pythonw rclone_mount.py ,即使终端退出了,rclone 进程还是在后台运行着的。

然后,写一个bat脚本,内容为

pythonw 的路径加上 rclone_mount.py 的路径,例如:

C:\Python312\pythonw.exe C:\System-Scripts\rclone_mount.py

将此 bat 脚本复制到 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

此时,重启电脑,会看到一闪而过的windows cmd 命令行,webdav 就被挂载到本地磁盘了。