There are several ways to host virtual machines on Linux. The most popular tool qemu will be discussed in this lecture.


Qemu is an emulator. It’s able to run code for different processors than the host processor. So, you could emulate your mobile phone on you’re PC. Qemu can be downloaded from here:

But, it’s better to install it from packages on Linux:

$ sudo apt install qemu-system qemu-kvm

Qemu is important because it can emulate a foreign (or native) machine. Another component called KVM uses the hardware in modern processors that enables virtualization to hugely speed up the emulation of native code. KVM is the official Linux virtualization solution and can be found here:

In order for KVM to work you must have virtualization hardware enabled. It’s possible to run a VM inside of a VM. You can enable that option in VMware but it’s not necessary. You can always do software emulation, it’s just slower.

Starting the Emulator

If you’re running on a desktop machine qemu comes with a GUI. Running the qemu-system-x86_64 command starts it:

$ qemu-system-x86_64 

Here’s what the GUI looks like:


It’s a full fledged virtual machine!

Testing Kernels

One of the important features of qemu is the ability to test the kernel you just made. First you need to get qemu to work on the command line (without a GUI).

$ qemu-system-x86_64 -m 256 -nographic -serial mon:stdio -kernel <kernel-file> -initrd <initrd-file> -append console=ttyS0

You can escape Qemu with the keys: Ctrl-A X

Using KVM

You can see if your processor supports virtualization by looking in /proc/cpuinfo:

$ grep -E '(vmx|svm)' /proc/cpuinfo

If you processor supports virtualization you can verify that the modules are loaded:

$ lsmod | grep kvm 

If both of those are true you can add the -enable-kvm flag to qemu:

$ qemu-system-x86_64 -m 256 -nographic -serial mon:stdio -kernel <kernel-file> -initrd <initrd-file> -append console=ttyS0 -enable-kvm