文章背景图

OpenStack 镜像与块存储实践:Glance、Cinder、快照和备份

2026-07-25
3
-
- 分钟

OpenStack 中“镜像、实例磁盘、卷、快照和备份”经常被混为一谈。Glance 管理可重复使用的镜像,Cinder 管理持久块存储;实例快照、卷快照和卷备份又有不同恢复目标。先分清对象,再设计迁移与灾备流程。

## 1. 镜像、卷和快照的区别

- Glance Image:用于创建实例或卷的模板,常见格式有 qcow2、raw、vmdk、vhd 和 iso。

- Instance local disk:由计算节点或共享后端提供的临时根盘,实例删除时通常随之删除。

- Cinder Volume:独立于实例生命周期的块设备,可附加、分离、快照和备份。

- Server Image:从实例创建的镜像,适合生成模板,但一致性取决于操作方式。

- Volume Snapshot:同一存储体系中的时间点快照,通常依赖原卷或后端能力。

- Volume Backup:把卷数据复制到备份后端,恢复能力更独立,但需要验证数据库与元数据。

## 2. 上传镜像前的检查

```bash

qemu-img info source.qcow2

qemu-img check source.qcow2

sha256sum source.qcow2

```

检查项:

- 文件格式与实际内容一致。

- 镜像来源可信且校验和正确。

- 已安装 VirtIO 磁盘和网卡驱动。

- cloud-init 或等价初始化机制可用。

- 没有遗留 SSH host key、历史日志、Token 和个人账号。

- 已安装必要安全更新,并清理临时文件。

## 3. 格式转换与压缩

```bash

qemu-img convert -p -f qcow2 -O raw source.qcow2 target.raw

qemu-img convert -p -c -f qcow2 -O qcow2 source.qcow2 compact.qcow2

```

转换前确保源文件不再被虚拟机写入,并保留校验值。raw 通常占用更多空间但后端处理简单;qcow2 支持稀疏、压缩和快照等特性。选择格式应基于 Glance、Nova、Ceph 或其他存储后端的实际支持。

## 4. 上传和管理 Glance 镜像

```bash

openstack image create \

--file compact.qcow2 \

--disk-format qcow2 \

--container-format bare \

--private \

--property os_type=linux \

--property os_distro=ubuntu \

app-image-2026-07

openstack image show app-image-2026-07

openstack image set --protected app-image-2026-07

```

默认使用 private 更安全。需要跨项目共享时,应采用受控的 shared/community 流程,而不是为了方便直接设为 public。

下载镜像:

```bash

openstack image save \

--file app-image-2026-07.qcow2 \

app-image-2026-07

sha256sum app-image-2026-07.qcow2

```

## 5. 从 ISO 制作云镜像

ISO 不是已经安装好的云镜像。常见流程:

1. 上传 ISO,创建适合安装的 flavor 和空白卷。

2. 启动安装实例,将系统安装到卷。

3. 安装 cloud-init、VirtIO 驱动和 qemu-guest-agent。

4. 清理机器唯一信息、网络固定配置、密码和日志。

5. 关机,确保文件系统一致。

6. 从卷创建镜像或上传到 Glance。

7. 用新镜像创建测试实例,验证登录、网络、扩盘和 cloud-init。

不要把真实管理员密码固化进镜像。优先使用 SSH Key、随机初始化密码或受控的凭证注入。

## 6. 创建、附加和分离卷

```bash

openstack volume create --size 20 data-volume

openstack volume show data-volume

openstack server add volume VM_NAME data-volume

openstack volume list --server VM_NAME

```

在 guest 中还需确认设备并创建文件系统:

```bash

lsblk

sudo blkid

sudo mount /dev/vdb1 /data

```

设备名仅为示例,应以实际识别结果为准。分离卷前先停止应用写入、同步数据并卸载文件系统:

```bash

sudo umount /data

openstack server remove volume VM_NAME data-volume

```

强制分离可能导致数据损坏或 Nova/Cinder 状态不一致,只应在确认底层连接状态和恢复方案后使用。

## 7. Boot from Volume

```bash

openstack server create \

--flavor general-4c8g \

--image app-image-2026-07 \

--boot-from-volume 40 \

--network app-net \

volume-boot-vm

```

是否随实例删除根卷取决于创建参数和 API 版本。关键业务应明确 delete-on-termination 策略,避免实例删除后根卷意外丢失,或长期遗留无主卷造成费用和数据风险。

## 8. 实例镜像、卷快照与卷备份

创建实例镜像:

```bash

openstack server image create --name vm-template VM_NAME

```

创建卷快照:

```bash

openstack volume snapshot create \

--volume data-volume \

data-snapshot

```

创建卷备份:

```bash

openstack volume backup create data-volume

openstack volume backup list

openstack volume backup show BACKUP_ID

```

数据库等有状态应用在快照前应执行应用一致性操作:暂停写入、flush、冻结文件系统或使用数据库原生备份。存储层快照成功不代表业务数据一定可恢复。

## 9. 恢复验证

备份必须定期恢复到隔离环境:

1. 从镜像创建新实例或从备份恢复新卷。

2. 检查文件系统和应用数据。

3. 验证启动、网络、认证和依赖服务。

4. 记录恢复时间、数据恢复点和缺失项。

5. 删除测试资源并保留验证报告。

灾难恢复还需要同时保护 OpenStack 控制面数据库、消息队列配置、Cinder 备份元数据、Glance 元数据和密钥。只保存一个 qcow2 文件并不是完整云平台备份。

## 10. 常见故障

- 镜像长期 queued:检查 glance-api、后端权限、容量和上传连接。

- 实例启动后找不到根盘:检查格式、虚拟总线、镜像属性和计算节点缓存。

- 卷卡在 attaching/detaching:对照 Nova attachment、Cinder volume attachment 和底层存储映射。

- 快照失败:检查卷状态、后端是否支持、配额和存储空间。

- 恢复后系统不能启动:检查 bootloader、磁盘控制器、分区 UUID 和 cloud-init 配置。

不要只通过修改数据库状态来清除错误。先确认控制面记录与实际存储设备,再采用官方恢复命令或后端文档流程。

## 参考资料

- https://docs.openstack.org/python-openstackclient/latest/cli/command-objects/image-v2.html

- https://docs.openstack.org/python-openstackclient/latest/cli/command-objects/volume.html

- https://docs.openstack.org/cinder/latest/admin/volume-backups.html

原创

OpenStack 镜像与块存储实践:Glance、Cinder、快照和备份

本文链接: OpenStack 镜像与块存储实践:Glance、Cinder、快照和备份

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

评论交流

文章目录