generally, we use libvirt(2)

来源:互联网 发布:西哈努克亲王 知乎 编辑:程序博客网 时间:2024/06/06 01:51

libvirt分为三层,接口层,抽象驱动层和具体驱动层:其中接口层可以使用libvirt的api或者virsh command调用;抽象驱动层则包括各种不同的driver,network driver,

storage driver,device driver等等;具体驱动层则是针对qemu或者xen,Lxc的驱动。

对于一般的开发者来说,也就看到接口层,调用libvirt的接口生成虚机,到此为止而已。


在/etc/nova/nova.conf中配置:compute_driver=nova.virt.libvirt.LibvirtDriver

同时在[libvirt] segment配置了virt_type,live_migration_uri等。

前面trace过nova中创建虚机的过程,在nova/compute/manager.py中的_build_and_run_instance:

self.driver.spawn(context, instance, image,
                                      injected_files, admin_password,
                                      network_info=network_info,
                                      block_device_info=block_device_info,
                                      instance_type=instance_type)

这里的driver一般就是前面的LibvirtDriver,看其参数有inject_files, network_info,  image,block_device, 很显然有注入的文件,网络信息,安装的镜像,存储等。

在nova/virt/libvirt/driver.py中的spawn方法:

disk_info = blockinfo.get_disk_info(CONF.libvirt.virt_type, instance,block_device_info, image_meta)

self._create_image(context, instance,disk_info['mapping'],network_info=network_info,block_device_info=block_device_info,files=injected_files,

                                    admin_pass=admin_password)

xml = self._get_guest_xml(context, instance, network_info,disk_info, image_meta,block_device_info=block_device_info,
                                  write_to_disk=True)
self._create_domain_and_network(context, xml, instance, network_info,block_device_info, disk_info=disk_info)

这里的每一个调用都有一长串而且涉及底层概念,理解起来无从下手,看_create_domain_and_network,调用_create_domain,trace进去,我们会发现:

wrapped_conn = self._connect(self.uri(), self.read_only)

连接libvirt,其中根据不同的virt_type得到不同的uri(),一般为:'qemu:///system',即用libvirt调用具体driver:qemu

domain = self._conn.defineXML(xml) #libvirt生成虚机的地方,我们在界面上的大部分操作,最终都转化成为xml文件中的item了。

关于xml中属性的定义,mark link中标红的link给出了比较详细的定义,当然了,去libvirt官网上查也可以。

我们每生成一个instance,会在/var/lib/nova/instances/下生成一个目录,比如:

目录“cf925a8b-c4b8-4797-8967-883d129c1b7b“中有item:

console.log #openstack界面上看到的生成虚机的log文件

disk  #磁盘,系统从哪里起来的

disk.info #磁盘信息:{"/var/lib/nova/instances/cf925a8b-c4b8-4797-8967-883d129c1b7b/disk": "qcow2"}

libvirt.xml#libvirt生成虚机对应的xml文件,实际上instance对应的xml文件会拷贝到/etc/libvirt/qemu目录下对应的xxx.xml中,所以二者一致。

这些xml中有metada字段:

  <metadata>
    <nova:instance xmlns:nova="http://openstack.org/xmlns/libvirt/nova/1.0">
      <nova:package version="2014.2.2-1.el7"/>
      <nova:name>test_virtual</nova:name>
      <nova:creationTime>2015-04-28 09:11:34</nova:creationTime>
      <nova:flavor name="m1.tiny">
        <nova:memory>512</nova:memory>
        <nova:disk>1</nova:disk>
        <nova:swap>0</nova:swap>
        <nova:ephemeral>0</nova:ephemeral>
        <nova:vcpus>1</nova:vcpus>
      </nova:flavor>
      <nova:owner>
        <nova:user uuid="60ce7a8cab9c477895ef37440b1d9c57">admin</nova:user>
        <nova:project uuid="51b4379ea8734aaca96cb724a2d7200f">admin</nova:project>
      </nova:owner>
      <nova:root type="image" uuid="81274dbb-256f-463c-b78b-30e616c5d03d"/>
    </nova:instance>
  </metadata>

至于memory,disk,bridge等在mark link中都讲得很清楚了。

说的比较多的是disk的部分:

<disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='none'/>
      <source file='/var/lib/nova/instances/cf925a8b-c4b8-4797-8967-883d129c1b7b/disk'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>
在image的部分(前面说过)会生成image,有不同的格式qcow2等,创建虚机时选择从镜像启动,则会用qemu命令将镜像resize到flavor的情况??(新的instance使用

会创建新的镜像文件),然后启动;从镜像启动-创建一个新卷,会生成一个iscsi设备,这时创建好的虚机没有镜像名称,从volume启动的(这个iscsi设备也会成为一

块云设备)。

blue link有使用iso启动时的配置文件,大同小异


mark link:

http://libvirt.org/docs.html

http://en.wikibooks.org/wiki/QEMU

http://blog.chinaunix.net/uid-20917783-id-2560164.html

http://blog.chinaunix.net/uid-20940095-id-3238703.html

http://5ydycm.blog.51cto.com/115934/1362877/




0 0