Linux Beyond the Basics: QEMU and KVM

Kernel-based Virtual Machines

Dagang Wei
5 min readAug 22, 2024

This blog post is part of the series Linux Beyond the Basics.

Introduction

Have you ever wished you could run multiple operating systems on your Linux machine without the hassle of dual-booting or complex partitioning? Or perhaps you’re a developer who needs to test software across different platforms? If so, then you’re in luck, because Linux has powerful tools called QEMU and KVM that can help you achieve these goals and more. But before we dive into QEMU and KVM, let’s first understand what a hypervisor is.

Hypervisors: The Software Magicians

Think of a hypervisor as a master illusionist, capable of creating virtual worlds within your computer. In technical terms, a hypervisor is a software layer that sits between the hardware and the operating systems, allowing you to run multiple virtual machines (VMs) on a single physical machine. Each VM acts as a self-contained computer with its own operating system, applications, and resources.

KVM: Kernel as a Hypervisor

KVM (Kernel-based Virtual Machine) is a type of hypervisor that’s built directly into the Linux kernel. It leverages hardware virtualization features, such as Intel VT-x or AMD-V, to provide near-native performance for your virtual machines. KVM acts as the ringmaster, managing the allocation of hardware resources like CPU, memory, and I/O devices to the various VMs.

The following is the abstractions provided by KVM:

  • Hardware Virtualization: KVM harnesses the power of hardware virtualization extensions (like Intel VT-x or AMD-V) to conjure virtual CPUs, memory, and I/O devices, presenting a convincing virtual environment that guest operating systems perceive as real hardware.
  • Resource Allocation and Scheduling: KVM acts as a meticulous resource manager, allocating physical resources like CPU time, memory, and I/O bandwidth to each virtual machine, ensuring fairness and preventing resource conflicts. It also intelligently schedules the execution of virtual CPUs on the physical cores, maximizing efficiency even on single-core systems.
  • Memory Management: KVM employs sophisticated memory management techniques to map virtual memory addresses used by guest operating systems to physical memory addresses, ensuring secure and efficient memory access for each virtual machine.
  • Interrupt Handling: KVM intercepts and manages interrupts generated by virtual devices, efficiently routing them to the appropriate virtual machine.

QEMU: The Versatile Emulator

QEMU (Quick Emulator) is a powerful emulation software that can emulate a wide variety of hardware platforms. It can be used independently to run different operating systems on your Linux machine, but it truly shines when combined with KVM. QEMU acts as the stagehand, providing the necessary emulation layer for KVM to create and manage virtual machines.

The following is the abstractions provided by QEMU:

  • Device Emulation: QEMU serves as a master emulator, replicating the behavior of a wide array of hardware devices, such as network cards, disk controllers, and graphics adapters. This allows guest operating systems to interact with virtual devices using standardized interfaces, oblivious to the underlying virtualization layer.
  • BIOS Emulation: QEMU provides a virtual BIOS that initializes the virtual machine and loads the guest operating system, ensuring compatibility with a diverse range of operating systems and booting processes.
  • Machine Emulation: QEMU’s prowess extends to emulating entire machine architectures, enabling you to run operating systems designed for different platforms (e.g., ARM, PowerPC) on your x86-based Linux machine.
  • User-Mode Emulation: QEMU also offers user-mode emulation, allowing you to execute binaries compiled for other architectures directly on your Linux system without the overhead of a full virtual machine.

How KVM and QEMU Work Together

Imagine KVM as the conductor of an orchestra, while QEMU is the musician playing the instruments. KVM provides the underlying virtualization capabilities, while QEMU handles the emulation of specific hardware components. When you create a virtual machine using KVM and QEMU, KVM takes care of the core virtualization tasks, while QEMU emulates the hardware that the guest operating system expects to see. This combination allows you to run a wide range of operating systems and software on your Linux machine with impressive performance.

Why Use KVM and QEMU

  • Isolation and Security: Each VM runs in its own isolated environment, protecting it from other VMs and the host system. This makes it ideal for testing potentially risky software or running applications that require strict security.
  • Flexibility and Portability: You can easily create, clone, and migrate VMs between different physical machines. This is particularly useful for developers who need to test software across different platforms or for system administrators who need to manage multiple servers.
  • Resource Efficiency: You can make better use of your hardware resources by running multiple VMs on a single physical machine. This can lead to significant cost savings, especially in data centers or cloud environments.
  • Legacy Software Support: QEMU’s emulation capabilities allow you to run legacy software that may not be compatible with modern hardware or operating systems.

KVM/QEMU vs Cgroups

While both KVM/QEMU and cgroups (control groups) are used for resource management in Linux, they serve different purposes. Cgroups are primarily used for controlling and limiting the resource usage of processes within a single operating system. KVM/QEMU, on the other hand, are used for creating and managing entire virtual machines, each with its own operating system and resources. Think of cgroups as traffic lights controlling the flow of vehicles within a city, while KVM/QEMU are like separate cities with their own infrastructure and traffic management systems.

Getting Started with QEMU/KVM

Now that you understand the power and benefits of QEMU/KVM, let’s explore how to use these tools to create and manage your own virtual machines. While the exact steps may vary depending on your Linux distribution, here’s a general overview of the process:

Install QEMU and KVM:

  • Most Linux distributions include QEMU and KVM packages in their repositories. You can install them using your package manager, such as apt on Debian/Ubuntu or yum on Fedora/CentOS.
  • Ensure that your CPU supports hardware virtualization (Intel VT-x or AMD-V) and that it’s enabled in your BIOS settings.

Download or Create a Disk Image:

  • You’ll need a disk image file to store the operating system and data for your virtual machine. You can download pre-built disk images from various sources or create your own using tools like qemu-img.

Create and Start a Virtual Machine:

  • Use the qemu-system-x86_64 command (or similar, depending on your architecture) to create and start a virtual machine.
  • Specify the disk image file, the amount of RAM, the number of CPUs, and other options as needed.
  • Example: qemu-system-x86_64 -enable-kvm -m 2048 -cpu host -hda /path/to/disk.img -cdrom /path/to/iso.iso

Interact with the Virtual Machine:

  • QEMU provides a graphical console window or a serial console for interacting with the virtual machine.
  • You can also use tools like VNC or SPICE to access the virtual machine’s graphical desktop remotely.

Manage Virtual Machines:

  • Use tools like virsh (part of the libvirt virtualization management library) to list, start, stop, and manage your virtual machines from the command line.
  • Consider exploring graphical tools like virt-manager for a more user-friendly interface.

Remember, this is just a brief overview. For detailed instructions and advanced configurations, refer to the official QEMU and KVM documentation and online resources.

Takeaway

KVM and QEMU are powerful tools that can significantly enhance your Linux experience. Whether you’re a developer, system administrator, or simply an enthusiast who wants to explore different operating systems, KVM and QEMU provide a flexible, secure, and efficient way to run multiple virtual machines on your Linux machine. So go ahead and unleash the power of virtualization with KVM and QEMU!

--

--