如何在openstack中创建镜像 for Juno
当前在OpenStack中没有提供一个方便快捷的方法去创建镜像,需要运维人员使用KVM制作,这无疑提高了对运维人员和环境(需要一个安装了KVM的linux)的要求,因此我觉得OpenStack还是不适应于私有云的,它是为公有云而生。
本文介绍一种利用Horizon和ISO格式的安装盘来创建镜像的方法,其原理为:
1. 创建一个新的磁盘作为root disk
2. 从Glance下载ISO作为第二块磁盘
3. 从Glance下载virtio作为第三块磁盘
4. 从ISO启动虚拟机,比将系统安装到root disk
5. 创建image并保持到Glance
1.添加一种disk类型newos
* 'mapping': a dict contains the storage device mapping. For the default disk types it will contain the following keys & values: 'disk' -> disk_info 'disk.rescue' -> disk_info 'disk.local' -> disk_info 'disk.swap' -> disk_info 'disk.config' -> disk_info 'disk.newos' -> disk_info disk_info指的是: * 'disk_info': a tuple specifying disk configuration It contains the following 3 fields (disk bus, disk dev, device type) * 'disk_bus': the guest bus type ('ide', 'virtio', 'scsi', etc) * 'disk_dev': the device name 'vda', 'hdc', 'sdf', 'xvde' etc * 'device_type': type of device eg 'disk', 'cdrom', 'floppy'
2 设置磁盘顺序
在blockinfo.py中,调用逻辑是:
spawn-->get_disk_info -->get_disk_mapping :
if image_meta and image_meta.get('disk_format') == 'iso': root_disk_bus = disk_bus #创建虚拟机时如果image_meta中的disk_format为iso, 则认为是创建新image的操作,那么进行如下操作 #设置disk.newos为root device root_device_type = 'disk' root_info = get_next_disk_info(mapping, root_disk_bus, root_device_type) mapping['root'] = root_info mapping['disk.newos'] = root_info #设置disk(iso)为第二个device image_device_type = 'cdrom' image_device_bus = cdrom_bus cdrom_info = get_next_disk_info(mapping, image_device_bus, image_device_type) mapping['disk'] = cdrom_info #s设置disk.virtio作为第三个设备,为需要virtio的时候提供virtio驱动程序 virtio_device_type = 'cdrom' virtio_device_bus = cdrom_bus virtio_device_info = get_next_disk_info(mapping, virtio_device_bus, virtio_device_type) mapping['disk.virtio'] = virtio_device_info return mapping
3 创建磁盘
driver.py中的调逻辑是:spawn--> _create_image
newos_size_gb = CONF.os_root_disk_size if 'disk.newos' in disk_mapping: fname = "newos_%s_%s" % (newos_size_gb, os_type_with_default) size = newos_size_gb * 1024 * 1024 * 1024 image('disk.newos').cache(fetch_func=self._create_newos, filename=fname, size=size, newos_size=newos_size_gb) virtio_image_id = CONF.virtio_image_id virtio_images = {'image_id': virtio_image_id} virtio_fname = imagecache.get_cache_fname(virtio_images, 'image_id') image('disk.virtio').cache(fetch_func=libvirt_utils.fetch_image, context=context, filename=virtio_fname, size=size, image_id=virtio_image_id, user_id=instance['user_id'], project_id=instance['project_id'])
@staticmethod def _create_newos(target, newos_size): #self._create_local(target, newos_size) unit='G' libvirt_utils.create_image('qcow2', target, '%d%c' % (newos_size, unit))
4. 将磁盘配置写入XML文件中
driver.py中的调逻辑是:spawn-->get_guest_xml--> get_guest_config-->_get_guest_storage_config
if rescue: diskrescue = self.get_guest_disk_config(instance, 'disk.rescue', disk_mapping, inst_type) devices.append(diskrescue) diskos = self.get_guest_disk_config(instance, 'disk', disk_mapping, inst_type) devices.append(diskos) else: #添加device if 'disk.newos' in disk_mapping: disknewos = self.get_guest_disk_config(instance, 'disk.newos', disk_mapping, inst_type) devices.append(disknewos) diskcdrom = self.get_guest_disk_config(instance, 'disk', disk_mapping, inst_type) devices.append(diskcdrom) diskvirtio = self.get_guest_disk_config(instance, 'disk.virtio', disk_mapping, inst_type) devices.append(diskvirtio) ### else: if 'disk' in disk_mapping: diskos = self.get_guest_disk_config(instance, 'disk', disk_mapping, inst_type) devices.append(diskos)
相关推荐
Moolightshadow 2020-07-16
fyggzb 2020-07-05
gokeibi 2020-06-12
zziyuann 2020-06-12
fyggzb 2020-06-12
hhphhp 2020-06-12
fyggzb 2020-06-10
JeremyLiu 2020-06-10
JeremyLiu 2020-06-10
jmppok 2020-06-07
jmppok 2020-06-05
hhphhp 2020-06-01
zziyuann 2020-05-17
gokeibi 2020-05-07
gokeibi 2020-04-26
gokeibi 2020-04-19
gokeibi 2020-04-19