本人使用操作系统的ISO启动虚拟机的过程中遇到一系列问题,现在将不同启动方式及其后端存储梳理如下。 由于我们的后端使用的ceph,这里只着重针对后端存储为ceph场景进行分析。
创建镜像
创建一个镜像,镜像格式选为ISO 注意这里格式需要同你的镜像文件相匹配,glance不会做转换,这里即使选为其他格式(如raw)也不会转换为RAW 另外,压缩包格式,目前有bug https://bugs.launchpad.net/glance/+bug/1482436 https://bugs.launchpad.net/horizon/+bug/147996
启动虚拟机
使用刚刚创建的镜像启动一台虚拟机,horizon默认多种启动方式。具体使用那种呢,让我们具体分析各种启动方式在后端存储的不同: (可以先参考本人的块设备相关的文章)
镜像启动(boot from image)
将启动时指定的镜像做一份拷贝,此拷贝作为虚拟机的根磁盘,此拷贝放置于vm pool中由nova进行对接管理。 这种实例通常称之为“易失性实例(ephemeral instance)”,在Amazon、Eucalyptus等侧重公有云的云平台实现中,这种实例没有关机操作(Stop),终止实例,根磁盘随之删除。Openstack有些不一样,实现了关机操作。
在libvirt的配置文件(具体分析可参考本人这篇博客)中显示如下, 可见虚拟机创建成功在ceph的vms pool中创建了一个块设备,作为虚拟机的vda盘。
在openstack的block_device_mapping表中,根据对应的实例id过滤出相关信息如下:
- 可见bott_index为0说明是启动盘
- destination_type为local说明是nova接管的虚拟机本地盘
- delete_on_termination为1说明虚拟机删除的时候会删除此盘
- image_id:指定了当前虚拟机启动的时候指定的那个镜像iodfkld
vnc登陆进去此虚拟机,发现磁盘大小为1G。这是因为我们指定的tiny的flavor, 启动虚拟机的磁盘大小取决于flavor。
实例快照
镜像启动的虚拟机做成的快照
做快照的时候,实质是利用当前虚拟机的文件和backing file生成了一个新的镜像。 在制作实例快照时,Openstack会先将disk上传至nova compute的临时文件夹中,上传到Ceph的image pool里,两次传输很耗时间。 后续Openstack应该会优化直接在Ceph内部做clone。 这种情况下的快照启动虚拟机,类似于镜像启动虚拟机。
卷启动的虚拟机做成的快照
会对虚拟机所有的磁盘做一个快照,然后生成一个镜像,镜像的meatadata指定生成的所有磁盘快照。 卷启动的虚拟机,有两个磁盘
做完快照后,所有磁盘都有快照
另外还有一个镜像,对没错,是镜像
卷启动
从存储卷启动实例。这种方式使用上面方式将镜像做成一个可启动(bootable)的volume,然后启动这个volume,并将instance的/dev/sda映射到这个volume上。 包括Amazon、Eucalyptus、Openstack在内的所有云平台都支持这种实例的关机操作(stop)。Openstack可以配置终止实例时是否同时删除对应的volume。
镜像启动(创建一个卷)(boot_from_image_crate_volume)
使用启动时指定的镜像做一个卷,然后使用这个卷启动虚拟机。 从用户的角度来看,仿佛是直接从镜像启动的,实际上Openstack在后台启动了一个用uuid命名的volume。
卷快照启动
基于快照创建一个新的存储卷volume_snapshot 由上面可见,我们的选择方式有从镜像启动和从镜像启动(创建一个卷)两种情况,分别创建两个虚拟机
然后看两个虚拟机的详情
VNC登陆进去,发现没有安装系统,安装过程发现没有分区,隐隐感觉有点不对。
点继续,分区就会失败了,报无法创建文件系统。
经过分析,发现当镜像是ISO时,上述的描述不准确,上述创建的磁盘只是作为引导盘。 需要新attach一个盘作为数据盘。
创建卷
创建一个卷,挂载到刚才创建的虚拟机上,然后安装系统
注意这里需要关机操作,因为磁盘驱动位ide不支持热插拔。
详见libvirt hotplugged ide volume error
解挂卷
detach卷,并设置卷为可启动。
卷启动虚拟机
但是使用镜像启动(创建一个卷)方式做出的卷,无法启动虚拟机。
怀疑是把部分数据安装到引导盘了(待确认)
上面问题的修复方法:需要在启动卷,安装系统的时候手动修改根目录在新attach的盘,即可