【问题标题】:Python libvirt API - create a Virtual MachinePython libvirt API - 创建虚拟机
【发布时间】:2015-11-24 11:49:07
【问题描述】:

我正在尝试创建一个 python 脚本来处理基本的 VM 操作,例如:创建 VM、删除 VM、启动、停止等。

目前我比较“卡”在create

你可以从命令行执行如下操作:

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 的新 VM,并将其安装在之前定义的 vdisk.img

但我想在 python 中完成这一切;我知道如何处理第二部分:

  1. 从 VM 的 XML 模板开始

  2. 打开一个 libvirt 连接并使用连接处理程序创建 VM

    但我想知道第一部分,您必须在哪里创建虚拟磁盘。

有没有libvirt API calls可以用?

或者,您必须对 qemu-img create 进行系统调用来创建虚拟磁盘?

【问题讨论】:

  • qemu-img 不是 libvirt 的一部分。
  • 我知道;我问libvirt中是否有类似的东西,这样我就不必进行系统调用来为VM创建存储空间
  • @Pandrei 是否可以从 libvirt java api 在主机上创建虚拟机
  • @asj177 可以使用 python 绑定,所以也应该可以使用 java 绑定。

标签: python kvm libvirt hypervisor


【解决方案1】:

我终于找到并回答了我的问题——所以我在这里发布解决方案,以防有人遇到同样的问题。

libvirt 连接对象可以与存储池一起使用。

来自 libvirt.org:“存储池是由管理员(通常是专门的存储管理员)留出供虚拟机使用的存储量。存储池由存储划分为存储卷。管理员或系统管理员,并将卷作为块设备分配给 VM。"

基本上,卷是quemu-img create 创建的。在所有 .img(使用qemu-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

【讨论】:

  • 很棒的答案。我自己一直被这个问题困扰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 2019-05-10
  • 1970-01-01
相关资源
最近更新 更多