NAS 文件借助 MinIO 转换OSS
Published in:2025-07-16 |
Words: 1.6k | Reading time: 6min | reading:

整体架构

这个架构的核心思想是:MinIO 作为对象存储的“前端”,而你的 NAS 仍然是数据的“后端”物理存储。 用户和应用程序只与 MinIO 交互,完全不需要关心文件具体存放在 NAS 的哪个物理路径下。

方案优点

  1. 协议现代化:将传统的、基于文件系统的访问(如 NFS, SMB)升级为现代的、基于 HTTP 的 S3 API 访问。
  2. 无需数据迁移:数据仍然存放在 NAS 上,你不需要花费大量时间去拷贝或迁移 TB 级的海量数据。MinIO 直接在 NAS 的文件系统之上运行。
  3. 统一访问入口:无论你有多少个 NAS 卷或目录,都可以通过 MinIO 的 Bucket(存储桶)来组织和访问,形成一个统一的视图。
  4. 生态兼容性:几乎所有现代云原生应用、大数据框架、备份工具都原生支持 S3 协议,可以无缝对接。
  5. 高性能:MinIO 本身是为高性能而设计的,可以直接利用 NAS 的硬件性能。

第一步:准备工作

  1. 一台服务器/虚拟机:你需要一台 Linux 服务器来运行 MinIO。这台服务器必须能够高速挂载(mount)你的 NAS 目录。这台服务器的 CPU 和内存资源会影响 MinIO 的性能,但对于一般的文件服务,配置要求不高(例如 2核4G 内存即可起步)。我们称这台服务器为 “MinIO Server”。
  2. 网络连接:确保 MinIO Server 和 NAS 之间有高速、低延迟的网络连接(例如,千兆或万兆以太网)。
  3. NAS 目录:确定你要提供为对象存储的 NAS 上的一个或多个目录。例如,/volume1/data

第二步:在 MinIO Server 上挂载 NAS 目录

这是最关键的一步。你必须将 NAS 的共享目录挂载到 MinIO Server 的本地文件系统上。

假设你的 NAS IP 是 192.168.1.100,共享的目录是 shared_data,你希望将它挂载到 MinIO Server 的 /mnt/nas_data 目录。

使用 NFS 挂载(推荐)

  1. 在 NAS 上:确保 NFS 服务已开启,并且 shared_data 目录已经通过 NFS 共享出去,同时授权 MinIO Server 的 IP (192.168.1.50 假设) 有读写权限。

  2. 在 MinIO Server 上

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # 1. 安装 NFS 客户端
    sudo apt-get update
    sudo apt-get install -y nfs-common

    # 2. 创建本地挂载点
    sudo mkdir -p /mnt/nas_data

    # 3. 手动挂载进行测试
    # -o nfsvers=4 指定版本,可根据你的NAS调整
    sudo mount -t nfs 192.168.1.100:/shared_data /mnt/nas_data

    # 4. 验证挂载是否成功
    df -h
    # 你应该能看到类似下面的一行
    # 192.168.1.100:/shared_data 50T 10T 40T 20% /mnt/nas_data

    # 5. (重要) 设置开机自动挂载,防止服务器重启后服务失效
    # 编辑 /etc/fstab 文件
    sudo nano /etc/fstab

    # 在文件末尾添加一行 (使用 nofail 选项防止NAS故障导致服务器无法启动)
    192.168.1.100:/shared_data /mnt/nas_data nfs defaults,nofail 0 0

第三步:使用 Docker Compose 部署 MinIO

使用 Docker Compose 是部署和管理 MinIO 最简单、最可靠的方式。

  1. 在 MinIO Server 上安装 Docker 和 Docker Compose。

    1
    2
    3
    4
    5
    6
    # 安装 Docker
    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh

    # 安装 Docker Compose
    sudo apt-get install -y docker-compose
  2. 创建一个工作目录并编写 docker-compose.yml 文件。

    1
    2
    3
    mkdir minio-deployment
    cd minio-deployment
    nano docker-compose.yml
  3. 将以下内容粘贴到 docker-compose.yml 文件中:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    version: '3.7'

    services:
    minio:
    # 使用官方 MinIO 镜像
    image: minio/minio:latest
    container_name: local-oss-server

    # 定义环境变量 (请务必修改密码)
    environment:
    # MinIO 的登录 Access Key (用户名)
    MINIO_ROOT_USER: minioadmin
    # MinIO 的登录 Secret Key (密码, 至少8位)
    MINIO_ROOT_PASSWORD: VERY_SECRET_PASSWORD_CHANGE_ME

    # volumes 卷挂载是核心
    volumes:
    # 将我们刚刚挂载的 NAS 目录,映射到 MinIO 容器内部的 /data 目录
    - /mnt/nas_data:/data
    - /mnt/nas:/data2

    # ports 端口映射
    ports:
    # 9000 端口是 S3 API 的访问端口
    - "9000:9000"
    # 9001 端口是 MinIO Web 控制台的访问端口
    - "9001:9001"

    # command 命令
    # 告诉 MinIO 启动一个服务器,并使用容器内的 /data 目录作为存储根目录
    command: server /data /data2 --console-address ":9001"

    # 健康检查,确保服务正常运行
    healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
    interval: 30s
    timeout: 20s
    retries: 3
  4. 启动 MinIO 服务:

    1
    docker-compose up -d

第四步:验证和使用

现在,你的本地 OSS 服务已经搭建完成并开始运行了!

  1. 访问 Web 控制台

    • 在浏览器中打开 http://<MinIO_Server_IP>:9001
    • 使用你在 docker-compose.yml 中设置的 MINIO_ROOT_USER (minioadmin) 和 MINIO_ROOT_PASSWORD 登录。
  2. 查看数据

    • 登录后,你会看到 MinIO 的界面。点击 “Buckets”(存储桶)。
    • 你会惊喜地发现,你在 NAS 目录 /mnt/nas_data 下的所有一级子目录,都已经自动变成了 MinIO 的 Buckets!
    • 例如,如果你的 NAS 目录结构是:
      1
      2
      3
      4
      5
      6
      /mnt/nas_data/
      ├── images/
      │ ├── cat.jpg
      │ └── dog.png
      └── videos/
      └── movie.mp4
    • 那么在 MinIO 控制台里,你就会看到两个 bucket:imagesvideos。你可以直接点击进入并管理里面的文件。
  3. 使用 S3 API 访问

    • Endpoint (服务地址): http://<MinIO_Server_IP>:9000
    • Access Key: minioadmin
    • Secret Key: VERY_SECRET_PASSWORD_CHANGE_ME
    • 你可以使用任何支持 S3 的客户端工具(如 s3cmd, mc, AWS SDK)来连接和操作你的数据。

    使用 MinIO Client (mc) 的示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 1. 下载 mc
    wget https://dl.min.io/client/mc/release/linux-amd64/mc
    chmod +x mc
    sudo mv mc /usr/local/bin/

    # 2. 配置一个别名,指向你的本地 OSS
    mc alias set local-oss http://<MinIO_Server_IP>:9000 minioadmin VERY_SECRET_PASSWORD_CHANGE_ME

    # 3. 列出所有的 bucket (即 NAS 上的一级目录)
    mc ls local-oss

    # 4. 列出 images bucket 里的所有文件
    mc ls local-oss/images

    # 5. 上传一个新文件到 videos bucket
    mc cp my_new_video.mp4 local-oss/videos
    # 执行后,你会在 NAS 的 /mnt/nas_data/videos/ 目录下看到 my_new_video.mp4 文件

问题

  • 重启后残留文件清理
1
2
sudo rm -rf .minio.sys
docker-compose down && docker-compose up -d

总结

通过 NAS 挂载 + MinIO Docker 部署 这个简单的两步组合,你成功地将传统的 NAS 文件存储“包装”成了一个功能强大、接口标准、易于扩展的本地对象存储服务。这个方案兼具了 NAS 的大容量存储成本优势和 OSS 的现代化接口优势,是盘活存量数据资产的绝佳实践。

Prev:
Docker 部署 Tailscale
Next:
基于 FFmpeg 的视频场景(镜头边界)检测