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-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
The presence of the
vmx (for Intel) or
svm (for AMD) flags indicate that your CPU supports the virtualization extensions.
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
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 126.96.36.199:0 -m 1024 -drive format=raw,index=2,file=debian.img -enable-kvm -daemonize
- Ensure that the instance is running:
root@kvm:~# pgrep -lfa qemu
4895 qemu-system-x86_64 -name debian -vnc 188.8.131.52:0 -m 1024 -drive format=raw,index=2,file=debian.img -enable-kvm -daemonize
- Terminate the instance:
root@kvm:~# pkill qemu
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
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
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 184.108.40.206: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 220.127.116.11:0 -cpu Nehalem -m 1024 -drive format=raw,index=2,file=debian.img -daemonize
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.