openstack nova基础知识——libvirt和qemu(2)
前一篇介绍了qemu的基本使用,使用virsh或者virtual manager来管理虚拟机,但没有涉及到libvirt API,这里就使用libvirt的python API来演示一下虚拟机的创建。看nova的源码,关于虚拟机管理的模块是virt,libvirt就是其中的一个包,这个包中包含了使用libvirt管理虚拟机的所有API,看一下下面的示意图:libvirt.dri
前一篇介绍了qemu的基本使用,使用virsh或者virtual manager来管理虚拟机,但没有涉及到libvirt API,这里就使用libvirt的python API来演示一下虚拟机的创建。
看nova的源码,关于虚拟机管理的模块是virt,libvirt就是其中的一个包,这个包中包含了使用libvirt管理虚拟机的所有API,看一下下面的示意图:
libvirt.driver这个模块中有一个全局的变量libvirt,其指向的就是libvirt的库函数,连接的获得_conn、虚拟机的创建等都是通过这个变量来调用的libvirtAPI。
在对虚拟机进行管理之前,先要和虚拟机的管理程序,即Hypervisor建立连接,在这里创建连接有两种方式,一个是只读的,一个是可读写的,创建连接在_connect()方法中:
@staticmethod
def _connect(uri, read_only):
auth = [[libvirt.VIR_CRED_AUTHNAME, libvirt.VIR_CRED_NOECHOPROMPT],
'root',
None]
if read_only:
return libvirt.openReadOnly(uri)
else:
return libvirt.openAuth(uri, auth, 0)
创建虚拟机主要在_create_domain()方法中:
def _create_domain(self, xml=None, domain=None, launch_flags=0):
"""Create a domain.
Either domain or xml must be passed in. If both are passed, then
the domain definition is overwritten from the xml.
"""
if xml:
domain = self._conn.defineXML(xml)
domain.createWithFlags(launch_flags)
return domain
虚拟机相关的参数都在一个xml文件中配置,创建虚拟机时就使用这个xml文件中的内容作为参数,即上面的xml参数的类型是字符串。
defineXML()是用根据xml的内容定义了一个虚拟机,即创建了一个virDomain对象,但是并没有启动这个虚拟机。用这个方法定义的虚拟机是永久性的,会再生成一个和这个虚拟机相关的xml配置文件。还有一个方法是createXML(),它创建的虚拟机是临时性的。
createWithFlags()是启动之前定义的虚拟机,即让虚拟机的状态变为running。和它类似的方法还有一个create(),两者的区别暂时还不清楚。
根据上面的方法,就可以直接使用python来创建虚拟机了,简单的示例如下:
import libvirt
auth = [[libvirt.VIR_CRED_AUTHNAME, libvirt.VIR_CRED_NOECHOPROMPT],'root',None]
conn=libvirt.openAuth("qemu:///system",auth,0) #这里要用读写的方式打开连接
with open('/suo/domain/demo.xml') as f:
xml=f.read()
domain=conn.defineXML(xml)
domain.createWithFlags(0)
try:
dom0 = conn.lookupByName("instance-00000001")
except:
print 'Failed to find the main domain'
sys.exit(1)
print "Domain 0: id %d running %s" % (dom0.ID(), dom0.OSType())
print dom0.info()
因为使用python创建虚拟机,需要读写很多root权限的文件,所以要用openAuth()方法来创建连接,并且qemu使用的是system模式的。
demo.xml文件如下:
<domain type='qemu'>
<name>instance-00000001</name>
<uuid>c7a5fdbd-cdaf-9455-926a-d65c16db1809</uuid>
<memory>219200</memory>
<currentMemory>219200</currentMemory>
<vcpu>1</vcpu>
<os>
<type arch='i686' machine='pc'>hvm</type>
<boot dev='hd'/><!--优先从硬盘启动-->
<boot dev='cdrom'/><!--硬盘不能启动的话,从光驱启动-->
</os>
<devices>
<emulator>/usr/local/bin/qemu</emulator>
<disk type='file' device='cdrom'>
<source file='/suo/domain/cflinux-1.0.iso'/>
<target dev='hdc'/>
<readonly/>
</disk>
<disk type='file' device='disk'>
<source file='/suo/domain/precise-server-cloudimg-i386-disk1.img'/>
<target dev='hda'/>
</disk>
<interface type='bridge'>
<source bridge='br100'/><!--这里配置的虚拟机让它桥接到br100网桥上-->
</interface>
<graphics type='vnc' port='-1'/>
</devices>
</domain>
官方文档上介绍这个xml的配置文件是还有很多复杂的内容,这里仅仅配置了最简单的情况,方便理解。另外网络的配置现在还不太明白怎么配置,只是简单的把这个虚拟机桥接到了br100这个网桥上。
运行上面的python文件,就可以创建虚拟机了(前提是创建好br100和root权限的libvirtd的守护进程正常运行),运行之后只是创建了虚拟机,但是对虚拟机的安装还是需要手动进行的,可以使用qemu的命令:qemu -hda instance-00000001.img来打开一个qemu的虚拟机窗口,也可以直接使用virtual manager来进行安装。
更多推荐
所有评论(0)