分享

如何在openstack中创建镜像 for Juno

hiqj 发表于 2015-4-11 23:22:34 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 0 18448
问题导读:
1.利用Horizon和ISO格式的安装盘来创建镜像的方法原理是什么?
2.创建磁盘是如何实现的?
3.将磁盘配置写入XML文件中是如何实现的?




本文背景:
当前在OpenStack中没有提供一个方便快捷的方法去创建镜像,需要运维人员使用KVM制作,这无疑提高了对运维人员和环境(需要一个安装了KVM的linux)的要求,因此我觉得OpenStack还是不适应于私有云的,它是为公有云而生。
wKiom1Ul8DSTciP0AAD5VB7H-hs658.jpg

本文介绍一种利用Horizon和ISO格式的安装盘来创建镜像的方法,其原理为:
1). 创建一个新的磁盘作为root disk
2). 从Glance下载ISO作为第二块磁盘
3). 从Glance下载virtio作为第三块磁盘
4). 从ISO启动虚拟机,比将系统安装到root disk
5). 创建image并保持到Glance

1.添加一种disk类型newos
  1. * 'mapping': a dict contains the storage device mapping.
  2.    For the default disk types it will contain the following
  3.    keys & values:
  4.       'disk' -> disk_info
  5.       'disk.rescue' -> disk_info
  6.       'disk.local' -> disk_info
  7.       'disk.swap' -> disk_info
  8.       'disk.config' -> disk_info
  9.       'disk.newos' -> disk_info
  10. <font color="#ff0000">disk_info指的是: </font>
  11. * 'disk_info': a tuple specifying disk configuration
  12.    It contains the following 3 fields
  13.       (disk bus, disk dev, device type)
  14. * 'disk_bus': the guest bus type ('ide', 'virtio', 'scsi', etc)
  15. * 'disk_dev': the device name 'vda', 'hdc', 'sdf', 'xvde' etc
  16. * 'device_type': type of device eg 'disk', 'cdrom', 'floppy'
复制代码

2 设置磁盘顺序
在blockinfo.py中,调用逻辑是:
spawn-->get_disk_info -->get_disk_mapping :
  1. if image_meta and image_meta.get('disk_format') == 'iso':
  2.     root_disk_bus = disk_bus
  3.     #创建虚拟机时如果image_meta中的disk_format为iso, 则认为是创建新image的操作,那么进行如下操作
  4.     #设置disk.newos为root device
  5.     root_device_type = 'disk'
  6.     root_info = get_next_disk_info(mapping,
  7.                                    root_disk_bus,
  8.                                    root_device_type)
  9.     mapping['root'] = root_info
  10.     mapping['disk.newos'] = root_info
  11.     #设置disk(iso)为第二个device
  12.     image_device_type = 'cdrom'
  13.     image_device_bus = cdrom_bus
  14.     cdrom_info = get_next_disk_info(mapping,
  15.                                    image_device_bus,
  16.                                    image_device_type)
  17.     mapping['disk'] = cdrom_info
  18.     #s设置disk.virtio作为第三个设备,为需要virtio的时候提供virtio驱动程序
  19.     virtio_device_type = 'cdrom'
  20.     virtio_device_bus = cdrom_bus
  21.     virtio_device_info = get_next_disk_info(mapping,
  22.                                    virtio_device_bus,
  23.                                    virtio_device_type)
  24.     mapping['disk.virtio'] = virtio_device_info
  25.     return mapping
复制代码

3 创建磁盘
driver.py中的调逻辑是:spawn--> _create_image
  1. newos_size_gb = CONF.os_root_disk_size
  2. if 'disk.newos' in disk_mapping:
  3.     fname = "newos_%s_%s" % (newos_size_gb, os_type_with_default)
  4.     size = newos_size_gb * 1024 * 1024 * 1024
  5.     image('disk.newos').cache(fetch_func=self._create_newos,
  6.                               filename=fname,
  7.                               size=size,
  8.                               newos_size=newos_size_gb)
  9. virtio_image_id = CONF.virtio_image_id
  10. virtio_images = {'image_id': virtio_image_id}
  11. virtio_fname = imagecache.get_cache_fname(virtio_images, 'image_id')
  12. image('disk.virtio').cache(fetch_func=libvirt_utils.fetch_image,
  13.                         context=context,
  14.                         filename=virtio_fname,
  15.                         size=size,
  16.                         image_id=virtio_image_id,
  17.                         user_id=instance['user_id'],
  18.                         project_id=instance['project_id'])
复制代码
  1. @staticmethod
  2. def _create_newos(target, newos_size):
  3.     #self._create_local(target, newos_size)
  4.     unit='G'
  5.     libvirt_utils.create_image('qcow2', target,
  6.                                '%d%c' % (newos_size, unit))
复制代码

4. 将磁盘配置写入XML文件中
driver.py中的调逻辑是:spawn-->get_guest_xml--> get_guest_config-->_get_guest_storage_config
  1. if rescue:
  2.         diskrescue = self.get_guest_disk_config(instance,
  3.                                                 'disk.rescue',
  4.                                                 disk_mapping,
  5.                                                 inst_type)
  6.         devices.append(diskrescue)
  7.         diskos = self.get_guest_disk_config(instance,
  8.                                             'disk',
  9.                                             disk_mapping,
  10.                                             inst_type)
  11.         devices.append(diskos)
  12.     else:
  13.         #添加device
  14.         if 'disk.newos' in disk_mapping:
  15.             disknewos = self.get_guest_disk_config(instance,
  16.                                                    'disk.newos',
  17.                                                    disk_mapping,
  18.                                                    inst_type)
  19.             devices.append(disknewos)
  20.             diskcdrom = self.get_guest_disk_config(instance,
  21.                                                 'disk',
  22.                                                 disk_mapping,
  23.                                                 inst_type)
  24.             devices.append(diskcdrom)
  25.             diskvirtio = self.get_guest_disk_config(instance,
  26.                                                 'disk.virtio',
  27.                                                 disk_mapping,
  28.                                                 inst_type)
  29.             devices.append(diskvirtio)
  30.             ###
  31.         else:
  32.             if 'disk' in disk_mapping:
  33.                 diskos = self.get_guest_disk_config(instance,
  34.                                                     'disk',
  35.                                                      disk_mapping,
  36.                                                      inst_type)
  37.                 devices.append(diskos)
复制代码






没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条