OpenWRT 安装 CloudDrive2 指南:把网盘挂成本地盘
CloudDrive2 的作用就一句话:让网盘在路由器上看起来像一块本地硬盘。挂载之后,局域网里的影音服务器、下载工具、文件共享都能直接读网盘里的文件,不用先把文件下载到路由器上。
但这套方案不是万能的。动手之前先把「值不值得装」想清楚,能省下不少返工。
一、值不值得装:先对场景
适合装的三种情况
第一,给影音库用。电影、剧集存在网盘里,Jellyfin 或 Emby 的媒体库直接指向挂载目录,就能刮削和播放,路由器本地几乎不占空间。这是 CloudDrive2 最站得住的用法。
第二,局域网多设备共用一份网盘。家里几台设备都要读同一批文件时,由路由器统一挂载一次,比每台设备各装客户端省事。
第三,网盘当冷数据层。照片原片、旧项目归档这类不常动、但偶尔要取的文件,放网盘、按需读取,比常年挂一块移动硬盘省电省地方。
不适合装的四种情况
第一,对读取延迟敏感的场景。挂载盘的每次读取都要经过网络,拖动 4K 原盘进度条、频繁随机读小文件时,卡顿是常态,不要指望它像本地硬盘一样跟手。
第二,把挂载盘当唯一备份。网盘账号、授权状态、服务商策略都可能变,挂载只是访问方式,不是备份。重要数据仍要按 3-2-1 原则另存一份。
第三,路由器性能吃紧。内存 512MB 级别的入门机型再跑 Docker 加 CloudDrive2,同时还要担路由转发,容易互相拖累。重度使用建议 x86 软路由或内存 2GB 以上的设备。
第四,指望它绕过网盘本身的限制。会员权益、下载速度、单文件大小上限都由网盘方决定,挂载工具改变不了这些,选盘之前先以各网盘官方说明为准。
与同类工具的分工
如果只要在网页上浏览和下载网盘文件,Alist 更轻;如果要写脚本做自动化同步,Rclone 更灵活;如果要的是「应用能把它当本地磁盘用」,比如影音服务器直接读库,CloudDrive2 的文件系统挂载就是它的位置。三者不是谁替代谁,按你要的访问方式选。
还有一条更实际的建议:先小规模试。只挂一个网盘、只放少量影片,先验证播放、刮削、断网重连这三个动作都正常,再把整个媒体库迁过来。一次性全量迁移后才发现延迟或授权问题,清理起来比试错贵得多。试用期也顺便能看出路由器的真实负载:高峰时段同时播放加下载,CPU 和内存有没有被顶满,数据比参数表可信。
二、装前检查清单
动手前把下面六项逐项打勾,缺哪项补哪项,比装到一半再回头找原因快得多。
| 检查项 | 怎么确认 | 不合格怎么办 |
|---|---|---|
| 固件与架构 | uname -m 看架构,cat /etc/openwrt_release 看固件 | 镜像与固件架构要对上,架构不对拉下来的镜像跑不起来 |
| Docker 已装且能跑 | docker info、docker ps 有正常输出 | 先装 Docker,本站有对应的安装教程 |
| FUSE 可用 | which fusermount3 有路径 | opkg install fuse3,再不行检查内核模块 |
| 存储空间 | df -h 看 Docker 数据目录所在分区 | 小于 1GB 可用空间时先做第四节的扩容 |
| 网络与 DNS | 能 ping 通网盘域名、能拉取测试镜像 | 先修网络,旁路由模式尤其要确认网关和 DNS |
| 已有数据已备份 | 路由器现有配置已导出 | 扩容和迁移数据目录前必须备份,丢配置比装失败更麻烦 |
三、环境确认:四条命令摸清底细
# 1. 系统与架构
uname -m
cat /etc/openwrt_release
# 2. Docker 状态
docker info
docker ps
# 3. 空间与内存
df -h
free -m
# 4. FUSE 是否就绪
which fusermount3
fusermount3 --version旁路由模式要多留一个心眼:容器上不了网、DNS 解析失败、网盘连接超时,这类问题多半出在主路由转发或网关配置上,先在主路由模式下验证一次,再回旁路由排查,能少走很多弯路。
四、Docker 空间扩容:先给 Docker 找个大地方
多数 OpenWRT 固件给 Docker 预留的分区只有几百 MB,镜像加缓存很快就会撑满。判断方法很直接:
# 看 Docker 占用与根分区余量
docker system df
df -h /可用空间小于 1GB 就先扩容再装。思路不是去改固件分区,而是把一块外接存储挂到 Docker 数据目录上。
分区、格式化、挂载


# 1. 查看所有磁盘与分区
fdisk -l
# 2. 在目标磁盘上新建分区(按提示操作:n 新建、w 保存)
fdisk /dev/sda
# 3. 格式化为 ext4
mkfs.ext4 /dev/sda1# 1. 建挂载点并手动挂载测试
mkdir -p /opt
mount /dev/sda1 /opt
df -h /opt
开机自动挂载建议走 LuCI 界面:系统 → 挂载点 → 添加,选设备、填挂载点 /opt、文件系统选 ext4、勾选启用,保存应用后重启一次验证。
命令行方式则是把 UUID 写进 /etc/config/fstab,同样要重启验证。两种方式选一种,不要两边都写,以免重复挂载。
外接存储本身也值得挑一下:USB 2.0 的口挂大容量盘,缓存读写会先卡在接口上,优先用 USB 3.0;长期通电的场景里,普通 U 盘的闪存寿命和持续写入表现都不如移动硬盘或 SSD,缓存目录尤其吃写入量,盘选得太差,半年后掉速、掉盘都可能出现。另外注意供电:不带独立供电的移动硬盘接在路由器 USB 口上,供电不足会导致间歇性掉盘,这种时有时无的故障最难查,动手前先确认供电没问题。

让 Docker 用上新空间
已经装了 Docker 的话,把数据目录指过去。干净的做法是改 daemon.json 的 data-root:
# 1. 停 Docker
/etc/init.d/dockerd stop
# 2. 迁移数据目录
mkdir -p /opt/docker
mv /var/lib/docker/* /opt/docker/
# 3. 在 /etc/docker/daemon.json 中加入
# { "data-root": "/opt/docker" }
# 4. 启动并验证
/etc/init.d/dockerd start
docker info | grep "Docker Root Dir"软链接 /var/lib/docker 指向 /opt/docker 也能达到同样效果,属于能用但不推荐的旧办法:后续排查时容易让人误以为数据还在原位置。
实在没法扩容时,先清理再装,多少能挤出空间:
docker image prune -a
docker container prune
docker volume prune
docker system prune -a --volumes五、安装主线:装依赖、放行挂载、起容器
第一步:装 fuse3
CloudDrive2 靠 FUSE 把网盘映射成文件系统,没有它容器跑起来也挂不上盘。
opkg update
opkg install fuse3
fusermount3 --version提示找不到包时,先看软件源配置对不对、换官方源或国内镜像源再试,不要直接去网上找来路不明的 ipk。
第二步:让挂载命名空间共享
Docker 默认的挂载命名空间是私有的,容器里的挂载动作传不到宿主机,必须把挂载传播改成共享。OpenWRT 通常没有 systemd,rc.local 方式是最常用的:
# OpenWRT 常用做法:写进本地启动脚本
# 在 /etc/rc.local 的 exit 0 之前加入
mount --make-shared /opt带 systemd 的发行版则用 drop-in 文件:
mkdir -p /etc/systemd/system/docker.service.d/
cat <<EOF > /etc/systemd/system/docker.service.d/clear_mount_propagation_flags.conf
[Service]
MountFlags=shared
EOF改完重启 Docker 生效。验证方法:
mount --make-shared /opt
findmnt -o TARGET,PROPAGATION /opt
# PROPAGATION 一列应显示 shared第三步:拉镜像,默认用稳定版
# 默认拉稳定版
docker pull cloudnas/clouddrive2
# 只要在需要新功能时才考虑 unstable
docker pull cloudnas/clouddrive2-unstable
docker images | grep clouddrive2下载慢可以给 Docker 配镜像加速,地址经常变动,以 Docker 官方文档的当前说明为准,不要抄多年前的旧地址。
第四步:启动容器
docker run -d \
--name clouddrive2 \
--restart unless-stopped \
--env CLOUDDRIVE_HOME=/Config \
-v /opt/clouddrive/shared:/CloudNAS:shared \
-v /opt/clouddrive/Config:/Config \
-v /opt/clouddrive/media/shared:/media:shared \
-p 19798:19798 \
--privileged \
--device /dev/fuse:/dev/fuse \
cloudnas/clouddrive2| 参数 | 作用 |
|---|---|
--restart unless-stopped | 跟随 Docker 自启,手动停掉的不再自动拉起 |
--env CLOUDDRIVE_HOME=/Config | 告诉程序配置目录位置 |
-v .../shared:/CloudNAS:shared | 网盘挂载点,shared 传播必不可少 |
-v .../Config:/Config | 配置与账号授权数据,丢了要重新授权 |
-v .../media:/media:shared | 给影音服务器读的目录,可选 |
-p 19798:19798 | Web 管理界面端口 |
--privileged 与 --device /dev/fuse | FUSE 挂载必需 |
最小化配置可以只留 Config、Shared、端口三项;资源紧张的设备再加 --memory=512m --cpus=1.0 封顶,时区用 --env TZ=Asia/Shanghai。
第五步:验证
docker ps | grep clouddrive2
docker logs --tail 100 clouddrive2浏览器打开 http://路由器IP:19798,首次进入设置管理员密码后即可进主界面。
六、挂载与权限:授权只走官方登录页
添加云盘
在 Web 界面点「添加云盘」,选类型,按提示完成授权。这里有一条硬规矩:授权只在网盘官方登录页或官方 App 扫码里完成。凡是让你在别处输入网盘账号密码、或者从浏览器开发者工具里抠令牌粘贴的路子,都不要走——令牌一旦外泄,等于把整个网盘交出去,而且这类旁门出问题后连官方客服都帮不上。
挂载点与权限
挂载成功后,云盘会出现在宿主机的共享目录下:
# 查看挂载结果
ls -la /opt/clouddrive/shared/几个权限上的建议:
- 只读场景就挂只读。给 Jellyfin、Emby 读库时,媒体目录挂只读能从根本上防止刮削或误操作改动云端文件。
- 管理端口只放内网。用 iptables 把 19798 限定在局域网段,不要把它暴露到公网;需要远程管理时走 VPN 或内网穿透,不要直接映射端口。
- 缓存目录单独放。缓存会持续增长,单独一个目录方便设上限和定期清理,也避免缓存把配置目录撑满。
- 配合影音服务器时,Jellyfin 的媒体库路径指向挂载目录下的影片文件夹即可,刮削、播放、多设备观看都不需要先下载。
多网盘协同的目录规划
盘一多,目录规划比挂载本身更重要。建议按「一个网盘一个顶层目录」分开,不要把几个盘的文件混进同一个文件夹:出了问题能立刻定位到某一个盘,换盘、解绑也不影响其他盘。媒体用的目录单独放一层,例如在共享目录下按影片、剧集、音乐分好类,影音服务器只读这一层,不要把整个网盘根目录直接交给它——根目录里一旦混进文档、备份、安装包,刮削结果会乱成一团。缓存目录、配置目录、挂载目录三者也要物理分开:缓存是消耗品可以随时清,配置丢了要重新授权,挂载目录只是个入口,这三者的命运不一样,混在一起迟早误伤。
七、开机自启与异常恢复
--restart unless-stopped 覆盖了大多数情况:Docker 启动后容器自动跟起。但重启后仍有两处容易掉链子,一是共享挂载没恢复,二是 Docker 启动顺序问题。兜底做法是在 /etc/rc.local 里按顺序写:
# exit 0 之前加入
sleep 10
mount --make-shared /opt
docker start clouddrive2重启后按这个顺序自查:Docker 在跑 → 共享挂载是 shared → 容器 Up → Web 界面能进 → 挂载目录下能看到云盘文件夹。哪一步断了就从哪一步往下查,不要一上来就删容器重建——重建会丢容器层面的临时状态,查不出根因。
八、挂载失败排查表
| 现象 | 先查什么 | 常见原因与处理 |
|---|---|---|
| 容器起不来、docker ps 看不到 | docker logs clouddrive2 | MountFlags 没配、/dev/fuse 不可用、端口被占,逐项对照第五节修 |
| 提示 FUSE 设备不存在 | which fusermount3、内核模块 | fuse3 未装或模块未加载,装包并 modprobe fuse |
| 端口 19798 已被占用 | netstat -tuln | grep 19798 | 换映射端口,如 -p 29798:19798,不要杀不明进程 |
| 挂载点为空、文件打不开 | 容器内挂载状态与 Web 界面授权状态 | 授权过期最常见,重新走官方登录授权;再看网络与 DNS |
| 账号反复掉授权 | 授权时间与账号状态 | 令牌过期是正常现象,重新授权;账号异常先去网盘官方侧确认 |
| 播放卡顿、列表加载慢 | 缓存是否开启、带宽与延迟 | 开缓存、调大缓存空间;先排除网络问题再怀疑软件 |
| 重启后容器没起来 | 重启策略与 rc.local | docker inspect 看 RestartPolicy 是不是 unless-stopped,再查启动脚本顺序 |
| 跑几天内存越涨越高 | docker stats | 定期重启容器或加内存上限,并清理缓存目录 |
九、日常维护:更新、备份、清理
更新镜像前先备份配置目录,更新本身就是删容器重建,配置在卷里不会丢,但多一份备份总没错:
# 备份配置
tar czf /opt/clouddrive/Backup/cd2_config_$(date +%Y%m%d).tar.gz /opt/clouddrive/Config/
# 更新流程:拉新镜像、停旧容器、删旧容器、按原命令重建
docker pull cloudnas/clouddrive2
docker stop clouddrive2 && docker rm clouddrive2
# 再执行第五节第四步的 docker run 命令清理与巡检用 OpenWrt 的 crontab,不要照搬其他固件的写法:
# 每周清理一次缓存(按需改路径与阈值)
# 0 3 * * 0 rm -rf /opt/clouddrive/Cache/*
# 每天清 7 天前的旧日志
# 0 2 * * * find /opt/clouddrive/Config/logs -name "*.log" -mtime +7 -delete健康检查也可以定时跑:容器不在了就 docker start 拉起并记一条日志;挂载点不可访问就先告警、别急着删数据。
缓存策略值得单独说一句,因为它直接决定观看体验。缓存不是越大越好,而是要和你的观看习惯对上:只看单集剧集,十几 GB 就够;经常连续看整季、拖进度条反复看,缓存要给到几十 GB,预读才跟得上。缓存过期时间也别设太短,刚看过的剧集第二天续看时还在缓存里,和重新从网盘拉,体验差很多。但缓存终究是临时空间,定期清理是必须的——设个上限,超了自动清,比等磁盘满了再救火强。最后提醒一句:缓存里可能有你看过的完整文件,清理缓存和处理旧硬盘一样,确认不再需要再删,不要图省事把整个共享目录当缓存清掉。
十、总结
CloudDrive2 在 OpenWRT 上的价值,取决于你是不是真的需要「网盘当本地盘」这一种访问方式。装之前按第二节清单确认环境,扩容先行、共享挂载做对、授权只走官方页,这三件事做对,后面九成问题不会出现。装好之后把管理端口留在内网、缓存设上限、配置定期备份,剩下的就是正常使用。
相关教程
外部资源
- CloudDrive2 官方文档:https://www.clouddrive2.com/
- Docker 官方文档:https://docs.docker.com/
- OpenWRT 论坛:https://forum.openwrt.org/
- Jellyfin 媒体服务器:https://jellyfin.org/
延伸阅读
免责声明
本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。