Wiki source code of libvirt
Version 9.1 by Sebastian Marsching on 2022/07/17 14:20
Show last authors
| author | version | line-number | content |
|---|---|---|---|
| 1 | {{toc/}} | ||
| 2 | |||
| 3 | # Graceful shutdown of virtual machines / domains when shutting down libvirtd | ||
| 4 | |||
| 5 | When libvirtd is stopped, all virtual machines are destroyed. There is a little script that does a shutdown of all virtual machines before stopping libvirtd: | ||
| 6 | |||
| 7 | ```python | ||
| 8 | #!/usr/bin/python | ||
| 9 | |||
| 10 | import libvirt | ||
| 11 | import time | ||
| 12 | import sys | ||
| 13 | |||
| 14 | conn = libvirt.open("qemu:///system") | ||
| 15 | if conn == None: | ||
| 16 | print "Failed to open connection" | ||
| 17 | sys.exit(1) | ||
| 18 | |||
| 19 | domainIDs = conn.listDomainsID() | ||
| 20 | |||
| 21 | for id in domainIDs: | ||
| 22 | dom = conn.lookupByID(id) | ||
| 23 | if (dom == None): | ||
| 24 | continue | ||
| 25 | dom.shutdown() | ||
| 26 | |||
| 27 | # Wait up to 4 minutes | ||
| 28 | shutdownTimeOut = 240 | ||
| 29 | |||
| 30 | while conn.numOfDomains() > 0 and (time.time() - startTime) < shutdownTimeOut: | ||
| 31 | time.sleep(2) | ||
| 32 | |||
| 33 | if conn.numOfDomains > 0: | ||
| 34 | sys.exit(2) | ||
| 35 | ``` | ||
| 36 | |||
| 37 | This script has to be integrated into the stop and restart part of the `/etc/init.d/libvirt-bin` init script: | ||
| 38 | |||
| 39 | ```bash | ||
| 40 | # …stop or restart section… | ||
| 41 | if running ; then | ||
| 42 | echo -n "Stopping libvirt virtual machines..." | ||
| 43 | /usr/local/bin/libvirt-shutdown-domains || true | ||
| 44 | echo " done" | ||
| 45 | fi | ||
| 46 | ``` | ||
| 47 | |||
| 48 | # Converting OVA images for use with libvirt | ||
| 49 | |||
| 50 | OVA images can be [imported](https://www.redhat.com/en/blog/importing-vms-kvm-virt-v2v) into libvirt using the `virt-v2v` utility (from the `libguestfs-tools` Ubuntu package). | ||
| 51 | |||
| 52 | They can be imported directly using the `libvirt` output method, but I prefer only generating the necessary files, using the `local` output method. This way, I can easily adjust the VM settings before importing them into libvirt. | ||
| 53 | |||
| 54 | ```bash | ||
| 55 | virt-v2v -i ova /path/to/source.ova -o local -of qcow2 -os /path/to/destination/dir | ||
| 56 | ``` | ||
| 57 | |||
| 58 | This will create an XML file with the VM configuration and a QCOW2 file for each disk in `/path/to/destination/dir`. The XML file can be adjusted and then imported using `virsh define`. |