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