Python libvirt API - create a Virtual Machine
Asked Answered
S

1

8

I am trying to create a python script to handle basic VM operations like: create a VM, delete a VM, start, stop, etc.

Currently I'm rather "stuck" on create

From the command line you would do something like:

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

And that will create a new VM called testVM and install it on the previously defined vdisk.img

But I want to do this all in python; I know how to handle the second part:

  1. start with an XML template for the VM

  2. open a libvirt connection and use the connection handler to create the VM

    But I'm wondering about the first part, where you have to create the virtual disk.

Are there any libvirt API calls you can use?

OR, you have to put in a system call to qemu-img create to create the virtual disk?

Sheenasheeny answered 24/11, 2015 at 11:49 Comment(4)
qemu-img is not part of libvirt.Frodeen
I know; I asked if there is something similar in libvirt so that I don't have to put in a system call to create the storage space for the VMSheenasheeny
@Sheenasheeny is it possible to create a vm on a host from libvirt java apiPintsize
@asj177 it possible using the python bindings so it should be possible using the java ones as well.Sheenasheeny
S
11

I finally found and answer to my problems- so I'm posting the solution here in case anyone ever hits the same problem.

The libvirt connection object can work with storage pools.

From the libvirt.org: "A storage pool is a quantity of storage set aside by an administrator, often a dedicated storage administrator, for use by virtual machines. Storage pools are divided into storage volumes either by the storage administrator or the system administrator, and the volumes are assigned to VMs as block devices."

Basically a volume is what quemu-img create creates. Once you create a storage pool in the same directory where all the .img (created using qemu-img) files are; the files created with qemu-img are seen as volumes.

The following code will list all existing volumes, including the ones created with 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)

Creating a storage pool:

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

Creating a volume:

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
Sheenasheeny answered 25/11, 2015 at 10:29 Comment(1)
awesome answer. had been stuck on this problem myself.Reaction

© 2022 - 2024 — McMap. All rights reserved.