logo
0
0
WeChat Login
feat: 添加图形化 Web UI,支持 rclone 后端管理和 iSCSI 磁盘创建

Yingpan Go (影盘) - Go版本

这是 Yingpan 项目的 Go 语言重写版本,提供更高性能和更好的并发处理能力。

与 Python 版本的主要改进

  1. 性能提升: Go 的 goroutine 和 channel 提供更高效的并发处理
  2. 内存管理: 更好的内存控制和垃圾回收机制
  3. 编译型语言: 无需运行时依赖,部署更简单
  4. 类型安全: 编译时类型检查,减少运行时错误
  5. 并发模型: 更优雅的并发控制,避免 GIL 限制
  6. 稀疏块清理改进:
    • 使用全零检测(而非 95% 阈值),100% 准确识别删除文件后的稀疏块
    • 支持从云端扫描清理,即使本地缓存被清理也能释放云端空间
    • 智能采样算法(开头+结尾+中间),快速且准确
  7. 多协议支持: 同时提供 S3 和 WebDAV 协议访问虚拟磁盘
  8. 独立认证体系: Web 界面和协议服务器共享统一的认证机制

项目结构

.
├── cmd/
│   └── server/
│       └── main.go          # 主程序入口
├── internal/
│   ├── config/
│   │   └── config.go       # 配置管理
│   └── models/
│       └── models.go       # 数据模型
├── pkg/
│   ├── api/
│   │   └── server.go       # HTTP API 服务器
│   ├── blockmanager/
│   │   ├── blockmanager.go # 块管理器核心
│   │   ├── metadata.go    # 元数据管理
│   │   └── ratelimiter.go # 速率限制器
│   ├── compression/
│   │   └── compression.go # 压缩支持
│   ├── fuse/
│   │   └── vdrive.go      # FUSE 虚拟驱动
│   ├── nbd/
│   │   └── server.go      # NBD 服务器
│   └── webdav/
│       └── client.go      # WebDAV 客户端
├── static/
│   └── index.html          # Web UI
├── scripts/
│   ├── install-host-deps.sh
│   └── yingpan-mount.sh
├── go.mod                  # Go 模块定义
├── Dockerfile              # Docker 镜像构建
├── docker-compose.yml      # Docker Compose 配置
├── Makefile                # 构建脚本
└── README.md              # 本文件

环境要求

  • Go 1.21 或更高版本
  • Linux 操作系统(内核 3.10+)
  • FUSE 3 (fuse3, fusermount3)
  • NBD 工具 (nbd-client) - 如需使用 NBD 模式
  • e2fsprogs (mkfs.ext4)

快速开始

方式一:Web UI 图形化管理(推荐)

最简单的方式!无需命令行,图形化配置和操作。

# 1. 安装 rclone
curl https://rclone.org/install.sh | sudo bash

# 2. 编译项目
make build

# 3. 启动 Web UI
./webui

# 4. 在浏览器中打开
# 访问: http://localhost:8001

Web UI 功能:

  • 🖱️ 图形化添加 rclone 存储后端
  • 💾 一键创建多个磁盘设备
  • 🚀 启动/停止 iSCSI 服务
  • 📊 实时查看设备状态和统计
  • 🌐 支持 50+ 种云存储提供商

详细使用说明请参考 WEBUI_GUIDE.md

方式二:命令行快速启动

# 1. 安装 rclone
curl https://rclone.org/install.sh | sudo bash

# 2. 配置 rclone 远程存储
rclone config

# 3. 编译项目
make build

# 4. 一键启动
./quick-start.sh -remote myremote

# 或使用 quickstart 命令
./quickstart -remote myremote -size 100 -cache /mnt/ssd/cache

参数说明:

  • -remote <name>: rclone 远程存储名称(必需)
  • -disk <name>: 磁盘名称(默认: disk1)
  • -size <GB>: 磁盘大小 GB(默认: 100)
  • -addr <ip:port>: iSCSI 服务地址(默认: 0.0.0.0:3260)
  • -cache <dir>: 缓存目录(默认: /var/cache/yingpan)
  • -block-size <MB>: 块大小 MB(默认: 4)
  • -max-cache <GB>: 最大缓存大小 GB(默认: 50)

客户端连接:

Windows:

  1. 打开 iSCSI 发起程序 (Win+R: iscsicpl)
  2. 发现目标: <iSCSI服务地址>
  3. 连接到显示的 IQN
  4. 初始化磁盘、创建分区、格式化

Linux:

sudo iscsiadm -m discovery -t st -p <iSCSI服务地址>
sudo iscsiadm -m node -T <IQN> -p <iSCSI服务地址> --login
fdisk /dev/sdX

方式三:完整版服务器启动

# 1. 安装 Go 依赖工具
sudo apt-get update
sudo apt-get install -y fuse3 libfuse3-dev nbd-client e2fsprogs

# 2. 安装 Go 1.21+
wget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin

# 3. 编译项目
go mod download
go build -o yingpan-server ./cmd/server

# 4. 运行服务器
./yingpan-server

# 服务启动后会监听以下端口:
# - 8001: Web 界面和 API
# - 9000: S3 兼容 API
# - 9001: WebDAV 协议

或使用 Makefile:

# 查看所有可用命令
make help

# 编译
make build

# 安装
make install

配置

系统配置 (system_config.json)

{
  "computer_name": "my-pc",
  "admin_username": "admin",
  "admin_password": "admin",
  "last_dav_url": "",
  "last_dav_user": "",
  "last_dav_password": ""
}

配置说明:

  • computer_name: 计算机名称,用于标识本地机器
  • admin_username: Web 界面和 WebDAV 的登录用户名(默认: admin)
  • admin_password: Web 界面和 WebDAV 的登录密码(默认: admin)
  • last_dav_url, last_dav_user, last_dav_password: 最后使用的 WebDAV 连接信息(自动保存)

磁盘配置 (disks_config.json)

[
  {
    "disk_name": "mydisk",
    "dav_url": "https://dav.example.com/",
    "dav_user": "username",
    "dav_password": "password",
    "mount_path": "/mnt/fuse_mirror/mydisk",
    "cache_dir": "/var/cache/mydisk",
    "disk_size_gb": 1024,
    "max_cache_gb": 100,
    "block_size_mb": 4,
    "remote_path": "v_disks/my-computer/mydisk/blocks",
    "concurrency": 5,
    "inode_ratio": 16384,
    "compression": "zstd",
    "compression_level": 3,
    "driver_mode": "fuse",
    "upload_limit_kb": 0,
    "download_limit_kb": 0
  }
]

使用方法

1. 访问 Web 界面

启动服务后,在浏览器中访问:

http://localhost:8001

Web 界面登录:

  • 默认用户名: admin
  • 默认密码: admin
  • 首次登录后建议在系统设置中修改密码

通过 WebDAV 访问:

  • URL: http://localhost:9001
  • 使用与 Web 界面相同的账号密码登录
  • 路径格式: http://localhost:9001/[磁盘名]/[文件路径]

通过 S3 兼容 API 访问:

  • Endpoint: http://localhost:9000
  • 每个虚拟磁盘对应一个 S3 bucket
  • 使用 S3 客户端工具(如 AWS CLI、s3cmd 等)访问
  • 示例:
    # 列出所有磁盘(buckets)
    s3cmd ls http://localhost:9000
    
    # 列出磁盘内容
    s3cmd ls s3://mydisk --host=http://localhost:9000 --host-bucket=/
    
    # 上传文件
    s3cmd put localfile.txt s3://mydisk/path/ --host=http://localhost:9000 --host-bucket=/
    
    # 下载文件
    s3cmd get s3://mydisk/path/file.txt --host=http://localhost:9000 --host-bucket=/
    

2. 创建磁盘

在 Web 界面中:

  1. 点击"新增磁盘"
  2. 填写磁盘名称(如: mydisk)
  3. 选择驱动模式(fuse 或 nbd)
  4. 配置 WebDAV 连接信息
  5. 设置磁盘大小和缓存限制
  6. 点击"创建"

3. 挂载磁盘

FUSE 模式: 磁盘创建后会自动挂载到:

/mnt/fuse_mirror/[磁盘名]

NBD 模式: 磁盘创建后需要手动挂载:

sudo yingpan-mount.sh mount [磁盘名]

挂载点为:

/mnt/nbd/[磁盘名]

首次挂载会自动格式化(mkfs.ext4),可能需要几分钟时间。

4. 使用磁盘

像普通磁盘一样使用:

# 查看磁盘空间
df -h /mnt/v_disks/mydisk

# 创建目录
mkdir /mnt/v_disks/mydisk/mydata

# 复制文件
cp -r /path/to/data /mnt/v_disks/mydisk/mydata/

5. 管理磁盘

# 查看挂载状态
make status

# 挂载所有磁盘
make mount

# 卸载所有磁盘
make unmount

# 重新挂载所有磁盘
make remount

API 接口

认证

  • POST /api/auth/login - 用户登录
    {
      "username": "admin",
      "password": "admin"
    }
    
  • GET /api/auth/check - 检查认证状态
  • POST /api/system/change-password - 修改管理员密码
    {
      "old_password": "admin",
      "new_password": "newpassword"
    }
    

系统配置

  • GET /api/system/config - 获取系统配置
  • POST /api/system/config - 更新系统配置

磁盘管理

  • GET /disks - 列出所有磁盘
  • POST /mount - 挂载磁盘
  • POST /unmount/:diskName - 卸载磁盘
  • DELETE /disks/:diskName - 删除磁盘
  • POST /disks/:diskName/cleanup - 清理磁盘

WebDAV 操作

  • POST /api/webdav/list_computers - 列出远程计算机
  • POST /api/webdav/list_disks - 列出远程磁盘
  • POST /api/webdav/get_disk_config - 获取远程磁盘配置

缓存管理

  • POST /cache/prefetch?disk_name=xxx&path=xxx - 预热缓存
  • POST /cache/evict?disk_name=xxx&path=xxx - 释放缓存

多协议访问说明

Yingpan 提供三种访问虚拟磁盘的方式,彼此独立:

1. POSIX 文件系统(NBD 挂载)

适用场景: 本地应用需要像访问本地磁盘一样访问虚拟磁盘

特点:

  • 完整的 POSIX 文件系统支持
  • 使用 /mnt/v_disks/[磁盘名] 挂载点
  • 支持所有文件操作(读写、权限、符号链接等)
  • 仅限本地访问

2. WebDAV 协议

适用场景: 跨平台文件访问、Windows 资源管理器、macOS Finder

特点:

  • 端口: 9001
  • 路径格式: http://[服务器]:9001/[磁盘名]/[路径]
  • 支持标准 WebDAV 客户端(Windows、macOS、Linux)
  • 使用 HTTP Basic Auth 认证
  • 与 Web 界面共享账号密码

Windows 挂载:

1. 打开"此电脑" -> "映射网络驱动器"
2. 输入: http://[服务器]:9001/[磁盘名]
3. 输入用户名和密码

macOS 挂载:

# 在 Finder 中按 Cmd+K
# 输入: http://[服务器]:9001/[磁盘名]

3. S3 兼容 API

适用场景: 云存储工具、S3 客户端、程序化访问

特点:

  • 端口: 9000
  • 每个磁盘对应一个 S3 bucket
  • 支持大部分 S3 API(List、Get、Put、Delete)
  • 无需认证(可自行添加 S3 签名验证)

支持的操作:

  • GET / - 列出所有 bucket(磁盘)
  • GET /[bucket] - 列出 bucket 内容
  • GET /[bucket]/[key] - 下载对象
  • PUT /[bucket]/[key] - 上传对象
  • DELETE /[bucket]/[key] - 删除对象
  • HEAD /[bucket]/[key] - 获取对象元信息

架构说明

┌─────────────────────────────────────────┐
│          Yingpan Server                 │
│  ┌──────────┐  ┌──────────┐  ┌────┐   │
│  │Web UI:   │  │WebDAV:   │  │S3: │   │
│  │:8001     │  │:9001     │  │:9000│   │
│  └────┬─────┘  └────┬─────┘  └─┬──┘   │
│       │             │            │      │
│       └─────┬───────┴────────────┘      │
│             │                            │
│        ┌────▼────┐                       │
│        │Adapter  │                       │
│        └────┬────┘                       │
└─────────────┼────────────────────────────┘
              │
       ┌──────▼──────┐
       │ /mnt/v_disks/│  ← 磁盘挂载点
       └─────────────┘
              │
       ┌──────▼──────┐
       │  WebDAV 存储 │  ← 云端存储
       └─────────────┘

重要说明:

  • S3 和 WebDAV 访问的是已挂载的磁盘文件系统
  • 与 NBD 挂载完全独立,互不影响
  • 可以在磁盘通过 NBD 挂载的同时,通过 S3/WebDAV 访问
  • 三种访问方式共享同一份数据

性能优化建议

  1. 缓存大小: 建议设置为磁盘大小的 10-20%
  2. 块大小: 默认 4MB,适合大多数场景
  3. 并发数: 根据网络带宽调整(默认 5)
  4. 压缩算法:
    • zstd: 最佳压缩比,适合大文件
    • lz4: 极速压缩,适合小文件和高频访问
    • none: 不压缩,适合已压缩文件
  5. 驱动模式:
    • fuse: 兼容性最好,适合大多数场景
    • nbd: 性能更高,需要 NBD 内核模块支持

故障排查

磁盘挂载失败

  1. 检查 FUSE 模块是否加载:

    lsmod | grep fuse
    
  2. 检查挂载点是否已占用:

    mount | grep fuse
    
  3. 查看服务日志:

    journalctl -u yingpan -f
    

上传/下载速度慢

  1. 检查网络连接
  2. 调整并发数配置
  3. 检查 WebDAV 服务器限速
  4. 考虑使用更快的压缩算法(lz4)

磁盘空间不足

  1. 增加缓存大小限制
  2. 手动清理缓存(在 Web 界面点击"清理缓存")
  3. 删除不必要的块(手动删除 /var/cache/[磁盘名] 下的文件)

与 Python 版本的兼容性

Go 版本与 Python 版本在以下方面完全兼容:

  1. 数据格式: 相同的块文件格式和索引格式
  2. WebDAV 协议: 相同的远程目录结构
  3. 配置文件: 相同的 JSON 配置格式
  4. API 接口: 完全兼容的 HTTP API

可以无缝从 Python 版本迁移到 Go 版本,数据完全互操作。

开发

运行测试

go test ./...

代码检查

go vet ./...
golangci-lint run

生成文档

godoc -http=:6060

贡献

欢迎提交 Issue 和 Pull Request!

许可证

MIT License

联系方式