Volume is smaller than the minimum size specified in image

一、环境

OpenStack M版,后端存储 Ceph J版(nova,cinder,glance都对接ceph集群)。

二、问题描述

先用 boot from volume 方式创建一台虚机 vm1,卷大小选11 G (大于镜像大小)。
Volume is smaller than the minimum size specified in image

镜像大小为10G,格式为raw 。(当OpenStack使用Ceph共享存储时,镜像无需下载到本地再上传到后端,而是直接使用clone,配合Ceph支持的COW技术几乎可以完成虚拟机的秒级启动。前提是使用raw格式的镜像,因为Ceph不支持从qcow2的镜像引导,若使用qcow2镜像创建虚拟机,则需要将镜像下载到本地转换成raw格式再上传,不仅增加启动时间,而且还可能因为空间不足无法完成镜像的格式转换从而造成虚拟机启动失败,所以建议直接使用raw格式的镜像创建虚拟机。)
Volume is smaller than the minimum size specified in image

flavor 选择 1VCPU、2GB内存、20G根磁盘。
Volume is smaller than the minimum size specified in image

启动实例后,OpenStack 会完成如下工作:
1. 在 ceph 中创建一个 11 GB 的 volume。
2. 将 image 数据拷贝到该 volume。
3. instance 从该 volume 启动。

在卷管理界面可以看到这个新创建的 volume。
Volume is smaller than the minimum size specified in image

登陆虚机后通过 lsblk 可以看到,虚机的磁盘大小为 11 G,也就是设置的卷的大小,和 flavor 没有关系。
Volume is smaller than the minimum size specified in image

对此虚机做快照 vm1-sh,瞬间就可以完成。注意到快照 vm1-sh 的大小是 0 字节,这是因为它真正的存放位置在 ceph。
Volume is smaller than the minimum size specified in image

通过vm1-sh 部署出来的实例直接就是 boot from volume 的。我们现在基于 vm1-sh 启动新的虚机 vm2 。
Volume is smaller than the minimum size specified in image

flavor 仍然选择 1VCPU、2GB内存、20G根磁盘。
Volume is smaller than the minimum size specified in image

启动实例时,报错:

错误: 无法创建服务器。

查看日志:

HTTP exception thrown: Volume is smaller than the minimum size specified in image metadata. Volume size is 11811160064 bytes, minimum size is 21474836480 bytes.

意思是:卷的大小(11G)比镜像的metadata中设置的minimum size(20G)小。

三、解决方案

我们先查看下 vm1-sh 镜像的设置,最小磁盘那设的值为 20 G。这个是创建快照的虚机 vm1 的 flavor 设置的磁盘大小。
Volume is smaller than the minimum size specified in image
而 11 G应该是卷的大小,这个值在 vm1-sh 镜像的元数据中设置(也就是 boot from volume 卷的大小)。
Volume is smaller than the minimum size specified in image

那我们的解决办法就有了:

编辑镜像 vm1-sh ,把最小磁盘数改为 0 (表示没有限制)。这样基于 vm1-sh 启动的虚机仍为 boot from volume 的,而且卷大小也为 11 G。也可以修改 vm1-sh 的元数据信息,重新设置 volume_size 的大小,比如 volume_size:30 ,则基于 vm1-sh 启动的虚拟机卷大小就是 30 G了。