How to Install KVM on CentOS/RHEL 8

Kernel-based Virtual Machine (KVM in short) is an open-source and de facto standard virtualization solution that is tightly integrated into Linux. It is a loadable kernel module that turns Linux into a type-1 (bare-metal) hypervisor that creates a virtual operating platform used to run virtual machines (VMs).

Under KVM, each VM is a Linux process that is scheduled and managed by the kernel and has private virtualized hardware (i.e CPU, network card, disk, etc.). It also supports nested virtualization, which allows you to run a VM inside another VM.

Some of its key features include support for a wide range of Linux-supported hardware platforms (x86 hardware with virtualization extensions (Intel VT or AMD-V)), it provides enhanced VM security and isolation using both SELinux and secure virtualization (sVirt), it inherits kernel memory management features, and it supports both offline and real-time migration (migration of a running VM between physical hosts).

In this article, you will learn how to install KVM virtualization, create and manage Virtual Machines in CentOS 8 and RHEL 8 Linux.


  1. A fresh installation of CentOS 8 server
  2. A fresh installation of RHEL 8 server
  3. A RedHat subscription enabled on RHEL 8 server

Additionally, make sure that your hardware platform supports virtualization by running the following command.

# grep -e 'vmx' /proc/cpuinfo		#Intel systems
# grep -e 'svm' /proc/cpuinfo		#AMD systems

Also, confirm that KVM modules are loaded in the kernel (they should be, by default).

# lsmod | grep kvm

Here is sample output on the test system which is Intel-based:

Check Virtualization Support on CentOS 8
Check Virtualization Support on CentOS 8

In a previous series of KVM guides, we showed how to create virtual machines in Linux using KVM (Kernel-based Virtual Machine) where we demonstrated how to create and manage VMs using virt-manager GUI tool (which is now deprecated according to the RHEL 8 documentation). For this guide, we will take a different approach, we will use the Cockpit web console.

Step 1: Setup Cockpit Web Console on CentOS 8

1. The cockpit is an easy-to-use, integrated and extendable web-based interface to administer a Linux server in a web browser. It enables you to perform system tasks such as configuring networks, administering storage, creating VMs, and inspecting logs with a mouse. It uses your system’s normal user logins and privileges, but other authentication methods are supported as well.

It comes pre-installed and enabled on freshly installed CentOS 8 and RHEL 8 system, if you don’t have it installed, install it using the following dnf command. The cockpit-machines extension should be installed to manage VMs based on Libvirt.

# dnf install cockpit cockpit-machines

2. When the package installation is complete, start the cockpit socket, enable it to auto-start at system boot and check its status to confirm that it is up and running.

# systemctl start cockpit.socket
# systemctl enable cockpit.socket
# systemctl status cockpit.socket
Verify Cockpit Status
Verify Cockpit Status

3. Next, add the cockpit service in the system firewall which is enabled by default, using the firewall-cmd command and reload the firewall configuration to apply the new changes.

# firewall-cmd --add-service=cockpit --permanent
# firewall-cmd --reload

4. To access the cockpit web console, open a web browser and use the following URL to navigate.


The cockpit uses a self-signed certificate to enable HTTPS, simply proceed with the connection when you get a warning from the browser. At the login page, use your server user account credentials.

Cockpit Login
Cockpit Login
Cockpit Dashboard
Cockpit Dashboard

Step 2: Installing KVM Virtualization CentOS 8

5. Next, install the virtualization module and other virtualization packages as follows. The virt-install package provides a tool for installing virtual machines from the command-line interface, and a virt-viewer is used to view virtual machines.

# dnf module install virt 
# dnf install virt-install virt-viewer

6. Next, run the virt-host-validate command to validate if the host machine is set up to run libvirt hypervisor drivers.

# virt-host-validate
validate host virtualization setup
validate host virtualization setup

7. Next, start the libvirtd daemon (libvirtd) and enable it to start automatically on each boot. Then check its status to confirm that it is up and running.

# systemctl start libvirtd.service
# systemctl enable libvirtd.service
# systemctl status libvirtd.service
Verify Libvirtd Service
Verify Libvirtd Service

Step 3: Set Up Network Bridge (Virtual Network Switch) via Cockpit

8. Now create a network bridge (virtual network switch) to integrate virtual machines to the same network as the host. By default, once libvirtd daemon is started, it activates the default network interface virbr0 that represents the virtual network switch which operates in NAT mode.

For this guide, we will create a network interface in a bridged mode called br0. This will enable virtual machines to be accessible on the host networks.

From the cockpit main interface, click on Networking, then click Add Bridge as indicated in the following screenshot.

Add Bridge Network
Add Bridge Network

9. From the pop-up window, enter the bridge name and select the bridge slaves or port devices (e.g enp2s0 representing the Ethernet interface) as shown in the following screenshot. Then click Apply.

Enter Network Bridge Settings
Enter Network Bridge Settings

10. Now when you look at the list of Interfaces, the new bridge should appear there and after a few seconds, the Ethernet interface should be disabled (taken down).

Verify New Network Bridge
Verify New Network Bridge

Step 4: Creating and Managing Virtual Machines via Cockpit Web Console

11. From the cockpit main interface, click on the Virtual Machines option as highlighted in the following screenshot. From the Virtual Machines page, click on Create VM.

Create New Virtual Machine
Create a New Virtual Machine

12. A window with options to create a new VM will display. Enter the Connection, Name (e,g ubuntu18.04), Installation Source Type (on the test system, we have stored ISO images under the storage pool i.e /var/lib/libvirt/images/), Installation Source, Storage, Size, Memory as shown in the following image. The OS Vendor and Operating System should be picked automatically after entering Installation Source.

Also check the option to immediately start the VM, then click Create.

Add New Virtual Machine in KVM
Add New Virtual Machine in KVM

13. After clicking Create from the previous step, the VM should be automatically started and it should boot using the ISO image provided. Proceed to install the guest operating system (Ubuntu 18.04 in our case).

Install Guest OS on KVM
Install Guest OS on KVM

If you click on Network Interfaces of the VM, the network source should indicate the newly created bridge network interface.

Network Bridge of VM
Network Bridge of VM

And during the installation, at the step of configuring a network interface, you should be able to notice that the VMs Ethernet interface receives an IP address from the DHCP server of the host network.

IP Address of VM
IP Address of VM

Note that you need to install the OpenSSH package to access the guest OS via SSH from any machine on the host network, as described in the last section.

14. When the guest OS installation is complete, reboot the VM, then go to Disks and detach/remove the cdrom device under the VMs disks. Then click Run to start the VM.

Detach Cdrom After VM Installation
Detach Cdrom After VM Installation
Run VM Console
Run VM Console

15. Now under Consoles, you can log into the guest OS using a user account you created during the installation of the OS.

VM Login
VM Login

Step 5: Accessing a Virtual Machine Guest OS via SSH

16. To access the newly installed guest OS from the host network via SSH, run the following command (replace with your guest’s IP address).

$ ssh [email protected]
Guest VM SSH Login
Guest VM SSH Login

17. To shut down, restart or delete a VM, click on it from the list of VMs, then use the buttons highlighted in the following screenshot.

Delete Guest VM from KVM
Delete Guest VM from KVM

That’s all for now! In this guide, we have shown how to install KVM virtualization packages, and create and manage VMs via the cockpit web console. For more detail, see: Getting started with virtualization in RHEL 8.

Aaron Kili
Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge.

Each tutorial at TecMint is created by a team of experienced Linux system administrators so that it meets our high-quality standards.

Join the TecMint Weekly Newsletter (More Than 156,129 Linux Enthusiasts Have Subscribed)
Was this article helpful? Please add a comment or buy me a coffee to show your appreciation.


Leave a Reply
  1. I followed your article still failed :

    ERROR internal error: process exited while connecting to monitor: 2022-03-06T02:08:53.985803Z qemu-kvm: -blockdev {“driver”:”file”,”filename”:”/var/lib/libvirt/images/Win10MGMT.qcow2″,”node-name”:”libvirt-2-storage”,”auto-read-only”:true,”discard”:”unmap”}: Could not open ‘/var/lib/libvirt/images/Win10MGMT.qcow2’: Permission denied Domain installation does not appear to have been successful. If it was, you can restart your domain by running: virsh –connect qemu:///system start Win10MGMT otherwise, please restart your installation.

    • @Vix,

      Suggest you disable SELinux or try setting execute permissions on the pool..

      $ sudo chmod a+x /var/lib/libvirt/images/
  2. Hello Sir,

    I followed all steps KVM installed successfully but when to try to install ubuntu vm in KVM via the cockpit, vm get paused with the following log error

    $ cat /var/log/libvirt/ubuntu.log

    KVM: entry failed, hardware error 0x80000021

    If you’re running a guest on an Intel machine without unrestricted mode support, the failure can be most likely due to the guest entering an invalid state for Intel VT. For example, the guest may be running in big real mode.

    which is not supported on less recent Intel processors.

    EAX=00009900 EBX=00000000 ECX=00000000 EDX=00000600
    ESI=00000000 EDI=00000000 EBP=00000000 ESP=00000000
    EIP=00001010 EFL=00010002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
    ES =9900 00099000 0000ffff 00009300
    CS =9900 00099000 0000ffff 00009b00
    SS =9900 00099000 0000ffff 00009300
    DS =9900 00099000 0000ffff 00009300
    FS =0000 00000000 0000ffff 00009300
    GS =0000 00000000 0000ffff 00009300
    LDT=0000 00000000 0000ffff 00008200
    TR =0000 00000000 0000ffff 00008b00
    GDT= 00000000 0000ffff
    IDT= 00000000 0000ffff

  3. In order to get the “Virtual Machines” menu item to appear in Cockpit, I had to install the following package:

    $ cockpit-machines

    Hope this helps!

  4. Thanks!

    BUT Why? put those “#” at the beginning of the line?

    That makes copy-paste of multiple lines into a terminal nightmare!

  5. Thanks,

    I have two network cards where I configured one for bridge mode and the other I left in NAT.

    Could you tell me how to create an “internal network” in the virt manager just like the virtual box so that the VMS communicate between them?

  6. By default when creating a VM the disks created are thin provisioned or thick provisioned? if are thick provisioned how can I create disks in thin provision?

    • @Gabo

      You can use the virt-sparsify tool which makes a virtual machine disk sparse a.k.a. thin-provisioned:

  7. There’s a typo in section 2:7. I assume you don’t mean to start the `libvirtd.service‘ 3 times. :)

    # systemctl enable --now libvirtd.service
    # systemctl is-active libvirtd.service

Got Something to Say? Join the Discussion...

Thank you for taking the time to share your thoughts with us. We appreciate your decision to leave a comment and value your contribution to the discussion. It's important to note that we moderate all comments in accordance with our comment policy to ensure a respectful and constructive conversation.

Rest assured that your email address will remain private and will not be published or shared with anyone. We prioritize the privacy and security of our users.