Wiki source code of libvirt

Last modified by Sebastian Marsching on 2023/05/16 20:12

Hide last authors
Sebastian Marsching 9.1 1 {{toc/}}
2
Sebastian Marsching 1.1 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
Sebastian Marsching 8.1 40 # …stop or restart section…
Sebastian Marsching 1.1 41 if running ; then
42 echo -n "Stopping libvirt virtual machines..."
43 /usr/local/bin/libvirt-shutdown-domains || true
44 echo " done"
45 fi
Sebastian Marsching 9.1 46 ```
Sebastian Marsching 7.1 47
Sebastian Marsching 9.1 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
Sebastian Marsching 1.1 56 ```
Sebastian Marsching 9.1 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`.
Sebastian Marsching 10.1 59
Sebastian Marsching 13.1 60 # Recovering unused space from a virtual disk images{{id name="virt-sparsify"/}}
Sebastian Marsching 10.1 61
Sebastian Marsching 14.1 62 libvirt offers a utility called `virt-sparsify`, which helps with recovering unused space from virtual disk images, reducing their size on disk. This is particularly useful with images in the QCOW2 format.
Sebastian Marsching 10.1 63
Sebastian Marsching 11.1 64 The utility can either be used in-place or create a new image. In either case, the virtual machine has to be shutdown before starting the process. To use the in-place variant, use the following command:
Sebastian Marsching 10.1 65
66 ```bash
67 virt-sparsify --in-place /path/to/image.qcow2
68 ```
69
70 The advantage of this method is that you don’t need a lot of free space on the partition storing the image. The disadvantages are that it does not always recover as much space as the second method, and if something goes wrong, the image might be damaged.
71
72 The second variant creates a new image, copying data from the original one. This method has the disadvantage that it does not only require enough free space for the new image but also a lot of temporary space. As the default location for temporary files often does not offer enough free space, it can make sense to set `TMPDIR` to point to a path on a partition with a sufficient amount of free space.
73
74 When using this methods, options can be passed to the `qemu-img` command. For example, setting the `preallocation` option might be useful:
75
76 ```bash
77 mkdir /path/to/partition/with/free/space/tmp
78 TMPDIR=/path/to/partition/with/free/space/tmp virt-sparsify /path/to/original/image.qcow2 -o preallocation=metadata /path/to/new/image.qcow2
79 rm -r /path/to/partition/with/free/space/tmp
80 ```
81
82 This will create an entirely new image, not touching the original one. Typically, the only useful values for the prellocation option or `none` or `metadata`. Using `falloc` or `full` will defeat the purpose of `virt-sparsify`, because instead of creating a sparse image, the unused space in the image is still going to be allocated, thus not freeing up any space.
Sebastian Marsching 11.1 83
84 Please note that when using this method, internally stored snapshots are going to be lost, so make sure that the virtual machine does not have any snapshots before starting this process.