OpenStack 存储深度解析|Cinder 块存储 + Swift 对象存储原理与完整实操(Yoga)
摘要:OpenStack 云计算平台包含多种存储形态,很多初学者容易混淆临时存储、块存储 Cinder、对象存储 Swift、文件存储 Manila。本文结合理论 PPT 知识 + Dashboard/CLI 双模式完整实验,讲解存储架构原理、组件交互、卷全生命周期管理,同时演示 NFS 存储后端接入,梳理大量生产踩坑点,适合运维、云计算学习者阅读。
一、OpenStack 存储基础概念

OpenStack 存储分为临时存储(非持久存储)与持久存储两大类OpenStack ...。
1.1 临时存储(Ephemeral Storage)
由 Nova 计算服务提供,是虚拟机本地磁盘。
- 特点:虚拟机关机、重启、删除,数据直接丢失;磁盘存放在计算节点本地硬盘。
- 场景:虚拟机操作系统盘(flavor 规格定义磁盘大小),不能存放业务重要数据。
⚠️注意:仅部署 Nova 的时候,虚拟机全部使用临时存储,数据不持久。
1.2 持久存储三大服务
表格
| 服务名称 | 中文 | 访问方式 | 典型业务场景 |
|---|---|---|---|
| Cinder | 块存储 | 块设备 /dev/vdX,格式化挂载 | 数据库、业务数据盘、虚拟机系统盘,可挂载卸载迁移 |
| Swift | 对象存储 | REST HTTP API 访问对象 | 镜像备份、海量静态文件、归档备份,不支持直接挂载到虚拟机 |
| Manila | 共享文件存储 | NFS/CIFS 文件共享 | 多虚拟机同时读写共享目录(本章节不重点展开) |
简单区分:
- 块存储 Cinder:就像给虚拟机插一块移动硬盘,可以格式化分区,随虚拟机挂载 / 卸载,数据独立虚拟机生命周期。
- 对象存储 Swift:没有磁盘、没有文件系统,通过 URL 访问文件对象,适合海量静态文件存储,Glance 镜像、Cinder 卷备份可以存放在 Swift 中Red Hat。
二、Cinder 块存储核心原理
Cinder 是 OpenStack 块存储服务,Folsom 版本正式加入。Cinder 本身不实现底层存储,它是抽象中间层,通过驱动对接各种后端存储(LVM、NFS、Ceph、华为 / 浪潮 SAN 存储),对外提供统一 REST API。
2.1 Cinder 四大核心组件
- cinder‑api:接收用户 REST 请求(Dashboard/CLI),校验参数,写入数据库,通过消息队列下发任务。
- cinder‑scheduler :调度器,收集各个存储后端容量能力,通过过滤器 filter + 权重 weigher,选出最合适的存储后端节点来创建卷。
- cinder‑volume:真正和存储后端打交道,调用对应存储驱动完成卷创建、快照、扩容、删除。支持多后端,一套平台对接 LVM/NFS/Ceph/SAN 阵列。
- cinder‑backup:卷备份组件,可以把卷备份数据存放到 Swift 对象存储。
交互流程(创建卷)
- 用户提交创建卷请求给 cinder‑api;
- api 校验配额、参数,数据库写入卷记录,RPC 调用 scheduler;
- scheduler 过滤、权重计算,挑选后端;
- 消息队列下发任务到对应 cinder‑volume;
- cinder‑volume 调用后端驱动,真实创建块设备,更新数据库状态。
生产提示:LVM 后端(cinder‑volumes 卷组)仅适合测试环境,无高可用;生产建议 Ceph RBD 或者企业 SAN 存储OpenStack ...。
2.2 卷类型 Volume Type & QoS 规格
- 卷类型:用于区分不同存储后端(高性能 SSD、普通 SATA、NFS 存储池),创建卷的时候指定 type,调度器就会落到对应后端存储池。
- QoS 规格 :对 IOPS、带宽做限速;消费者分为
front‑end(虚拟机侧)、back‑end(存储设备侧);QoS 需要关联卷类型才会生效。
三、Swift 对象存储核心原理
Swift 是 OpenStack 分布式对象存储,Austin 版本引入;无中心主节点,全部组件水平扩展,提供最终一致性,适合海量非结构化数据存储。
3.1 Swift 三层数据模型 Account / Container / Object
- Account:租户账号;
- Container:容器,类似文件夹;
- Object:实际存储的文件对象。
API 访问格式:
/v1/{account}/{container}/{object},全部基于 HTTP RESTful 接口。
3.2 关键技术
- 一致性哈希 Ring 环:把对象映射物理存储节点;增加删除节点时,最小化数据迁移量。
- 多副本机制:一份对象保存多份副本,放置不同 Zone(物理隔离机房 / 机柜),硬件损坏不丢数据。
- 最终一致性:不保证写完成立刻所有副本一致;后台 Replicator、Auditor、Updater 进程异步修复副本差异,换取高可用和无限扩展能力。
3.3 Swift 和其他组件交互
- Glance 可以把虚拟机镜像存放在 Swift;
- Cinder 卷备份可以直接备份到 Swift 对象存储;
- Keystone 负责 Swift 的身份认证。
❗Swift 不能直接挂载给虚拟机作为磁盘,不能做操作系统盘。
四、Cinder 完整实操:Dashboard 图形界面

实验环境 OpenStack Yoga,admin 管理员账号,同时具备项目普通权限。
4.1 卷类型与 QoS 管理
- 管理员 → 卷 → 卷类型 → 创建卷类型:
VolumeType_web,勾选公有。 - 创建 QoS 规格:名称
QoS_web,消费者:后端(back‑end)。 - 卷类型操作:管理 QoS 规格关联,绑定
QoS_web。
4.2 卷生命周期全套操作
① 创建卷
项目 → 卷 → 创建卷
- 名称:Volume_web_01;来源镜像 Img_web;类型 VolumeType_web;大小 1G;可用分区 nova。 创建完成状态:
available可用。
② 挂载 / 卸载卷
前提:已经存在测试虚拟机 Instance_web_01
- 卷操作:管理连接,选择实例连接;卷状态变为
in‑use(已挂载)。 - 管理连接,执行分离卷;卷回到 available。
原理:Cinder 通知 Nova,compute 节点通过 iSCSI/Fc 协议连接存储,把块设备给到虚拟机。
③ 上传卷为镜像
卷操作 → 上传镜像;镜像名 Volume_Img_web,磁盘格式 qcow2;到【计算‑镜像】列表查看生成镜像。
④ 创建卷快照
卷操作 → 创建快照,名称 Volume_Snap_web。
✍思考:in‑use 已挂载卷允许创建快照,但此时虚拟机正在读写磁盘,快照可能数据不一致,业务重要数据建议停机后打快照。快照是时间点副本,可以用来恢复数据。
⑤ 卷扩容
操作 → 扩展卷,新大小设置 2GiB。
重要知识点:Cinder 扩容只扩大后端块设备容量,虚拟机内部操作系统文件系统不会自动扩容,需要登录虚拟机手动 resize 文件系统。
⑥ 基于快照创建卷
卷‑快照列表,快照操作【创建卷】,生成 Volume_web_02;该卷数据等于快照时间点。
⑦ 基于卷启动虚拟机
Volume_web_02 操作→创建实例;
关键点:只有
bootable(可启动)=True的卷,才可以作为系统盘启动虚拟机。 测试验证:编辑卷,取消勾选 "可启动";此时该卷不再支持创建实例。
⑧ 更新卷状态(管理员)
管理员 →卷 →更新卷状态,设置状态为 error。用于底层存储故障,人工标记故障卷。
⑨ 删除卷(高频踩坑)
删除卷两大硬性限制:
- 如果卷存在快照,不能直接删除卷;必须先全部删除快照,再删卷。
- 如果卷状态
in‑use正在挂载:普通数据卷可以先分离;系统启动盘不支持分离,必须删除虚拟机实例,卷释放为 available 后,才可以删除。
实验现象:直接删除有快照的卷,页面报错;删除系统盘卷提示失败;删除关联虚拟机之后卷才能正常删除。
4.3 拓展:Cinder 对接 NFS 存储后端实操

NFS 可以作为 Cinder 块存储后端,底层实际是 NFS 上生成虚拟文件,模拟块设备。
NFS 存储节点(IP:192.168.108.12)
bash
mkdir /nfs_share
chmod -R 777 /nfs_share
yum -y install nfs-utils
echo "/nfs_share *(rw,sync,no_root_squash)" > /etc/exports
systemctl stop firewalld.service
systemctl restart nfs-server
systemctl enable nfs-server
Controller/cinder‑volume 节点配置
bash
mkdir -p /mnt/nfs_share
chown -R cinder:cinder /mnt/nfs_share
编辑/etc/cinder/cinder.conf
bash
enabled_backends = lvm,nfs
编辑/etc/cinder/nfs_shares
bash
192.168.108.12:/nfs_share
重启服务
bash
systemctl restart openstack-cinder-volume
后续:新建对应 NFS 后端的卷类型,创建卷选择该类型,卷就落到 NFS 存储池。
五、Cinder 完整实操:OpenStack CLI 命令行
先加载 admin 环境变量
bash
source keystonerc_admin
5.1 卷类型 & QoS

bash
# 创建公有卷类型
openstack volume type create --public VolumeType_cli
openstack volume type list
# 创建QoS,消费者后端
openstack volume qos create --consumer back-end QoS_cli
openstack volume qos list
# QoS关联卷类型
openstack volume qos associate QoS_cli VolumeType_cli
openstack volume qos show QoS_cli
5.2 卷全生命周期命令
bash
#1. 创建可启动卷,从镜像
openstack volume create --image Img_cli --type VolumeType_cli --size 1 --availability-zone nova --bootable Volume_cli_01
openstack volume list
#2. 创建测试虚拟机
openstack server create --availability-zone nova --image Img_cli --flavor Flavor_cli --network shared --key-name KeyPair_cli Instance_cli_01
#挂载卷
openstack server add volume Instance_cli_01 Volume_cli_01
openstack volume list
#卸载卷
openstack server remove volume Instance_cli_01 Volume_cli_01
#3.卷上传镜像
openstack image create --volume Volume_cli_01 --disk-format qcow2 Volume_Img_cli
openstack image list
#4.创建快照
openstack volume snapshot create --volume Volume_cli_01 Volume_Snap_cli
openstack volume snapshot list
#5.卷扩容到2G
openstack volume set --size 2 Volume_cli_01
openstack volume show Volume_cli_01
#6.快照创建卷
openstack volume create --snapshot Volume_Snap_cli Volume_cli_02
openstack volume list
#7.卷启动虚拟机
openstack server create --volume Volume_cli_02 --flavor Flavor_cli --network shared Instance_cli_02
openstack server list
#设置为非启动卷,再次创建实例直接失败
openstack volume set --non-bootable Volume_cli_02
#8.修改卷状态为error
openstack volume set --state error Volume_cli_01
#9.删除卷
#存在快照,直接删除报错,先删快照
openstack volume snapshot delete Volume_Snap_cli
openstack volume delete Volume_cli_01
#系统盘in‑use,不能直接删除;删除实例后卷释放
openstack server delete Instance_cli_02
openstack volume delete Volume_cli_02
openstack volume list
六、重点踩坑总结(面试 & 排错高频)
- 临时存储 Nova 本地盘:虚拟机删除数据消失;重要业务数据必须用 Cinder 持久卷。
- Cinder LVM 后端
cinder‑volumesVG,适合学习测试,无 HA,存储节点宕机全部卷不可用,禁止生产直接使用。 - 删除卷两个拦路虎:快照未清理、卷处于 in‑use 挂载;系统启动盘不能 detach,只能删虚拟机。
- 快照:挂载状态可以打快照,但是存在数据不一致风险,生产业务尽量停机快照。
- 卷扩容:Cinder 只是扩大块设备,虚拟机操作系统内部文件系统必须手动扩容。
bootable属性:只有可启动卷,才能作为系统盘创建虚拟机;普通数据盘不需要该标记。- Swift 对象存储:不能挂载为虚拟机磁盘,适合静态文件、镜像、备份;依靠多副本 + Ring 一致性哈希实现高可用,是最终一致性模型。
- 卷类型 + QoS:QoS 不绑定卷类型不会生效;卷类型用来调度区分不同存储后端池。
七、思考题参考答案
- 卷在已挂载的状态下,是否支持创建卷快照?会有什么影响?
支持;但虚拟机业务正在读写磁盘,快照捕获的是磁盘瞬间状态,可能出现文件系统不一致,业务建议停机后创建快照。
- 是否所有状态 "可用" 的卷都可以用来发放虚拟机实例?
不是;卷必须开启
bootable(可启动)属性,才能作为系统盘启动虚拟机;仅状态 available 不够。