Wiki source code of libvirt

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

Show last authors
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`.
59
60 # Recovering unused space from a virtual disk images{{id name="virt-sparsify"/}}
61
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.
63
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:
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.
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.