如何在openstack中創(chuàng)建鏡像 for Juno
當前在OpenStack中沒有提供一個方便快捷的方法去創(chuàng)建鏡像,需要運維人員使用KVM制作,這無疑提高了對運維人員和環(huán)境(需要一個安裝了KVM的linux)的要求,因此我覺得OpenStack還是不適應于私有云的,它是為公有云而生。
本文介紹一種利用Horizon和ISO格式的安裝盤來創(chuàng)建鏡像的方法,其原理為:
1. 創(chuàng)建一個新的磁盤作為root disk
2. 從Glance下載ISO作為第二塊磁盤
3. 從Glance下載virtio作為第三塊磁盤
4. 從ISO啟動虛擬機,比將系統(tǒng)安裝到root disk
5. 創(chuàng)建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中,調(diào)用邏輯是:
spawn-->get_disk_info -->get_disk_mapping :
- if image_meta and image_meta.get('disk_format') == 'iso':
- root_disk_bus = disk_bus
- #創(chuàng)建虛擬機時如果image_meta中的disk_format為iso, 則認為是創(chuàng)建新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驅(qū)動程序
- 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
#p#
3 創(chuàng)建磁盤
driver.py中的調(diào)邏輯是: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中的調(diào)邏輯是: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)
參考:http://www.ibm.com/developerworks/cn/cloud/library/cl-openstack-images/