各位用OpenStack的朋友,尤其是自己搭过一套Yoga版本环境的,应该都体会过这种状态:Nova、Neutron都折腾通了,虚拟机也能起来了,结果一到Cinder就卡壳。建卷、挂卷、分离卷、删卷,看起来就是几个命令的事,但真正用起来,卷状态卡住、挂载后设备不出现、删卷删不掉这类问题一个接一个。这篇就是专门讲Cinder基本使用和这些高频坑的,按我自己的实操顺序来写,从环境准备到卷的完整生命周期,再到Yoga版本里容易踩的卷分离失败问题,一条线捋下来。
Cinder在OpenStack里的定位就是块存储服务,说直白点就是给虚拟机提供“云硬盘”。它跟你自己电脑上加一块物理硬盘是一个思路,但这块盘不在本地,而是由Cinder统一管理,通过iSCSI、NFS、RBD等协议把存储后端的能力抽象成Volume提供给Nova使用。这篇内容适合刚搭完OpenStack、正准备把存储用起来的读者,也适合已经在用Cinder但遇到各种状态异常的运维同学,我会把每一步为什么要这么做、底层发生了什么都说清楚,不搞那种“你照着敲就行”的流水账教程。
我在实际环境里用的是一套三节点的Yoga部署,控制节点跑cinder-api、cinder-scheduler,存储节点跑cinder-volume,后端用的LVM。下面所有的操作和现象,我都基于这套环境来讲,命令过了验证,可以直接抄。
1. 先把Cinder的几个概念和组件理清楚
1.1 Cinder到底在管什么
Cinder管的是Block Storage,也就是块存储。它和Swift、Manila最大的区别在于使用方式:块设备是不能直接通过HTTP协议访问的,它必须被“挂”到一台虚拟机上,然后像使用普通硬盘一样使用。这意味着Cinder非常依赖底层状态的一致性——这块卷到底被谁占了、后端存储上的逻辑卷映射关系对不对、连接信息有没有失效,任何一个环节不一致,都会表现成你看到的“卷状态不对”。
Cinder自身是一套完整的服务集群,核心组件有四个:
- cinder-api:对外提供OpenStack API入口,接收所有卷操作的HTTP请求,做权限校验和请求分发。
- cinder-scheduler:负责决定一块新卷应该创建在哪个存储后端上,类似Nova的scheduler。
- cinder-volume:直接跟存储后端打交道的组件,创建、删除、扩展、快照这些底层操作都由它执行。
- cinder-backup:提供卷备份能力,可以把卷备份到Swift、NFS等对象存储里。
除此之外,还有一个隐藏角色叫cinder-brick,它是嵌在cinder-volume和nova-compute里的代码库,负责实际执行“把后端的块设备映射到宿主机”的底层操作,比如LVM的lvcreate、iSCSI的target配置、RBD的map操作。很多人排障时觉得奇怪,为什么我一个卷操作会影响到宿主机上的多路径设备,原因就在这里。
1.2 卷的状态机,是你必须背下来的东西
Cinder的卷是有状态机的。所有异常问题,本质上都可以归结为“卷落到了某个状态,却没有按预期流转下去”。我这边把最常用的几个状态列出来:
| 状态 | 含义 | 常见卡住原因 |
|---|---|---|
| available | 卷已创建,未挂载到任何实例 | 正常状态 |
| creating | 正在创建中 | 后端无响应、镜像拉取失败 |
| in-use | 已挂载给某台实例 | 正常状态 |
| attaching | 正在挂载中 | Nova与Cinder通信异常、底层连接超时 |
| detaching | 正在分离中 | Yoga版常见bug,后面会细讲 |
| error | 创建或操作失败 | 后端存储满、驱动报错 |
| error_deleting | 删除失败 | LVM逻辑卷仍被占用 |
一个从创建到挂载的完整流转是:
code复制creating → available → attaching → in-use
从实例卸载卷的流转是:
code复制in-use → detaching → available
我遇到的所有Cinder使用疑难杂症,几乎都是卡在这两条链路中间。理解状态机是排障的第一步。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 正式操作前,环境准备和命令工具
2.1 认证环境变量是第一步
Cinder的所有操作都走OpenStack API认证,在那之前必须先加载你的租户环境变量。我平时用的admin用户文件叫admin-openrc,内容大概是这样:
bash复制export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=admin
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=你的密码
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDE
