Python libvirt API - 创建虚拟机
我正在尝试写一个Python脚本,用来处理一些基本的虚拟机操作,比如:创建虚拟机、删除虚拟机、启动、停止等等。
目前我在创建
这部分遇到了一些困难。
在命令行中,你可以这样做:
qemu-img create -f qcow2 vdisk.img <size>
virt-install --virt-type kvm --name testVM --ram 1024
--cdrom=ubuntu.iso --disk /path/to/virtual/drive,size=10,format=qcow2
--network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
--os-type=linux
这条命令会创建一个叫testVM
的新虚拟机,并把它安装在之前定义的vdisk.img
上。
但我想用Python来完成这些操作;我知道如何处理后面的部分:
先用一个XML模板来定义虚拟机
打开一个libvirt连接,然后用这个连接来创建虚拟机
但是我在想第一部分,也就是如何创建虚拟磁盘。
有没有什么libvirt API调用
可以使用呢?
或者说,你必须用系统调用来执行qemu-img create命令来创建虚拟磁盘?
相关文章:
- 暂无相关问题
1 个回答
10
我终于找到了解决我问题的方法,所以我把这个解决方案发在这里,以防有人遇到同样的问题。
libvirt连接对象可以和存储池一起使用。
根据libvirt.org的说法:“存储池是由管理员(通常是专门的存储管理员)为虚拟机预留的一定数量的存储空间。存储池会被分成存储卷,这些卷可以由存储管理员或系统管理员来划分,然后这些卷会被分配给虚拟机作为块设备。”
简单来说,存储卷就是qemu-img create
命令创建的东西。当你在存放所有.img文件的同一个目录下创建一个存储池时,使用qemu-img
创建的文件就会被视为存储卷。
下面的代码可以列出所有现有的存储卷,包括那些用qemu-img
创建的。
conn = libvirt.open()
pools = conn.listAllStoragePools(0)
for pool in pools:
#check if pool is active
if pool.isActive() == 0:
#activate pool
pool.create()
stgvols = pool.listVolumes()
print('Storage pool: '+pool.name())
for stgvol in stgvols :
print(' Storage vol: '+stgvol)
创建存储池:
def createStoragePool(conn):
xmlDesc = """
<pool type='dir'>
<name>guest_images_storage_pool</name>
<uuid>8c79f996-cb2a-d24d-9822-ac7547ab2d01</uuid>
<capacity unit='bytes'>4306780815</capacity>
<allocation unit='bytes'>237457858</allocation>
<available unit='bytes'>4069322956</available>
<source>
</source>
<target>
<path>/path/to/guest_images</path>
<permissions>
<mode>0755</mode>
<owner>-1</owner>
<group>-1</group>
</permissions>
</target>
</pool>"""
pool = conn.storagePoolDefineXML(xmlDesc, 0)
#set storage pool autostart
pool.setAutostart(1)
return pool
创建存储卷:
def createStoragePoolVolume(pool, name):
stpVolXml = """
<volume>
<name>"""+name+""".img</name>
<allocation>0</allocation>
<capacity unit="G">10</capacity>
<target>
<path>/path/to/guest_images/"""+name+""".img</path>
<permissions>
<owner>107</owner>
<group>107</group>
<mode>0744</mode>
<label>virt_image_t</label>
</permissions>
</target>
</volume>"""
stpVol = pool.createXML(stpVolXml, 0)
return stpVol