OpenStack Cinder 创建卷引言什么是 Cinder 卷在云计算的世界里存储资源就像水和电一样需要按需分配。OpenStack Cinder块存储服务正是扮演这个角色——它负责管理虚拟机VM的持久化存储设备。Cinder 创建的“卷”Volume本质上是一个虚拟硬盘可以挂载到虚拟机实例上提供额外的存储空间。无论你是想扩展云服务器的磁盘还是搭建数据库集群Cinder 卷都是不可或缺的基础组件。今天我们就用通俗易懂的方式结合代码示例一步步掌握 Cinder 卷的创建过程。别担心即使你刚接触 OpenStack也能跟着操作—## 准备工作了解 Cinder 架构在动手之前先花一分钟理解 Cinder 的工作流程。当你创建一个卷时Cinder 会做三件事1.调度SchedulingCinder Scheduler 选择合适的存储后端如 LVM、Ceph、NFS 等。2.创建Provisioning在选定的后端上实际分配存储空间。3.元数据记录Metadata在数据库中记录卷信息如 ID、大小、状态。Cinder 支持多种存储后端但最常用的是 LVM本地逻辑卷管理和 Ceph分布式存储。本文假设你已有一个可运行的 OpenStack 环境如 DevStack 或生产部署。—## 方法一使用 OpenStack CLI 创建卷对于运维人员来说命令行是最直接的工具。OpenStack 提供了openstack volume create命令。我们先从最简单的场景开始。### 示例 1创建一个 10GB 的空白卷bash# 创建一个名为 my-first-volume 的卷大小 10GBopenstack volume create --size 10 my-first-volume# 输出示例# -----------------------------------------------------------# | Field | Value |# -----------------------------------------------------------# | attachments | [] |# | availability_zone | nova |# | bootable | false |# | consistencygroup_id | None |# | created_at | 2023-10-01T12:00:00.000000 |# | description | None |# | encrypted | False |# | id | 1234abcd-5678-efgh-ijkl-9012mnop3456 |# | migration_status | None |# | multiattach | False |# | name | my-first-volume |# | properties | |# | replication_status | None |# | size | 10 |# | snapshot_id | None |# | source_volid | None |# | status | creating |# | type | __DEFAULT__ |# | updated_at | 2023-10-01T12:00:01.000000 |# | user_id | admin-user-id |# -----------------------------------------------------------关键字段解释-id卷的唯一标识符后续挂载、删除都靠它。-status刚开始是 “creating”几秒后变为 “available” 表示就绪。-size单位是 GB。-bootable是否为可启动卷用于创建云主机系统盘。### 常见参数扩展bash# 创建卷时指定卷类型例如高性能SSDopenstack volume create --size 50 --type ssd-gold my-data-volume# 创建卷并设置描述openstack volume create --size 20 --description Database backup storage db-backup# 从快照创建卷恢复备份openstack volume create --snapshot db-snapshot-20231001 --size 20 restored-volume注意如果后端存储空间不足创建会失败返回ERROR: No valid backend was found。—## 方法二使用 Python SDK 自动化创建卷当需要批量创建卷或集成到自动化脚本时Python SDK 是更好的选择。OpenStack 官方提供了openstacksdk库封装了 REST API。### 示例 2Python 脚本批量创建卷python#!/usr/bin/env python3# -*- coding: utf-8 -*-批量创建 Cinder 卷的示例脚本需要安装pip install openstacksdkimport openstackimport time# 初始化连接从环境变量读取认证信息如 OS_AUTH_URL, OS_PROJECT_NAME 等conn openstack.connect()def create_volume(name, size_gb, descriptionNone): 创建一个 Cinder 卷并返回其 ID Args: name (str): 卷名称 size_gb (int): 卷大小GB description (str, optional): 描述信息 Returns: str: 卷的 UUID try: # 调用 SDK 创建卷 volume conn.block_storage.create_volume( namename, sizesize_gb, descriptiondescription or fVolume created by script at {time.ctime()}, # 可选参数volume_typessd-gold, availability_zonenova ) print(f[OK] 卷 {name} 创建中ID: {volume.id}) # 等待卷变为可用状态超时60秒 conn.block_storage.wait_for_status( volume, statusavailable, failures[error], interval2, # 每2秒检查一次 wait60 ) print(f[OK] 卷 {name} 状态变为 available) return volume.id except openstack.exceptions.SDKException as e: print(f[ERROR] 创建卷失败: {e}) return Nonedef list_all_volumes(): 列出当前项目下所有卷 volumes conn.block_storage.volumes() print(\n当前所有卷列表) print(- * 60) for vol in volumes: print(fID: {vol.id[:8]}... | 名称: {vol.name:20} | 大小: {vol.size:3}GB | 状态: {vol.status}) print(- * 60)# 主程序if __name__ __main__: # 批量创建3个卷 volumes_to_create [ (web-data-01, 20, Web服务器数据), (db-logs-02, 50, 数据库日志), (backup-temp, 100, 临时备份), ] created_ids [] for name, size, desc in volumes_to_create: vol_id create_volume(name, size, desc) if vol_id: created_ids.append(vol_id) # 显示结果 list_all_volumes() # 可选清理测试环境注释掉以避免误删 # for vol_id in created_ids: # conn.block_storage.delete_volume(vol_id) # print(f已删除卷 {vol_id})脚本运行效果[OK] 卷 web-data-01 创建中ID: abc12345-...[OK] 卷 web-data-01 状态变为 available[OK] 卷 db-logs-02 创建中ID: def67890-...[OK] 卷 db-logs-02 状态变为 available[OK] 卷 backup-temp 创建中ID: ghi11111-...[OK] 卷 backup-temp 状态变为 available当前所有卷列表------------------------------------------------------------ID: abc12345... | 名称: web-data-01 | 大小: 20GB | 状态: availableID: def67890... | 名称: db-logs-02 | 大小: 50GB | 状态: availableID: ghi11111... | 名称: backup-temp | 大小: 100GB | 状态: available------------------------------------------------------------代码关键点-connect()自动读取环境变量无需手动输入密码。-wait_for_status保证了卷创建完成后再进行后续操作避免竞态条件。- 异常处理捕获网络问题或权限错误脚本更健壮。—## 进阶场景从镜像创建可启动卷有时你需要创建一个包含操作系统的卷用于直接启动虚拟机。这需要从 Glance 镜像创建bash# 列出可用镜像openstack image list# 从 Ubuntu 22.04 镜像创建可启动卷需指定 bootable 参数openstack volume create --image ubuntu-22.04 --bootable --size 20 my-boot-volumePython SDK 版本pythonvolume conn.block_storage.create_volume( nameboot-volume, size20, imageRefubuntu-22.04-image-uuid, # 从 glance 获取镜像 ID bootableTrue)—## 常见问题与排错### 1. 卷创建后状态一直是 creating原因存储后端资源不足或网络延迟。解决检查 Cinder 日志/var/log/cinder/volume.log或使用openstack volume show volume-id查看详细信息。### 2. “No valid backend was found” 错误原因Cinder 没有配置可用的存储后端或所有后端容量已满。解决运行cinder-manage service list检查服务状态或添加新的存储后端。### 3. 权限不足原因用户角色没有volume_creator权限。解决联系管理员添加权限或在 Horizon 面板中检查项目配额。—## 总结通过本文我们从三个层面掌握了 OpenStack Cinder 卷的创建1.命令行工具快速验证和手动操作适合日常运维。2.Python SDK自动化批量创建适合编排和集成。3.进阶技巧从镜像创建启动卷理解卷与虚拟机的绑定关系。Cinder 卷的创建只是第一步后续还有挂载到虚拟机、扩容、快照、迁移等操作。记住一个核心原则卷是独立的存储单元可以自由移动和复制但挂载前需要格式化文件系统除非从镜像创建。如果你在实验过程中遇到问题不妨先从openstack volume list和日志文件开始排查。存储是云平台的基石掌握 Cinder 会让你对 OpenStack 的理解更上一层楼。
OpenStack Cinder 创建卷
OpenStack Cinder 创建卷引言什么是 Cinder 卷在云计算的世界里存储资源就像水和电一样需要按需分配。OpenStack Cinder块存储服务正是扮演这个角色——它负责管理虚拟机VM的持久化存储设备。Cinder 创建的“卷”Volume本质上是一个虚拟硬盘可以挂载到虚拟机实例上提供额外的存储空间。无论你是想扩展云服务器的磁盘还是搭建数据库集群Cinder 卷都是不可或缺的基础组件。今天我们就用通俗易懂的方式结合代码示例一步步掌握 Cinder 卷的创建过程。别担心即使你刚接触 OpenStack也能跟着操作—## 准备工作了解 Cinder 架构在动手之前先花一分钟理解 Cinder 的工作流程。当你创建一个卷时Cinder 会做三件事1.调度SchedulingCinder Scheduler 选择合适的存储后端如 LVM、Ceph、NFS 等。2.创建Provisioning在选定的后端上实际分配存储空间。3.元数据记录Metadata在数据库中记录卷信息如 ID、大小、状态。Cinder 支持多种存储后端但最常用的是 LVM本地逻辑卷管理和 Ceph分布式存储。本文假设你已有一个可运行的 OpenStack 环境如 DevStack 或生产部署。—## 方法一使用 OpenStack CLI 创建卷对于运维人员来说命令行是最直接的工具。OpenStack 提供了openstack volume create命令。我们先从最简单的场景开始。### 示例 1创建一个 10GB 的空白卷bash# 创建一个名为 my-first-volume 的卷大小 10GBopenstack volume create --size 10 my-first-volume# 输出示例# -----------------------------------------------------------# | Field | Value |# -----------------------------------------------------------# | attachments | [] |# | availability_zone | nova |# | bootable | false |# | consistencygroup_id | None |# | created_at | 2023-10-01T12:00:00.000000 |# | description | None |# | encrypted | False |# | id | 1234abcd-5678-efgh-ijkl-9012mnop3456 |# | migration_status | None |# | multiattach | False |# | name | my-first-volume |# | properties | |# | replication_status | None |# | size | 10 |# | snapshot_id | None |# | source_volid | None |# | status | creating |# | type | __DEFAULT__ |# | updated_at | 2023-10-01T12:00:01.000000 |# | user_id | admin-user-id |# -----------------------------------------------------------关键字段解释-id卷的唯一标识符后续挂载、删除都靠它。-status刚开始是 “creating”几秒后变为 “available” 表示就绪。-size单位是 GB。-bootable是否为可启动卷用于创建云主机系统盘。### 常见参数扩展bash# 创建卷时指定卷类型例如高性能SSDopenstack volume create --size 50 --type ssd-gold my-data-volume# 创建卷并设置描述openstack volume create --size 20 --description Database backup storage db-backup# 从快照创建卷恢复备份openstack volume create --snapshot db-snapshot-20231001 --size 20 restored-volume注意如果后端存储空间不足创建会失败返回ERROR: No valid backend was found。—## 方法二使用 Python SDK 自动化创建卷当需要批量创建卷或集成到自动化脚本时Python SDK 是更好的选择。OpenStack 官方提供了openstacksdk库封装了 REST API。### 示例 2Python 脚本批量创建卷python#!/usr/bin/env python3# -*- coding: utf-8 -*-批量创建 Cinder 卷的示例脚本需要安装pip install openstacksdkimport openstackimport time# 初始化连接从环境变量读取认证信息如 OS_AUTH_URL, OS_PROJECT_NAME 等conn openstack.connect()def create_volume(name, size_gb, descriptionNone): 创建一个 Cinder 卷并返回其 ID Args: name (str): 卷名称 size_gb (int): 卷大小GB description (str, optional): 描述信息 Returns: str: 卷的 UUID try: # 调用 SDK 创建卷 volume conn.block_storage.create_volume( namename, sizesize_gb, descriptiondescription or fVolume created by script at {time.ctime()}, # 可选参数volume_typessd-gold, availability_zonenova ) print(f[OK] 卷 {name} 创建中ID: {volume.id}) # 等待卷变为可用状态超时60秒 conn.block_storage.wait_for_status( volume, statusavailable, failures[error], interval2, # 每2秒检查一次 wait60 ) print(f[OK] 卷 {name} 状态变为 available) return volume.id except openstack.exceptions.SDKException as e: print(f[ERROR] 创建卷失败: {e}) return Nonedef list_all_volumes(): 列出当前项目下所有卷 volumes conn.block_storage.volumes() print(\n当前所有卷列表) print(- * 60) for vol in volumes: print(fID: {vol.id[:8]}... | 名称: {vol.name:20} | 大小: {vol.size:3}GB | 状态: {vol.status}) print(- * 60)# 主程序if __name__ __main__: # 批量创建3个卷 volumes_to_create [ (web-data-01, 20, Web服务器数据), (db-logs-02, 50, 数据库日志), (backup-temp, 100, 临时备份), ] created_ids [] for name, size, desc in volumes_to_create: vol_id create_volume(name, size, desc) if vol_id: created_ids.append(vol_id) # 显示结果 list_all_volumes() # 可选清理测试环境注释掉以避免误删 # for vol_id in created_ids: # conn.block_storage.delete_volume(vol_id) # print(f已删除卷 {vol_id})脚本运行效果[OK] 卷 web-data-01 创建中ID: abc12345-...[OK] 卷 web-data-01 状态变为 available[OK] 卷 db-logs-02 创建中ID: def67890-...[OK] 卷 db-logs-02 状态变为 available[OK] 卷 backup-temp 创建中ID: ghi11111-...[OK] 卷 backup-temp 状态变为 available当前所有卷列表------------------------------------------------------------ID: abc12345... | 名称: web-data-01 | 大小: 20GB | 状态: availableID: def67890... | 名称: db-logs-02 | 大小: 50GB | 状态: availableID: ghi11111... | 名称: backup-temp | 大小: 100GB | 状态: available------------------------------------------------------------代码关键点-connect()自动读取环境变量无需手动输入密码。-wait_for_status保证了卷创建完成后再进行后续操作避免竞态条件。- 异常处理捕获网络问题或权限错误脚本更健壮。—## 进阶场景从镜像创建可启动卷有时你需要创建一个包含操作系统的卷用于直接启动虚拟机。这需要从 Glance 镜像创建bash# 列出可用镜像openstack image list# 从 Ubuntu 22.04 镜像创建可启动卷需指定 bootable 参数openstack volume create --image ubuntu-22.04 --bootable --size 20 my-boot-volumePython SDK 版本pythonvolume conn.block_storage.create_volume( nameboot-volume, size20, imageRefubuntu-22.04-image-uuid, # 从 glance 获取镜像 ID bootableTrue)—## 常见问题与排错### 1. 卷创建后状态一直是 creating原因存储后端资源不足或网络延迟。解决检查 Cinder 日志/var/log/cinder/volume.log或使用openstack volume show volume-id查看详细信息。### 2. “No valid backend was found” 错误原因Cinder 没有配置可用的存储后端或所有后端容量已满。解决运行cinder-manage service list检查服务状态或添加新的存储后端。### 3. 权限不足原因用户角色没有volume_creator权限。解决联系管理员添加权限或在 Horizon 面板中检查项目配额。—## 总结通过本文我们从三个层面掌握了 OpenStack Cinder 卷的创建1.命令行工具快速验证和手动操作适合日常运维。2.Python SDK自动化批量创建适合编排和集成。3.进阶技巧从镜像创建启动卷理解卷与虚拟机的绑定关系。Cinder 卷的创建只是第一步后续还有挂载到虚拟机、扩容、快照、迁移等操作。记住一个核心原则卷是独立的存储单元可以自由移动和复制但挂载前需要格式化文件系统除非从镜像创建。如果你在实验过程中遇到问题不妨先从openstack volume list和日志文件开始排查。存储是云平台的基石掌握 Cinder 会让你对 OpenStack 的理解更上一层楼。