解决Linux下使用davfs2挂载坚果云的问题

坚果云算是现在国内云存储提供商里比较另类的一个了,没有提供巨大的容量空间,也没有非常多的人使用他的分享功能,但好在基本功能非常全面,桌面同步客户端做的比较清爽,各种类型的客户端基本都能支持,特别像多个用户协作修改文件的同步、文件版本历史这些我比较看重的功能做的还不错。坚果云也有一定的付费用户,稍微坑一点的就是坚果云免费用户的初始容量只有 1GB,之后每个月免费用户可以再上传 1GB 的数据(免费用户同时限制每个月下行流量 3GB)。

坚果云虽然没有提供 API 功能,但好在其算是国内唯一提供 WebDAV 方式访问的网盘(国外的类似网盘也比较少,免费的像 Box.com 就算一个了),这样基本就可以在各种不同类型的客户端中不依靠其同步客户端就能读写云中的数据。之前我在 Windows 上使用自带的资源管理器以 WebDAV 方式访问坚果云看起来没什么问题,但到 Linux 下使用最流行的 davfs2 软件挂载坚果云 WebDAV 的时候却直接报错无法访问(WebDAV 功能需要在坚果云账户设置中的 “第三方应用管理” 里开启)。

Linux 终端下 davfs2 挂载坚果云的报错信息如下:

(trusty)root@localhost:~# mount -t davfs https://dav.jianguoyun.com/dav /mnt
Please enter the username to authenticate with server
https://dav.jianguoyun.com/dav or hit enter for none.
  Username: xxx@qq.com
Please enter the password to authenticate user xxx@qq.com with server
https://dav.jianguoyun.com/dav or hit enter for none.
  Password:
/sbin/mount.davfs: mounting failed; the server does not support WebDAV

直接提示服务器不支持 WebDAV 这就比较奇怪的,在网上没找到解决办法,因此决定直接下载 davfs2 源代码进行分析,davfs2 现在的项目主页已从 SourceForge 迁移到:

http://savannah.nongnu.org/projects/davfs2

使用 cvs 检出源代码之后(还用这么古老的版本管理软件值得吐槽哈),需要先安装 WebDAV 支持库 libneon 才能正常编译。

很快就能找到出错的地方 webdav.c:

int
dav_init_connection(const char *path)
{
    char *spath = ne_path_escape(path);
    ne_server_capabilities caps = {0, 0, 0};
    int ret = ne_options(session, spath, &caps);

    if (!ret) {
        initialized = 1;
        if (!caps.dav_class1 && !ignore_dav_header) {
            if (have_terminal) {
                error(EXIT_FAILURE, 0,
                      _("mounting failed; the server does not support WebDAV"));
            } else {
                syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_ERR),
                       _("mounting failed; the server does not support WebDAV"));
                ret = EINVAL;
            }
        }

简单分析上面的源代码可知 mount.davfs 命令在挂载时和 WebDAV 服务器建立连接,并通过 libneon 库的 ne_options 函数发送 HTTP OPTIONS 请求获取 WebDAV 服务器能力,虽然返回成功但判断坚果云 WebDAV 服务器不支持 Class 1 WebDAV,因此直接报错挂载失败。

看到这里解决办法也就简单了,davfs2 提供了通过配置文件禁用 WebDAV 头检测的功能,直接修改 /etc/davfs2/davfs2.conf 配置文件注释并改为:

ignore_dav_header 1

然后再重新使用 mount 或者 mount.davfs 命令挂载坚果云就可以成功了,后续拷贝文件之类的看起来也算正常,不过运行 df 命令看到 WebDAV 返回的容量信息还是不对:

(trusty)zzm@localhost:~$ df -h /mnt
文件系统                        容量  已用  可用 已用% 挂载点
https://dav.jianguoyun.com/dav   26G   13G   13G   50% /mnt

不过这个就不用计较咯,祝玩的开心~~~

  1. Unee Wang:

    听说坚果支持Linux,原来是这么回事

  2. admin:

    坚果云也有Linux桌面版的同步客户端(可惜不开源)

  3. Wolfit:

    收到,谢谢

  4. 匿名:

    厉害!我也遇到同样问题,用你的方法解决了,感谢!

  5. Sxul07:

    谢谢w 我估计返回的容量是坚果云使用的物理盘的情况吧…因为我这里是这样的
    $ df -h cld/
    文件系统 容量 已用 可用 已用% 挂载点
    http://dav.jianguoyun.com/dav/ 1.3T 763G 509G 61% /mnt/cld

  6. Uranus Zhou:

    坚果云返回的可能是使用的存储卷文件系统容量信息,像 Box.com 返回的就是用户实际总容量和使用量,应该和 WebDAV 服务器的实现有关。

  7. ctaoist:

    牛啊,博主!

  8. beiv:

    大佬牛逼,问题完美解决

  9. ilolipopi:

    现在它的源码包里有一份GPL v2,就是已经开源了吗?https://www.jianguoyun.com/s/downloads/linux#build_from_src

  10. Uranus Zhou:

    看起来是的,这是好事哈,特别对于 ARM、MIPS 等非 x86 用户来说。
    不过我一般都用 Xubuntu 系统,自带文件管理器是 Thunar,目前坚果云不支持 Thunar 插件,用来同步文件还是可以的。
    davfs2 主要还是给非桌面环境用的,嘿嘿,FUSE 挂载轻度使用比较方便 ^_^。

  11. xxxx:

    感谢,不过这都2023年了坚果云还没修复这个问题。。。

  12. Uranus Zhou:

    因为坚果云的 WebDAV 服务器只支持 Class 2 以上,不支持 Class 1,
    他们的开发认为只支持新版本没有问题,也不好说什么了。

    当然目前大多数 WebDAV 服务器软件都是同时支持 Class 1, Class 2, Class 3 的。





*