跳到主要内容

我的存储

我的存储是 QVMConsole 面向用户的个人存储管理中心,提供了 ISO 镜像、共享文件和虚拟磁盘的全生命周期管理能力。用户可以通过统一的界面完成文件上传、存储监控、挂载配置等操作,并借助 9p VirtFS 协议将存储资源无缝对接到虚拟机实例中。

功能概述

访问权限

特性说明
路由/my-storage
访问范围所有用户(轻量云用户除外)
存储隔离每个用户拥有独立的存储空间

存储池初始化

存储池是用户个人存储空间的基础设施,首次使用"我的存储"功能时,系统会引导用户完成存储池的开通流程。

初始化流程

初始化说明

存储池初始化是一次性操作,完成后用户即可使用所有文件管理功能。实现细节:

  • 用户存储统一挂载在 /var/lib/kvm-user-storage(首次使用时自动创建带 project 配额特性的 ext4 镜像并 loop 挂载)
  • 为用户创建 {用户名}/iso{用户名}/share{用户名}/disk 三个分类目录并授权
  • 基于 ext4 project quota 实施配额:project ID 使用用户的系统 UID,写入 /etc/projects/etc/projid 映射,并通过 chattr -p 给目录打上 project 标记
  • 兼容处理:目录已存在但未登记 project 映射的用户,会在访问时自动补登记并追溯设置标记

配额监控

配额监控系统实时追踪用户的存储使用情况,帮助用户合理规划存储资源。

配额卡片信息

信息项说明
已用空间当前存储池中所有文件占用的总空间
配额上限系统分配给用户的最大存储容量(GB)
使用率已用空间与配额上限的百分比

使用率状态指示

使用率范围状态颜色系统行为
0% - 70%绿色正常使用
70% - 90%黄色警告提示,建议清理空间
90% - 100%红色危险警告,上传功能受限
超过 100%红色只读模式,无法上传新文件
只读模式

当存储配额超限时,系统将自动切换到只读模式。在此模式下,用户无法上传新的文件,但可以继续管理现有文件(删除、下载、挂载等操作不受影响)。

ISO 镜像管理

ISO 镜像管理功能专注于操作系统安装镜像的存储与分发,支持将 ISO 文件高效挂载到虚拟机中进行系统安装。

功能特性

功能说明
文件上传支持上传 .iso 格式的镜像文件
系统识别自动识别 ISO 文件的系统类型(Windows/Linux)
挂载管理将 ISO 镜像挂载到虚拟机的虚拟光驱
批量操作支持批量删除多个 ISO 文件

ISO 列表字段

字段说明
文件名ISO 文件的原始名称
系统类型自动识别的操作系统类型
文件大小ISO 文件占用的存储空间
上传时间文件上传到存储池的时间

ISO 挂载原理

ISO 镜像通过 9p VirtFS 协议挂载到虚拟机中,虚拟机将其识别为光驱设备(CD-ROM),用户可以在虚拟机内部直接访问 ISO 文件内容,主要用于操作系统安装和软件部署场景。

文件共享管理

文件共享功能提供了一个灵活的文件交换通道,允许用户在宿主机与虚拟机之间高效传输文件。

功能特性

功能说明
文件上传支持上传任意格式的文件
文件下载将虚拟机中的文件下载到本地
挂载管理将共享目录挂载到虚拟机
访问控制支持只读和读写两种访问模式

共享文件列表字段

字段说明
文件名文件的原始名称
文件大小文件占用的存储空间
上传时间文件上传到存储池的时间

访问模式对比

模式读取权限写入权限典型场景
只读允许禁止分发软件包、配置文件模板
读写允许允许开发环境文件同步、数据备份

虚拟磁盘管理

虚拟磁盘管理功能支持多种主流虚拟化磁盘格式的上传与管理,这些磁盘文件可用于创建新虚拟机或作为数据盘挂载到现有虚拟机。

支持的磁盘格式

格式扩展名来源平台说明
QCOW2.qcow2QEMU/KVMQEMU 原生格式,支持快照和压缩
RAW.raw通用原始磁盘映像,性能最优
VMDK.vmdkVMwareVMware 虚拟磁盘格式
VHD.vhdHyper-V虚拟硬盘格式(旧版)
VHDX.vhdxHyper-V虚拟硬盘格式(新版,支持更大容量)
IMG.img通用通用磁盘映像格式
VFD.vfd软盘镜像软驱镜像文件
OVF / OVA / MF.ovf / .ova / .mf跨平台虚拟机包(用于 导入虚拟机包
磁盘类别不支持挂载

磁盘类别文件仅用于创建/导入虚拟机与下载管理,不支持以 9p 方式挂载到虚拟机。

磁盘文件列表字段

字段说明
文件名磁盘文件的原始名称
文件大小磁盘文件占用的存储空间
上传时间文件上传到存储池的时间
格式转换

如果您的虚拟磁盘文件格式不在支持列表中,可以使用 qemu-img convert 工具进行格式转换。例如,将 VDI 格式转换为 QCOW2 格式。

挂载管理

挂载管理提供了虚拟机与存储资源之间连接关系的全局视图,用户可以在此查看和管理所有挂载实例。

挂载列表字段

字段说明
虚拟机名称挂载目标虚拟机的名称
挂载标签挂载设备的唯一标识标签
源目录存储池中的源文件路径
访问模式只读(RO)或读写(RW)
挂载命令虚拟机内挂载该目录的命令

挂载命令说明

挂载标签由系统自动生成,格式为 user_<用户名>_<类别>(类别为 isoshare)。挂载帮助对话框会生成三行命令(一键复制,HTTP 环境自动降级复制方案):

# 创建挂载点
mkdir -p /mnt/<tag>

# 挂载共享目录(只读模式追加 ,ro)
mount -t 9p -o trans=virtio,version=9p2000.L <tag> /mnt/<tag>

# 写入 fstab 实现开机自动挂载
echo '<tag> /mnt/<tag> 9p trans=virtio,version=9p2000.L,nofail 0 0' >> /etc/fstab
参数说明
-t 9p指定文件系统类型为 9p
trans=virtio使用 VirtIO 传输层
version=9p2000.L使用 9p2000.L 协议版本
<tag>挂载标签(user_<用户名>_<类别>
一键复制

挂载管理界面提供了一键复制功能,用户可以直接复制挂载命令并在虚拟机终端中执行,无需手动输入复杂的挂载参数。挂载成功后会自动弹出挂载帮助对话框。

挂载对话框

当用户需要将存储资源挂载到虚拟机时,系统会弹出挂载对话框,引导用户完成挂载配置。

配置选项

配置项类型说明
虚拟机选择下拉选择从用户拥有的虚拟机列表中选择目标实例
存储类别单选ISO 镜像或文件共享
访问模式开关控件只读模式或读写模式

挂载流程

实现原理

存储架构

核心技术要点

技术说明
存储池基于宿主机文件系统 + ext4 project quota,每个用户拥有独立的存储目录
文件上传分片上传(见下文)
挂载协议使用 9p VirtFS 协议,通过 libvirt 文件系统设备实现
访问控制只读模式下虚拟机只能读取,读写模式下可读写

分片上传机制

所有上传均通过分片上传引擎完成,支持秒传断点续传

  • 上传进度分为两阶段:抽样哈希(0-8%)与分片传输(8-100%)
  • 上传会话 24 小时过期;页面「未完成上传」卡片可随时继续取消未完成的会话
  • 上传前会预检配额与只读状态,超限时提示剩余空间
  • /tmp 空间不足时会提示大文件落盘模式(上传可能降速)

9p VirtFS 协议详解

9p VirtFS 是一种轻量级的网络文件系统协议,专为虚拟化环境设计:

  • 协议版本:使用 9p2000.L 扩展,支持 Linux 文件语义
  • 传输层:通过 VirtIO 虚拟化传输层实现高效的宿主机与虚拟机通信
  • 性能特点:相比网络文件系统(NFS/SMB),9p VirtFS 在虚拟化场景下具有更低的开销
  • 访问模式
    • 只读模式:虚拟机只能读取挂载目录中的文件,适用于分发软件和配置文件
    • 读写模式:虚拟机可以读写挂载目录中的文件,适用于文件同步和数据交换

API 接口

存储池管理

接口方法说明
/self/storage/infoGET获取存储池信息(配额、使用量)
/self/storage/initPOST初始化存储池

文件管理

接口方法说明
/self/storage/files/{category}GET获取文件列表(category: iso/share/disk)
/self/storage/upload/initPOST分片上传初始化(秒传/续传判定)
/self/storage/upload/chunkPOST上传单个分片
/self/storage/upload/completePOST完成校验(缺片补传 + 抽样哈希)
/self/storage/upload/statusGET查询上传会话进度
/self/storage/upload/pendingGET获取未完成上传会话
/self/storage/uploadDELETE取消上传会话
/self/storage/file/{category}/{filename}DELETE删除指定文件(高风险二次验证)
/self/storage/download/{category}/{filename}GET下载文件
/self/storage/isosGET获取用户 ISO 列表(用于虚拟机创建)

挂载管理

接口方法说明
/self/storage/mountPOST挂载存储到虚拟机
/self/storage/mount/{vmName}/{tag}DELETE卸载指定挂载
/self/storage/mountsGET获取用户所有虚拟机的挂载列表

API 调用流程