Kernel-based Virtual Machine (KVM)

General Information

KVM is “a full virtualization solution for Linux on x86 hardware containing virtualization extensions.” (KVM Main Page) It can be run on the desktop with GUI managers or on a headless server.


  • Distro(s): Enterprise Linux 6
  • Other: This page was written using CentOS 6.6 with GNOME desktop (headless KVM is on the to do list!)
  • 2015-02-13: These are rough notes and in progress as I learn KVM.


yum install qemu-kvm python-virtinst virt-top libvirt libvirt-client

CLI Package Explanations

  • qemu-kvm ⇒ The main KVM package.
  • python-virtinst ⇒ CLI tools and libraries for creating VMs.
  • virt-top ⇒ CLI VM stats.
  • libvirt ⇒ Toolkit for libvirtd service.
  • libvirt-client ⇒ Toolkit for VM clients.
yum install virt-manager virt-viewer

GUI Package Explanations

  • virt-manager ⇒ GUI VM administration tool.
  • virt-viewer ⇒ GUI local console connection to VMs.
yum install bridge-utils dejavu-lgc-sans-fonts tigervnc xorg-x11-xauth

Packages Descriptions

  • bridge-utils ⇒ network bridging to allow the VMs to use the host machine's physical interfaces as a bridge.
  • dejavu-lgc-sans-fonts ⇒ Fonts for virt-manager (GUI VM manager)
  • tigervnc ⇒ VNC to connect remotely to VM's GUI.
  • xorg-x11-xauth ⇒ X11 forwarding through ssh. (Remote virt-manager for headless servers)

Verify Installation and Start Services

  • Ensure that the KVM kernel module is loaded
[root@bash ~]# lsmod | grep kvm
kvm_intel              55496  0 
kvm                   337900  1 kvm_intel
  • If it is not loaded, attempt to load the module:
modprobe -v kvm
  • Start the libvirtd service
service libvirtd start
  • Enable libvirtd on system boot
chkconfig libvirtd on
  • Verify libvirtd is running successfully (Yes, 3 forward slashes)
service libvirtd status
virsh -c qemu:///system list

Setup Networking

By default, VMs will be on a private network with no access to the outside world unless they use a physical host network interface as a bridge.

  • Turn off NetworkManager, which does not play nice with bridging.
chkconfig NetworkManager off
service NetworkManager stop
  • Ensure the network service is enabled and running.
chkconfig network on
service network start
  • Create a bridge interface called “br0” that will use the physical interface “eth0” the easy way.
virsh iface-bridge eth0 br0

This will create the new file “ifcfg-br0” and modify “ifcfg-eth0” to look as follows:





br0 will be the interface with an IP address. To make it static, simply edit ifcfg-br0 and change it:


Note: Those DNS entries are for OpenDNS.

  • Enable ip forwarding

Edit /etc/sysctl.conf

inet.ipv4.ip_forward = 1
  • Apply settings
sysctl -p /etc/sysctl.conf
  • Restart the network service
service network restart


If SELinux is on and in Enforcing mode, there is additional configuration if you change the default directory for VM images.

Check if SELinux is on/enabled

[bash]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing

Default VM Image directory: /var/lib/libvirt/images/

  • Create the directory
mkdir /vm-images
  • Set the context of the new directory, referencing the default
chcon -R --reference /var/lib/libvirt/images /vm-images
  • Verify
ls -Z /vm-images
  • Create a symlink to the new location to ensure that is survives a SELinux relabel.
rmdir /var/lib/libvirt/images
ln -s /vm-images /var/lib/libvirt/images

Creating VMs

VMs can be installed via a command line tool (virt-install) or a GUI (virt-manager).

virt-install has many options, see them with “virt-install –help”.

Common options:

General Options
--name=NAME  (Name of the guest)
--ram=MEMORY  (Memory in megabytes)
--vcpus=VCPUS  (Number of vcpus)
Installation Method
--cdrom=CDROM  (CD-ROM installation media, can be ISO or physical cd-rom drive)
--location=LOCATION  (Installation source via http, ftp, or nfs.)
--pxe  (Boot from network using PXE)
--extra-args "ks=http://myserver/mykickstartfile.ks"  (Path to kickstart file for automated installs)
Storage Configuration
--disk=DISKOPTS  (Storage with different options)
  --disk path=/my/existing/disk 
  --disk path=/my/new/disk,size=10 (in GB)
--network bridge=br0  (Guest network interface)
--graphics=GRAPHICS  (Guest display settings)
  --graphics vnc  (Default if DISPLAY environment variable is set)
  --graphics none  (Default if DISPLAY environment variable is not set)

Example: Interactive Install with VNC

Install a VM called “centos1”, create a 20GB hard drive, 1 CPU, 1GB ram, point it to the iso, have it use the network interface “br0”

virt-install \
--name=centos1 \
--disk path=/vm-images/centos1.img,size=20 \
--vcpus=1 --ram=1024 \
--cdrom=/vm-images/CentOS-6.6-x86_64-netinstall.iso \
--network bridge=br0

Connect to Guest for Installation

After the VM is created, if you are using the “–graphics vnc” option (either by default or explicitly), a console is opened up for interactive install.

If you close it, this is how you can connect back to the guest:

  • Method 1: Connect directly to the guest console

Example connect to the guest named “centos1” (Yes, that is 3 slashes)

virt-viewer --connect qemu:///system centos1
  • Method 2: Open virt-manager

Example open virt-manager and then the VM “centos1”

  • Select the VM
  • Click “Open”

Proceed with installation as normal.

Installing locally via a GUI.

  • Open a terminal and type:
  • The virt-manager GUI will open.
  • Select the name of the host (probably “localhost (QEMU)”)
  • Click the “Create a New Virtual Machine” button (the monitor with a play button on it)
    • Step 1 ⇒
      • Name: Name the virtual machine
      • Choose how to install: Select the install method
    • Step 2 ⇒
      • Browse for the media
      • OS Type/Version: Optionally, select the OS type and version
    • Step 3 ⇒
      • Memory/CPU: Select memory and CPU.
    • Step 4 ⇒
      • Storage: Create or use existing storage
    • Step 5 ⇒
      • Ready to install: Confirm settings, set advanced options such as Host network device.

Disabling virbr0 NAT Interface

On some desktop installations, a NAT interface “virbr0” is auto created.

To disable this interface:

  • View the interface
    virsh net-list
  • Turn off the interface
    virsh net-destroy default
  • Disable auto start on the interface
    virsh net-autostart default –disable
  • Verify State is “inactive” and Autostart is “no”, then ensure virbr0 is not in the interface list
    virsh net-list --all
    ip addr show
  • Restart the network service
    • EL6
      service network restart
    • EL7
      systemctl restart network

  • linux_wiki/kernel-based_virtual_machine_kvm.txt
  • Last modified: 2019/05/25 23:50
  • (external edit)