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/
- generally, we use libvirt(2)
- generally, we use libvirt(1)
- should we use annotations?
- Use libvirt with Xen/xVM
- Use libvirt to conmunicate with qemu
- why we use abstract_class in active_record ?
- when can we use machine learning ?
- Why we should use closures in python
- why we use Symbols in Hash
- Why Do We Use Fiber Optic Switch?
- When should we use PUT and when should we use POST?
- libvirt 详解(2)
- libvirt
- libvirt
- libvirt
- how to configure libvirt to use virtio with KVM guests
- NoSQL Databases, why we should use, and which one we should choose
- When and Why do we use "#if 0"
- git安装以后初始化共享库以后用ssh 公钥登录clone代码的设置
- 修改maven本地仓库路径
- 欢迎使用CSDN-markdown编辑器
- linux struct stat 结构
- 图片加载库汇总
- generally, we use libvirt(2)
- iOS UITableViewCell的分割线缩进
- 【猿必读】代码飞起。
- 前四章课堂测试
- it need flush out the previous h264 stream data
- 阿里巴巴校招实习 java 研发 123面
- 泛微签约广东特地陶瓷有限公司
- (1.2.4.1)数组的相关算法
- android 引用第三方库