In this recipe, we are going to start a QEMU virtual machine with KVM acceleration. Kernel-based Virtual Machine (KVM) is a full virtualization technology for CPU architectures that support virtualization extensions. For Intel-based processors, this is the Intel VT, and for AMD CPUS, it is the AMD-V hardware extension. The main parts of KVM are two loadable kernel modules, named kvm.ko
, which provides the main virtualization functionality, and a second kernel module that is processor specific, kvm-intel.ko
and kvm-amd.ko
for both main CPU vendors.
QEMU is the userspace component to create virtual machines, where KVM resides in kernel space. If you completed the Running virtual machines with qemu-system-* recipe, you might note that the difference between running a KVM virtual machine and running a nonaccelerated QEMU instance is just a single command-line option.
In order to start a KVM instance, you will need the following:
- The QEMU binaries, provided after following the Installing and configuring QEMU recipe
- The custom raw Debian image we built in the Installing a custom OS on the image with debootstrap recipe
- Processor that supports virtualization
- The KVM kernel modules
To check whether your CPU supports virtualization, run the following code:
root@kvm:~# cat /proc/cpuinfo | egrep "vmx|svm" | uniq
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm epb tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm xsaveopt cqm_llc cqm_occup_llc dtherm arat pln pts
root@kvm:~#
The presence of the vmx
(for Intel) or svm
(for AMD) flags indicate that your CPU supports the virtualization extensions.
Note
The flags from the cpuinfo
command output simply mean that your processor supports virtualization; however, make sure that this feature is enabled in the BIOS of your system; otherwise, the KVM instance will fail to start.
To manually load the KVM kernel module and ensure that it's been loaded, run the following code:
root@kvm:~# modprobe kvm
root@kvm:~# lsmod | grep kvm
kvm 455843 0
root@kvm:~#
To start a KVM instance, ensure that it's running and finally terminate it, execute the following:
- Start a QEMU instance with KVM support:
root@kvm:~# qemu-system-x86_64 -name debian -vnc 146.20.141.254:0 -m 1024 -drive format=raw,index=2,file=debian.img -enable-kvm -daemonize
root@kvm:~#
- Ensure that the instance is running:
root@kvm:~# pgrep -lfa qemu
4895 qemu-system-x86_64 -name debian -vnc 146.20.141.254:0 -m 1024 -drive format=raw,index=2,file=debian.img -enable-kvm -daemonize
root@kvm:~#
- Terminate the instance:
root@kvm:~# pkill qemu
root@kvm:~#
To start a QEMU/KVM virtual machine, all we had to do differently from what we performed in the Installing and configuring QEMU recipe is pass the -enable-kvm
flag to the qemu-system-x86_64
command.
In step 1, we specified a name for the VM with the -name
flag, provided the IP address of our physical host to the -vnc
flag, enabling VNC access for the virtual instance, allocated 1 GB of memory with the -m
flag, specified the partition where the bootloader is located with the index=2
parameter, the image format, and name, and finally we enabled KVM hardware acceleration with the -enable-kvm
parameter and deamonized the process with the -daemonize
flag.
In step 2, we ensured that the instance is running and we terminated it in step 3.
As an alternative to directly running the qemu-system
-* commands, on Ubuntu systems there's the qemu-kvm
package that provides the /usr/bin/kvm
binary. This file is a wrapper to the qemu-system-x86_64
command, and it passes the -enable-kvm
parameter to it automatically.
To install the package and use the kvm
command instead, run the following:
root@kvm:~# apt install qemu-kvm
...
root@kvm:~# kvm -name debian -vnc 146.20.141.254:0 -cpu Nehalem -m 1024 -drive format=raw,index=2,file=debian.img -daemonize
root@kvm:~# pgrep -lfa qemu
25343 qemu-system-x86_64 -enable-kvm -name debian -vnc 146.20.141.254:0 -cpu Nehalem -m 1024 -drive format=raw,index=2,file=debian.img -daemonize
root@kvm:~#
You might have noted that starting and stopping QEMU/KVM instances is somewhat of a manual process, especially having to kill the instance process in order to stop it. In Chapter 2, Using libvirt to Manage KVM, we are going to walk you through a set of recipes that will make managing the life cycle of KVM virtual machines much easier, with the userspace tools that the libvirt package provides.