---
url: https://eoht.net/esxi/openwrt/openwrt-install-clouddrive2.md
description: >-
  在 OpenWrt/iStoreOS 中通过 Docker 部署 CloudDrive2，检查持久化磁盘、fuse3
  与共享挂载，使用稳定镜像启动容器，并验证云盘目录和重启后的启动顺序。
---

# OpenWrt/iStoreOS Docker 安装 CloudDrive2：扩容、挂载与启动 {#openwrt-clouddrive2-docker-deployment}

本文适用于已启用 Docker 的 OpenWrt/iStoreOS。流程是：确认持久化空间 → 检查 FUSE → 设置共享挂载 → 创建容器 → 在网页中添加云盘并验证。截图为既有界面示例，固件菜单可能不同；本文未逐款路由器实机测试。

OpenWrt 通常由 **procd** 管理服务，应按 CloudDrive2 官方指南中的“非 systemd”分支处理挂载。`/etc/systemd/system/docker.service.d/` 不是本教程的配置位置。镜像与参数参考 [CloudDrive2 官方 Docker 部署指南](https://www.clouddrive2.com/docker.html)。

不熟悉镜像和容器时，可先查看 [Docker 是什么及如何安装](/fe/docker/install)。

## 扩容 Docker 存储空间 {#expand-docker-storage}

先检查 Docker 数据目录与磁盘容量，不能仅凭 `/opt` 目录存在就认定 Docker 已扩容：

```sh
docker info --format '{{.DockerRootDir}}'
df -h
```

Docker 镜像存储与 CloudDrive2 的配置目录是两件事。本文把配置与云盘挂载目录放在 `/opt/clouddrive`，前提是 `/opt` 已挂载到足够大的持久化磁盘。若空间足够，跳过分区步骤。已有 Docker 数据需要迁移时，应先停止相关容器、备份数据，再按当前固件的 Docker 数据目录设置迁移；不要直接在非空 `/opt` 上覆盖挂载。

## 创建分区或者添加新分区 {#create-and-format-partition}

本节仅适用于**确认无数据的新磁盘**。先用 `fdisk -l` 核对型号、容量、已有分区与系统盘；不要格式化系统盘或已有数据的分区。以下假定新磁盘为 `/dev/sdb`，实际设备名必须自行核实。

```sh
fdisk -l
```

确认目标后再运行 `fdisk /dev/sdb`：用 `p` 查看分区表，按提示创建新分区；写入前再次确认目标和结果，最后用 `w` 保存。只有新建的 `/dev/sdb1` 确认没有需要保留的数据时，才格式化：

```sh
mkfs.ext4 /dev/sdb1
```

![clouddrive2 =688x](https://i.eoht.net/docs/20240420164209.webp "创建分区或者添加新分区")

![clouddrive2 =688x](https://i.eoht.net/docs/20240420164237.webp "创建分区或者添加新分区")

在“系统 → 挂载点”按分区 UUID 配置持久化挂载，目录填 `/opt`，文件系统选 `ext4`，启用后保存应用。

![clouddrive2 =688x](https://i.eoht.net/docs/20240420164352.webp "启用此挂载点")

重启后用 `df -h /opt` 确认它来自预期磁盘，而非路由器原来的根文件系统；再次核对 Docker 数据目录所在分区。

![clouddrive2 =688x](https://i.eoht.net/docs/20240420164746.webp "重启后检查挂载结果")

## 通过 Docker 部署 CloudDrive2 {#deploy-clouddrive2-with-docker}

通过 SSH 登录路由器，按固件版本安装 FUSE3 用户工具和匹配内核的 FUSE 支持，再检查：

```sh
command -v fusermount3
ls -l /dev/fuse
docker info
```

缺少 `fusermount3`、`/dev/fuse` 或 Docker 无法连接时先处理对应组件，不要继续创建容器。精简固件的 `mount` 若不支持 `--make-shared`，需安装该固件仓库提供的完整 mount 工具。

### 查找挂载点目录 {#find-mount-point}

```sh
df -h /opt
findmnt -o TARGET,SOURCE,FSTYPE,PROPAGATION /opt
```

`findmnt` 应显示 `/opt` 是预期的持久化挂载点。若没有该工具，可查看 `/proc/self/mountinfo` 中 `/opt` 对应行及其 `shared:` 标记；不要照抄其他机器的设备名。

![clouddrive2 =688x](https://i.eoht.net/docs/20240420182231.webp "查找挂载点目录")

### 选择一个目录挂载 {#configure-shared-mount}

确认 `/opt` 已挂载后创建两个独立目录；若传播属性尚非 `shared`，设置共享挂载：

```sh
mkdir -p /opt/clouddrive/shared /opt/clouddrive/Config
mount --make-shared /opt
```

重新检查传播属性。`shared` 让容器内的云盘挂载能够传播回宿主机；这不是 SMB 共享，也不是文件权限设置。重启后需要在 CloudDrive2 容器启动前重新设置。

### 拉取 Docker 镜像 {#pull-clouddrive2-image}

使用正常发布镜像，不默认选择 `unstable`：

```sh
docker pull cloudnas/clouddrive2
```

如需指定架构，按官方页面选择 `amd64`、`arm64` 或 `arm32` 标签；拉取报架构不匹配时先核对路由器 CPU 和固件架构。

### 启动 Docker 容器 {#start-clouddrive2-container}

以下保留官方的 host 网络、host PID 与 FUSE 参数，并暂时关闭 Docker 自动重启，避免开机时早于共享挂载启动。容器名已存在时先检查原容器，不能重复创建。

```sh
docker run -d \
  --name clouddrive2 \
  --restart no \
  --env CLOUDDRIVE_HOME=/Config \
  -v /opt/clouddrive/shared:/CloudNAS:shared \
  -v /opt/clouddrive/Config:/Config \
  --network host \
  --pid host \
  --privileged \
  --device /dev/fuse:/dev/fuse \
  cloudnas/clouddrive2
```

`/Config` 保存账号与应用配置，重建容器时应保留；`/CloudNAS` 是云盘挂载位置。只有需要管理其他本地目录时，才额外添加官方示例中的 `/media` 映射。host 网络直接使用宿主机端口，不能再靠 `-p` 限制访问；管理页仅允许可信 LAN 访问，不要放行到 WAN。

打开 `http://路由器局域网IP:19798`，按页面完成账号登录、添加云盘，并把云盘挂载到 `/CloudNAS` 下的子目录。随后检查：

```sh
docker ps --filter name=clouddrive2
docker logs --tail 100 clouddrive2
ls -la /opt/clouddrive/shared
```

网页能打开只表示管理服务运行。宿主机应能列出挂载云盘中的已知文件，并读取一个小文件；若网页能浏览而宿主机目录为空，优先查挂载目标、FUSE 与传播属性。

## 重启、升级与故障恢复 {#restore-shared-mount-after-reboot}

先完成一次手动启动和挂载验证，再配置自动启动。顺序必须是：**持久化磁盘挂载完成 → 设置 shared → Docker 可用 → 启动 CloudDrive2 容器**。容器保持 `--restart no`，不要同时配置另一套自动启动。

OpenWrt/iStoreOS 可在“系统 → 启动项 → 本地启动脚本”中、原有 `exit 0` **之前**加入以下示例。它最多等待约 60 秒；未满足条件就记录日志并停止尝试，避免把配置写到未挂载磁盘的目录中。前提仍是本文使用独立的 `/opt` 挂载点。

```sh
(
  clouddrive_ready=0
  for clouddrive_attempt in $(seq 1 30); do
    if awk '$2 == "/opt" { found=1 } END { exit !found }' /proc/mounts \
      && mount --make-shared /opt \
      && docker info >/dev/null 2>&1; then
      clouddrive_ready=1
      break
    fi
    sleep 2
  done
  if [ "$clouddrive_ready" = 1 ]; then
    docker start clouddrive2 || logger -t clouddrive2 'Container start failed'
  else
    logger -t clouddrive2 'Storage or Docker not ready; container was not started'
  fi
) &
```

![clouddrive2 =688x](https://i.eoht.net/docs/20240420165750.webp "本地启动脚本入口示意，代码以正文为准")

保存后重启，重复上面的容器日志与宿主机文件读取检查；失败时用 `logread` 查看启动日志。需要停止服务时执行 `docker stop clouddrive2`；需要长期停用时同时移除本地启动脚本中的对应片段。

升级前记录当前镜像 ID，停止容器并备份 `/opt/clouddrive/Config`，再拉取新镜像、使用相同目录与参数重建容器。先验证新版本再清理旧镜像；回退时应使用旧镜像和与其匹配的配置备份，不能把删除配置目录当作修复方法。
