WebDAV 协议与网盘的本地挂载
WebDAV 协议
更加详细的内容可以参考 WebDAV 官方网站
WebDAV 是什么
WebDAV 的全称是 Web-based Distributed Authoring and Versioning(基于 Web 的分布式创作和版本控制)。
WebDAV 是一种协议。更具体地说,它是 HTTP/1.1 协议的扩展。WebDAV 增加了新的 HTTP 方法和头部,此外还规定了如何使用这些新扩展、如何格式化请求和响应体、现有 HTTP 行为可能发生的变化等。具体而言,我们平时上网用的 HTTP 协议,主要设计用来“获取”和“提交”网页内容(GET, POST 方法)。而 WebDAV 在此基础上,增加了一系列新的方法,使得客户端可以通过 HTTP 协议,像操作本地文件一样对远程服务器上的文件进行创建、修改、移动和删除等管理操作。
简单来说,WebDAV 的核心作用就是:把一个网页服务器变成一个可读写的“网络硬盘”。
WebDAV 的功能与特点
协议支持的功能有:
- 命名空间操作:
- 文件管理:它定义了
COPY(复制)、MOVE(移动/重命名)、DELETE(删除)等方法,允许用户直接管理服务器上的文件。 - 目录操作:它定义了
MKCOL(Make Collection,即创建目录)方法,让用户可以在服务器上创建文件夹。
- 文件管理:它定义了
- 属性查询:通过
PROPFIND方法,可以获取文件或目录的详细信息(元数据),如大小、创建日期、修改日期等。这对于文件管理器显示文件详情至关重要。 - 锁定机制:通过
LOCK和UNLOCK方法,可以锁定一个文件,防止多个人同时编辑导致内容冲突。这也是它名字中“版本控制”的体现之一。
相比于 FTP 等其他协议的特点:由于 DAV 基于 HTTP 工作,因此用户能获得 FTP 无法提供的所有 HTTP 优势。例如:强身份验证、加密、代理支持和缓存。虽然通过 SSH 也能实现部分功能,但 HTTP 基础设施的部署范围远广于 SSH。此外,SSH 缺乏 HTTP 所拥有的丰富工具、开发库和应用程序支持。
OpenList/Alist
虽然 Alist 是最出名的云盘汇总与管理工具,但是由于其产权变更,并且据开发者社区反馈存在 API Token 集中存储风险,可能导致用户网盘凭证泄露。在此背景下,原 Alist 核心团队成员发起了 Openlist 项目继续开源。下文的叙述也将使用 OpenList 这一基于 Alist 的 fork 继续开发的项目。
为什么需要 OpenList
用户管理散落在各个网盘的文件时面临诸多痛点:
- 需要多平台切换:需要安装多个客户端(百度网盘、阿里云盘、OneDrive…),在不同软件之间来回切换,体验割裂。
- 网盘 API 独占且不开放:每个云盘厂商都建立自己的一套封闭 API 体系,并将其封装在自家的官方客户端里。他们希望通过这种方式将用户锁定在自己的生态系统中,从而推广会员、广告等增值服务。
- 缺乏通用访问协议:如果想用一个第三方播放器(如 PotPlayer)直接播放网盘视频,或者用文件管理器挂载网盘为本地磁盘,几乎不可能。因为这些云盘不支持像 WebDAV、FTP 这样通用的、标准化的文件访问协议。
OpenList 提供了统一的存储访问代理:
- 与官方客户端交互:OpenList 项目通过分析研究各个云盘官方客户端的 API 请求,模拟客户端的行为去获取文件列表、下载链接等数据。
- 为用户提供服务:然后,OpenList 将这些通过非标准 API 获取到的数据,封装成一个标准的、统一的服务端接口暴露给用户。
这样一来,一方面用户可以通过 OpenList 项目本身提供的统一接口直接访问网盘内容;另一方面任何支持 WebDAV 等协议的客户端软件(如 RaiDrive)就可以通过 OpenList 这个“翻译官”,间接地与原本不支持 WebDAV 的阿里云盘、百度网盘等进行通信了。
核心原理
- 驱动化 (Driver-based):Alist 支持几十种不同的存储服务,比如阿里云盘、百度网盘、Google Drive 等。这得益于它为每一种存储服务都开发了一个对应的驱动 (Driver),用于与特定存储服务的官方 API 进行通信。例如,Alist 的“阿里云盘驱动”知道如何调用阿里云盘的 API 来获取文件列表、生成下载链接、执行上传/删除等操作。
- 虚拟文件系统 (Virtual File System, VFS):Alist 在内部构建了一个虚拟的文件系统层。当用户添加了多个不同的存储账户后,Alist 会通过各自的驱动去获取这些存储的文件和目录信息,然后将它们整合到这个虚拟文件系统中,使用户得到一个统一的、可以像操作本地文件系统一样浏览的目录树。例如可以把阿里云盘的某个文件夹挂载到
/aliyun,把 Google Drive 的文件夹挂载到/gd,在一个界面里无缝切换和管理。
工作流程
利用“用户通过网页点击一个文件进行下载”这个例子进行说明
- 用户认证与授权:
- 管理员在 OpenList 后台添加一个存储,例如“我的阿里云盘”。
- OpenList 会引导管理员进行授权操作,通常是获取一个 Refresh Token (刷新令牌) 或者其他形式的访问凭证。
- 这个加密后的凭证会安全地存储在数据库中。这个凭证是 OpenList 后续代替用户访问该云盘的“钥匙”。
- 前端请求:
- 用户打开 OpenList 的网页界面,看到了统一的文件列表。这个列表是 OpenList 后端通过各个驱动调用对应云盘 API 获取并缓存后呈现的。
- 用户点击位于“我的阿里云盘”目录下的一个名为
movie.mp4的文件。 - 浏览器向 OpenList 的后端服务发送一个请求,例如
GET /d/我的阿里云盘/movie.mp4。
- 后端处理:
- OpenList 的后端服务接收到这个请求,解析出用户想要访问的是“我的阿里云盘”这个存储下的
movie.mp4文件。 - 找到对应的“阿里云盘驱动”,驱动会使用之前存储的 Refresh Token 向阿里云盘的 API 服务器请求获取 movie.mp4 的真实下载地址。
- OpenList 的后端服务接收到这个请求,解析出用户想要访问的是“我的阿里云盘”这个存储下的
- 响应与数据流:
- 阿里云盘 API 返回一个有一定时效性的真实下载链接给 OpenList 的后端。
- 接下来 OpenList 会根据设置的下载策略进行响应:
- 重定向(Redirect / 302):这是最常见的方式。Alist 直接将从云盘 API 获取到的真实下载链接返回给用户的浏览器。浏览器会“重定向”到这个真实链接去下载文件。
- 代理(Proxy):该模式下,Alist 指定的服务器会先去下载文件内容,然后再将这些内容转发给用户的浏览器。这种方式下,文件数据流会经过指定的服务器,消耗其带宽。
上传、删除、移动等其他文件操作的原理也是类似的,都是将用户的操作“翻译”成对具体云存储 API 的调用。
网盘挂载工具
RaiDrive
RaiDrive 是一款非常流行且功能强大的 Windows 工具软件。它的核心功能是将各种云存储、网盘或远程服务器挂载 (Mount) 成电脑里的一个本地磁盘。
安装并配置好 RaiDrive 后,可以在“此电脑”里看到一个像 C 盘、D 盘一样的新盘符(比如 Z 盘)。用户对这个 Z 盘进行的所有操作——无论是双击打开视频、拖拽文件进去上传,还是直接在里面用 Word 编辑文档并保存——RaiDrive 都会在后台自动将这些操作转换成对相应云存储的 API 请求。
RaiDrive 的主要特点:
- 协议支持广泛:它不仅仅支持 WebDAV,还支持 FTP, SFTP, FTPS,并且能通过官方 API 直接连接 Google Drive, OneDrive, Dropbox, Box 等主流网盘。
- 即时访问:文件不会全部下载到本地占用空间,只有在用户访问时才会去请求数据(当然它也有缓存机制来提升性能)。
Rclone
Rclone 是一个功能强大的命令行工具,用于管理和同步云存储上的文件,支持超过 50 种存储服务。将支持 WebDAV 的云存储挂载为本地磁盘是它的功能之一。其功能包括:
- 文件管理:支持复制 (copy)、移动 (move)、同步 (sync)、删除 (delete) 等基本文件操作,其中同步功能是单向的,会使目标目录与源目录相同 。
- 数据同步与备份:支持增量备份 ,只传输发生变化的文件,节省时间和带宽。此外,它还支持加密传输 、断点续传 。
- 挂载功能:能将远程存储(如 WebDAV、S3、Google Drive 等)挂载到本地目录,使其像本地文件系统一样工作 。
- 高级特性:包括传输完整性校验(通过 MD5、SHA1 哈希)、保留文件时间戳 、多线程传输 、可选的加密(Crypt)和缓存(Cache)功能 。
云存储配置
如果希望增加一个新的云存储配置,可以先运行 rclone config,然后:
- 选择
n(新建 remote)。 - 输入名称(如
Tbox)。 - 从存储类型列表中选择云存储类型,如选择 WebDAV (对应的编号通常会在列表中显示)。
- 根据提示输入 WebDAV 服务器的地址 (
url)、用户名 (user)、密码 (pass)。 - 对于其他高级设置,如果不确定,通常可以直接按回车使用默认值。
- 配置完成后,确认保存 (
y)。
配置完成之后,可以在文件 ~/.config/rclone/rclone.conf 中看到配置内容。或者运行 rclone config show ,也会将文件内容输出到控制台。
此时就可以对云存储的内容进行操作了。例如运行 rclone lsd Tbox:/ 查看云存储中的内容。
WebDAV 挂载
| 参数名称 | 说明与用途 | 常见值/示例 |
|---|---|---|
| 基本挂载参数 | ||
<remote>:<path> |
远程存储名称和路径 | dav:/ |
<local_path> |
本地挂载点路径 | /webdav |
--daemon |
后台守护进程模式,允许命令在后台运行,关闭终端也不中断。 | |
| 缓存与性能优化 | ||
--cache-dir <dir> |
指定缓存目录,存放文件缓存、临时文件等。强烈建议设置,可提升性能并避免磁盘空间问题。 | --cache-dir /webdav_cache |
--vfs-cache-mode <mode> |
VFS缓存模式,控制文件缓存策略。 | off, minimal, writes, full |
--vfs-cache-max-age <duration> |
缓存最大时间,在缓存期再次访问同一文件,rclone 会优先使用本地缓存副本 | 72h, 2h |
--vfs-cache-max-size <size> |
限制了缓存目录(由 --cache-dir 指定)可以占用的最大磁盘空间 |
2G, 10G |
--vfs-read-chunk-size <size> |
指定读取块大小,影响顺序读取大文件的性能和高清视频流播放流畅度。 | 32M, 64M |
--buffer-size <size> |
内存缓冲区大小,用于在上传/下载前缓存数据。 | 32M, 512M |
--dir-cache-time <duration> |
目录条目缓存时间,在缓存期内重复列出目录内容会非常快。 | 72h, 30m |
| 权限与访问控制 | ||
--allow-other |
允许其他系统用户(包括非root用户)访问挂载点。 | |
--allow-non-empty |
允许挂载到非空目录上。 | |
--umask <value> |
设置新创建文件和目录的默认权限掩码(Linux挂载时常用)。 | 000 (对应权限 777), 022 (对应权限 755) |
--file-perms <value> |
明确设置文件的权限模式(Windows挂载时可能无效)。 | 0777 |
| 其他实用参数 | ||
--log-level <LEVEL> |
设置日志详细程度,调试时有用。 | INFO, DEBUG |
--log-file <FILE> |
将日志输出到指定文件。 | --log-file /var/log/rclone.log |
--read-only |
以只读模式挂载,防止意外修改或删除远程文件。 |
运行示例:
1 | rclone mount Tbox:/ /mnt/Tbox/ --cache-dir /mnt/Tbox_cache --allow-non-empty --vfs-cache-mode full --vfs-cache-max-age 2h --vfs-cache-max-size 5G --vfs-read-chunk-size 64M --buffer-size 64M |
