vdsm虚拟机创建成功后网卡xml如下:
<interface type='bridge'>
<mac address='20:0a:95:9d:68:78'/>
<source bridge='ovirtmgmt'/>
<model type='virtio'/>
<driver name='vhost' queues='4'/>
<filterref filter='vdsm-no-mac-spoofing'/>
<link state='up'/>
<mtu size='1500'/>
<alias name='ua-2b6ad3fd-52ef-4a6a-abee-17442c345a91'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
vdsm从API.py开始,创建虚拟机的接口是create
vmParams只有一个成员参数xml,所有对虚拟机的配置都来自Paas通过xml的格式生成,并转成String字符串传入create,create再通过xml库解析获得配置参数。
create方法经过参数校验后,进入clientIF的createVm函数,进行下一步操作:
clientIF在vdsm是一个单例,初始化一大堆全局变量,包括创建和维护和qemu、mom、httpserver、rpcserver的连接。
创建虚拟机的时候,clientIF会初始化一个VM实例,并将其启动
def createVm(self, vmParams, vmRecover=False):
with self.vm_start_stop_lock:
if not vmRecover:
if vmParams['vmId'] in self.vmContainer:
return errCode['exist']
vm = Vm(self, vmParams, vmRecover)
ret = vm.run()
if not response.is_error(ret):
with self.vm_container_lock:
self.vmContainer[vm.id] = vm
return ret
VM实例初始化的时候,会重新组装xml,并通过创建线程异步沟通libvirt创建underlyVM
网卡设备属于devices,进入make_devices组装devices的xml
def _make_devices(self):
disk_objs = self._perform_host_local_adjustment()
return self._make_devices_from_xml(disk_objs)
def _make_devices_from_xml(self, disk_objs=None):
# Engine XML flow note:
# we expect only storage devices to be sent in vm.conf format,
# everything else should be taken from the XML.
# We don't expect any storage device to be sent in the XML.
dev_objs_from_xml = vmdevices.common.dev_map_from_domain_xml(
self.id, self.domain, self._md_desc, self.log,
noerror=self.recovering
)
if disk_objs:
# overridden because of per-host adjustement
dev_objs_from_xml[hwclass.DISK] = disk_objs
self.log.debug('Built %d devices', len(dev_objs_from_xml))
return dev_objs_from_xml
dev_map_from_domain_xml关键的代码在于:
for dev_type, dev_class, dev_elem in _device_elements(dom_desc, log):
dev_meta = _get_metadata_from_elem_xml(vmid, md_desc,
dev_class, dev_elem)
try:
dev_obj = dev_class.from_xml_tree(log, dev_elem, dev_meta)
except NotImplementedError:
log.debug('Cannot initialize %s device: not implemented',
轮询每个device,并获取其类名,vmdevices模块实现了interface的from_xml_tree,从xml参数中获取并校验了link、vlan、mtu、port、driver、bandwidth等字段,如果设置了端口镜像也会在这里进行配置。
在最终defineXML并启动虚拟机之前,vdsm还需要经过Hook机制,对应的脚本在/usr/libexec/vdsm/hooks/
,虚拟机启动前会遍历before_vm_start
,启动后会遍历after_device_create
,需要配置虚拟机可以将脚本写在这个地方。