卷建好只是开始——挂载、扩容、打快照、传成镜像、拿去发实例,每一步都有前置条件;删卷删不掉更是三条依赖链叠出来的经典现场。这篇按卷的一生走完 Dashboard 与 CLI 两套操作:卷类型与 QoS → 创建挂载 → 快照/镜像/扩容 → 基于卷发实例 → 更新状态 → 删除依赖链,最后把NFS 作为第二后端接进 cinder-volume。全部命令在
192.168.108.10环境(admin 项目、shared网络、镜像Img_web/Img_cli)验证过,可直接照抄。
本文概要:
| 项目 | 内容 |
|---|---|
| 文章主题 | 卷类型/QoS 管理 + 卷从创建到删除的全生命周期操作 + NFS 第二后端接入 |
| 所属类别 | 云计算 → 私有云平台 → OpenStack 存储管理 |
| 知识关键字 | volume type·QoS·server add volume·volume snapshot·--bootable·volume set --state·enabled_backends·nfs_shares |
主线的因果只有一条:卷的每个状态(available / in-use / error)决定了它能做什么、不能做什么——挂载要在 available、扩容快照要在 available、删除要先把快照和挂载清干净。操作顺序错一步,报错就找上门。
一、卷类型与 QoS:先定规格再建卷
卷类型(volume type)是卷的「规格标签」,QoS(Quality of Service,服务质量)挂到卷类型上,建卷时选了类型就同时吃到这组策略。
1.1 Dashboard 路径
以 admin 登录,走「管理员 → 卷 → 卷类型」:
| 步 | 操作 | 关键点 |
|---|---|---|
| 1 | 点「创建卷类型」,名称VolumeType_web | 勾选「公有」让所有项目可用 |
| 2 | 点「创建 QoS 规格」,名称QoS_web | 「消费者」选「后端」(back-end) |
| 3 | 卷类型行操作里选「管理 QoS 规格关联」 | 把QoS_web关联到VolumeType_web |
| 4 | 回到列表确认 QoS 规格已挂上 | 之后按此类型建的卷都生效 |
1.2 CLI 六条命令
[root@controller ~(keystone_admin)]# source keystonerc_admin # 中文:导入 admin 环境变量[root@controller ~(keystone_admin)]# openstack volume type create --public VolumeType_cli# 中文:创建公有卷类型 VolumeType_cli[root@controller ~(keystone_admin)]# openstack volume type list # 查看卷类型列表[root@controller ~(keystone_admin)]# openstack volume qos create --consume back-end QoS_cli# 中文:创建 QoS 规格 QoS_cli,消费者为后端[root@controller ~(keystone_admin)]# openstack volume qos list # 查看 QoS 列表[root@controller ~(keystone_admin)]# openstack volume qos associate QoS_cli VolumeType_cli# 中文:把 QoS_cli 关联到卷类型 VolumeType_cli[root@controller ~(keystone_admin)]# openstack volume qos show QoS_cli # 查看该 QoS 关联的卷类型二、创建卷与挂载/卸载
2.1 创建卷
一条命令带齐五个要素——来源、类型、大小、可用分区、是否启动卷:
[root@controller ~(keystone_admin)]# openstack volume create --image Img_cli --type VolumeType_cli \>--size1--availability-zone nova--bootableVolume_cli_01# 中文:从镜像 Img_cli 创建 1GB 启动卷,类型 VolumeType_cli,AZ 为 nova[root@controller ~(keystone_admin)]# openstack volume list # 中文:查看卷列表,状态 available 即可用Dashboard 对应「项目 → 卷 → 卷 → 创建卷」:卷来源选「镜像」、类型选VolumeType_web、大小 1 GB、可用分区nova,创建后状态「可用」。
2.2 挂载与卸载
# 前置:先有一台实例[root@controller ~(keystone_admin)]# openstack server create --availability-zone nova --image Img_cli \>--flavorFlavor_cli--networkshared --key-name KeyPair_cli Instance_cli_01[root@controller ~(keystone_admin)]# openstack server add volume Instance_cli_01 Volume_cli_01# 中文:把卷 Volume_cli_01 挂载给实例 Instance_cli_01,卷状态变 in-use[root@controller ~(keystone_admin)]# openstack server remove volume Instance_cli_01 Volume_cli_01# 中文:卸载——把卷从实例上摘下来,卷状态回到 available⚠️注意:挂载后卷状态
in-use,此时扩容、删除都不行;先卸载回available再操作。挂载在实例里看是/dev/vdb这类块设备,分区格式化后才真正能用。
三、卷的三个衍生操作:传镜像、打快照、扩容
3.1 上传卷到镜像
[root@controller ~(keystone_admin)]# openstack image create --volume Volume_cli_01 --disk-format qcow2 Volume_Img_cli# 中文:把卷 Volume_cli_01 转成 qcow2 格式的镜像 Volume_Img_cliDashboard 里是卷行操作的「上传镜像」,磁盘格式选 QCOW2;完成后在「项目 → 计算 → 镜像」能看到新镜像(可见性为「共享的」)。这一步常用来把配好环境的系统盘固化成模板。
3.2 创建卷快照
[root@controller ~(keystone_admin)]# openstack volume snapshot create --volume Volume_cli_01 Volume_Snap_cli# 中文:为卷 Volume_cli_01 创建快照 Volume_Snap_cli[root@controller ~(keystone_admin)]# openstack volume snapshot list # 查看快照列表基于快照可以再拉出新卷,新卷内容就定格在打快照那一刻:
[root@controller ~(keystone_admin)]# openstack volume create --snapshot Volume_Snap_cli Volume_cli_02# 中文:基于快照 Volume_Snap_cli 创建新卷 Volume_cli_023.3 卷扩容
[root@controller ~(keystone_admin)]# openstack volume set --size 2 Volume_cli_01# 中文:把卷扩容到 2GB——只允许变大,不允许缩小[root@controller ~(keystone_admin)]# openstack volume show Volume_cli_01 # 核对 size 字段⚠️注意:扩容只放大了块设备,实例内的分区和文件系统还要自己扩;且卷挂载着(in-use)时扩容行为受后端限制,稳妥做法是卸载后再扩。
四、基于卷发放实例:bootable 是道闸门
[root@controller ~(keystone_admin)]# openstack server create --volume Volume_cli_02 --flavor Flavor_cli \>--networkshared Instance_cli_02# 中文:直接以卷 Volume_cli_02 为源发放实例(不再需要镜像)# 把卷改成非启动卷再试:[root@controller ~(keystone_admin)]# openstack volume set --non-bootable Volume_cli_02[root@controller ~(keystone_admin)]# openstack server create --volume Volume_cli_02 --flavor Flavor_cli Instance_cli_03# 中文:发放失败——非启动卷不能作为实例的源结论:卷的bootable标志为否(非启动卷)时,无法基于该卷发放虚拟机实例。Dashboard 里对应卷行「编辑卷 → 可启动」的勾选框。不是所有 available 的卷都能发实例,先看这个标志。
五、更新卷状态:管理员的后门
卷卡在异常状态时,admin 可以手工改状态(管理员 → 卷 → 卷 → 更新卷状态):
[root@controller ~(keystone_admin)]# openstack volume set --state error Volume_cli_01# 中文:把卷状态强行改成 error——用于排障演练,正常环境别乱用六、删不掉的卷:三条依赖链
删除卷(openstack volume delete/ Dashboard 删除卷)报错时,按顺序排查:
| # | 报错原因 | 解法 |
|---|---|---|
| 1 | 卷有快照 | 先删快照:openstack volume snapshot delete Volume_Snap_cli,再删卷 |
| 2 | 卷in-use | 先卸载:openstack server remove volume <实例> <卷>,回 available 再删 |
| 3 | 卷是系统卷(实例正以它为根) | 系统卷无法卸载——只能先删实例:openstack server delete Instance_cli_02 |
三条全占的卷,就按 1 → 2 → 3 一层层拆。实验里Volume_cli_02(挂给Instance_cli_02的系统卷)就是典型:删卷被拒 → 卸载被拒(系统卷)→ 删实例 → 再删卷才成功。
七、NFS 第二后端:cinder-volume 一拖二
实验新增一台 NFS 节点(IP192.168.108.12),三步接入。
7.1 NFS 节点:把目录共享出去
mkdir/nfs_share# 中文:创建共享目录chmod-R777/nfs_share# 中文:放开权限(实验环境图省事)yum-yinstallnfs-utils# 中文:安装 NFS 工具包echo"/nfs_share *(rw,sync,no_root_squash)">/etc/exports# 中文:把共享规则写入 exports——所有客户端可读写同步、不映射 rootsystemctl stop firewalld.service# 中文:关防火墙(实验环境)systemctl restart nfs-server&&systemctlenablenfs-server# 中文:重启并开机自启controller / compute 节点先建挂载点并验证能挂:mkdir /mnt/nfs_share。
7.2 controller 节点:cinder.conf 加 [nfs] 段
[DEFAULT] enabled_backends = lvm,nfs # 中文:cinder-volume 同时启用两个后端 [nfs] volume_backend_name = nfs # 后端名,卷类型靠它认门 nfs_shares_config = /etc/cinder/nfs_shares # 共享清单文件 nfs_mount_point_base = /mnt/nfs_share # 本机挂载点基目录共享清单/etc/cinder/nfs_shares每行一条 NFS 导出:
[root@controller ~]# vim /etc/cinder/nfs_shares192.168.108.12:/nfs_share# 想再加共享目录就继续往下写行[root@controller ~]# mkdir -p /mnt/nfs_share[root@controller ~]# chown -R cinder:cinder /mnt/nfs_share # 中文:目录归属 cinder 用户[root@controller ~]# systemctl restart openstack-cinder-volume# 中文:重启 cinder-volume 让新后端生效7.3 建卷类型绑定后端,再建卷验证
关键一步:按volume_backend_name创建对应卷类型(nfs),否则卷不知道往哪个后端放。建卷时类型选 nfs 的落 NFS 节点,选 iscsi(lvm)的落本地卷组——调度逻辑见姊妹篇第 4.2 节的 Filter/Weigher。最后用 NFS 卷发一台实例,到 NFS 节点上能看到卷数据文件,整条链路才算打通。
附:命令英文全称速查表
| 命令 | 英文全称 | 含义 |
|---|---|---|
volume type | volume type | 卷类型 |
qos | Quality of Service | 服务质量(限速策略) |
--consume | consume | QoS 消费端(front-end / back-end) |
associate | associate | 关联 |
--image | image | 以指定镜像为卷来源 |
--bootable/--non-bootable | bootable | 可启动 / 不可启动 |
server add volume | server add volume | 给实例挂卷 |
server remove volume | server remove volume | 从实例卸卷 |
snapshot | snapshot | 快照 |
--size | size | 卷大小(GiB,只增不减) |
--state | state | 强制设置卷状态 |
--disk-format qcow2 | disk format | 磁盘格式(QEMU copy-on-write v2) |
nfs | Network File System | 网络文件系统 |
exports | exports | NFS 共享规则配置文件 |
no_root_squash | 不压缩 root | 客户端 root 保持 root 权限 |
chown | change owner | 修改文件属主 |
enabled_backends | enabled backends | 启用的后端列表 |