Python libvirt API - 创建虚拟机

7 投票
1 回答
8801 浏览
提问于 2025-05-11 00:01

我正在尝试写一个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来完成这些操作;我知道如何处理后面的部分:

  1. 先用一个XML模板来定义虚拟机

  2. 打开一个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

撰写回答