Ovirt vdsm创建虚拟机网卡的流程

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
虚拟机创建API
vmParams只有一个成员参数xml,所有对虚拟机的配置都来自Paas通过xml的格式生成,并转成String字符串传入create,create再通过xml库解析获得配置参数。
create方法经过参数校验后,进入clientIF的createVm函数,进行下一步操作:
转入clientIF处理逻辑
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
创建UnderlyingVM
网卡设备属于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,需要配置虚拟机可以将脚本写在这个地方。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值