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 四大核心组件
交互流程(创建卷)
生产提示: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
API 访问格式:/v1/{account}/{container}/{object},全部基于 HTTP RESTful 接口。
3.2 关键技术
3.3 Swift 和其他组件交互
❗Swift 不能直接挂载给虚拟机作为磁盘,不能做操作系统盘。
四、Cinder 完整实操:Dashboard 图形界面

实验环境 OpenStack Yoga,admin 管理员账号,同时具备项目普通权限。
4.1 卷类型与 QoS 管理
4.2 卷生命周期全套操作
① 创建卷
项目 → 卷 → 创建卷
- 名称:Volume_web_01;来源镜像 Img_web;类型 VolumeType_web;大小 1G;可用分区 nova。 创建完成状态:available可用。
② 挂载 / 卸载卷
前提:已经存在测试虚拟机 Instance_web_01
原理: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。用于底层存储故障,人工标记故障卷。
⑨ 删除卷(高频踩坑)
删除卷两大硬性限制:
实验现象:直接删除有快照的卷,页面报错;删除系统盘卷提示失败;删除关联虚拟机之后卷才能正常删除。
4.3 拓展:Cinder 对接 NFS 存储后端实操

NFS 可以作为 Cinder 块存储后端,底层实际是 NFS 上生成虚拟文件,模拟块设备。
NFS 存储节点(IP:192.168.108.12)
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 节点配置
mkdir -p /mnt/nfs_share
chown -R cinder:cinder /mnt/nfs_share
编辑/etc/cinder/cinder.conf
enabled_backends = lvm,nfs
编辑/etc/cinder/nfs_shares
192.168.108.12:/nfs_share
重启服务
systemctl restart openstack-cinder-volume
后续:新建对应 NFS 后端的卷类型,创建卷选择该类型,卷就落到 NFS 存储池。
五、Cinder 完整实操:OpenStack CLI 命令行
先加载 admin 环境变量
source keystonerc_admin
5.1 卷类型 & QoS

# 创建公有卷类型
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 卷全生命周期命令
#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
六、重点踩坑总结(面试 & 排错高频)
七、思考题参考答案
支持;但虚拟机业务正在读写磁盘,快照捕获的是磁盘瞬间状态,可能出现文件系统不一致,业务建议停机后创建快照。
不是;卷必须开启bootable(可启动)属性,才能作为系统盘启动虚拟机;仅状态 available 不够。



