Host KVM Installation

System Requirements for KVM Hypervisor Hosts

KVM is included with a variety of Linux-based operating systems. Although you are not required to run these distributions, the following are recommended:

  • CentOS / RHEL: 7.X
  • Ubuntu: 16.04

The main requirement for KVM hypervisors is the libvirt and Qemu version. No matter what Linux distribution you are using, make sure the following requirements are met:

  • libvirt: 1.2.0 or higher
  • Qemu/KVM: 1.5 or higher (2.5 or higher recommended)

The default bridge in CloudStack is the Linux native bridge implementation (bridge module). CloudStack includes an option to work with OpenVswitch, the requirements are listed below

  • libvirt: 1.2.0 or higher
  • openvswitch: 1.7.1 or higher

In addition, the following hardware requirements apply:

  • Within a single cluster, the hosts must be of the same distribution version.
  • All hosts within a cluster must be homogenous. The CPUs must be of the same type, count, and feature flags.
  • Must support HVM (Intel-VT or AMD-V enabled)
  • 64-bit x86 CPU (more cores results in better performance)
  • 4 GB of memory
  • At least 1 NIC
  • When you deploy CloudStack, the hypervisor host must not have any VMs already running. These will be destroy by CloudStack.

KVM Installation Overview

If you want to use the Linux Kernel Virtual Machine (KVM) hypervisor to run guest virtual machines, install KVM on the host(s) in your cloud. The material in this section doesn’t duplicate KVM installation docs. It provides the CloudStack-specific steps that are needed to prepare a KVM host to work with CloudStack.

Warning

Before continuing, make sure that you have applied the latest updates to your host.

Warning

It is NOT recommended to run services on this host not controlled by CloudStack.

The procedure for installing a KVM Hypervisor Host is:

  1. Prepare the Operating System
  2. Install and configure libvirt
  3. Configure Security Policies (AppArmor and SELinux)
  4. Install and configure the Agent

Prepare the Operating System

The OS of the Host must be prepared to host the CloudStack Agent and run KVM instances.

  1. Log in to your OS as root.

  2. Check for a fully qualified hostname.

    1. $ hostname --fqdn

    This should return a fully qualified hostname such as “kvm1.lab.example.org”. If it does not, edit /etc/hosts so that it does.

  3. Make sure that the machine can reach the Internet.

    1. $ ping www.cloudstack.org
  4. Turn on NTP for time synchronization.

    Note

    NTP is required to synchronize the clocks of the servers in your cloud. Unsynchronized clocks can cause unexpected problems.

    1. Install NTP

      1. $ yum install ntp
      1. $ apt-get install openntpd
  5. Repeat all of these steps on every hypervisor host.

Warning

CloudStack 4.14 requires Java 11 JRE. Installing CloudStack agent will automatically install Java 11, but it’s good to explicitly confirm that the Java 11 is the selected/active one (in case you had a previous Java version already installed) with alternatives --config java, after CloudStack agent is installed.

Install and configure the Agent

To manage KVM instances on the host CloudStack uses a Agent. This Agent communicates with the Management server and controls all the instances on the host.

First we start by installing the agent:

In RHEL or CentOS:

  1. $ yum install -y epel-release
  2. $ yum install cloudstack-agent

In Ubuntu:

  1. $ apt-get install cloudstack-agent

The host is now ready to be added to a cluster. This is covered in a later section, see Adding a Host. It is recommended that you continue to read the documentation before adding the host!

If you’re using a non-root user to add the KVM host, please add the user to sudoers file:

  1. cloudstack ALL=NOPASSWD: /usr/bin/cloudstack-setup-agent
  2. defaults:cloudstack !requiretty

Configure CPU model for KVM guest (Optional)

In additional,the CloudStack Agent allows host administrator to control the guest CPU model which is exposed to KVM instances. By default, the CPU model of KVM instance is likely QEMU Virtual CPU version x.x.x with least CPU features exposed. There are a couple of reasons to specify the CPU model:

  • To maximise performance of instances by exposing new host CPU features to the KVM instances;
  • To ensure a consistent default CPU across all machines,removing reliance of variable QEMU defaults;

For the most part it will be sufficient for the host administrator to specify the guest CPU config in the per-host configuration file (/etc/cloudstack/agent/agent.properties). This will be achieved by introducing following configuration parameters:

  1. guest.cpu.mode=custom|host-model|host-passthrough
  2. guest.cpu.model=from /usr/share/libvirt/cpu_map.xml(only valid when guest.cpu.mode=custom)
  3. guest.cpu.features=vmx ept aes smx mmx ht (space separated list of cpu flags to apply)

There are three choices to fulfill the cpu model changes:

  1. custom: you can explicitly specify one of the supported named model in /usr/share/libvirt/cpu_map.xml
  2. host-model: libvirt will identify the CPU model in /usr/share/libvirt/cpu_map.xml which most closely matches the host, and then request additional CPU flags to complete the match. This should give close to maximum functionality/performance, which maintaining good reliability/compatibility if the guest is migrated to another host with slightly different host CPUs.
  3. host-passthrough: libvirt will tell KVM to passthrough the host CPU with no modifications. The difference to host-model, instead of just matching feature flags, every last detail of the host CPU is matched. This gives absolutely best performance, and can be important to some apps which check low level CPU details, but it comes at a cost with respect to migration: the guest can only be migrated to an exactly matching host CPU.

Here are some examples:

  • custom

    1. guest.cpu.mode=custom
    2. guest.cpu.model=SandyBridge
  • host-model

    1. guest.cpu.mode=host-model
  • host-passthrough

    1. guest.cpu.mode=host-passthrough
    2. guest.cpu.features=vmx

Note

host-passthrough may lead to migration failure,if you have this problem, you should use host-model or custom. guest.cpu.features will force cpu features as a required policy so make sure to put only those features that are provided by the host CPU. As your kvm cluster needs to be made up of homogenous nodes anyway (see System Requirements), it might make most sense to use guest.cpu.mode=host-model or guest.cpu.mode=host-passthrough.

Install and Configure libvirt

CloudStack uses libvirt for managing virtual machines. Therefore it is vital that libvirt is configured correctly. Libvirt is a dependency of cloudstack-agent and should already be installed.

  1. In order to have live migration working libvirt has to listen for unsecured TCP connections. We also need to turn off libvirts attempt to use Multicast DNS advertising. Both of these settings are in /etc/libvirt/libvirtd.conf

    Set the following parameters:

    1. listen_tls = 0
    1. listen_tcp = 1
    1. tcp_port = "16509"
    1. auth_tcp = "none"
    1. mdns_adv = 0
  2. Turning on “listen_tcp” in libvirtd.conf is not enough, we have to change the parameters as well:

    On RHEL or CentOS modify /etc/sysconfig/libvirtd:

    Uncomment the following line:

    1. #LIBVIRTD_ARGS="--listen"

    On Ubuntu 14.04: modify /etc/default/libvirt-bin

    Add “-l” to the following line

    1. libvirtd_opts="-d"

    so it looks like:

    1. libvirtd_opts="-d -l"

    And modify /etc/init/libvirt-bin.conf

    Add “-l” to the following line

    1. env libvirtd_opts="-d"

    so it looks like:

    1. env libvirtd_opts="-d -l"

    On Ubuntu 16.04: just modify /etc/default/libvirt-bin

    Uncomment and change the following line

    1. #env libvirtd_opts=""

    so it looks like:

    1. env libvirtd_opts="-l"
  3. Restart libvirt

    In RHEL or CentOS:

    1. $ service libvirtd restart

    In Ubuntu:

    1. $ service libvirt-bin restart

Configure the Security Policies

CloudStack does various things which can be blocked by security mechanisms like AppArmor and SELinux. These have to be disabled to ensure the Agent has all the required permissions.

  1. Configure SELinux (RHEL and CentOS)

    1. Check to see whether SELinux is installed on your machine. If not, you can skip this section.

      In RHEL or CentOS, SELinux is installed and enabled by default. You can verify this with:

      1. $ rpm -qa | grep selinux
    2. Set the SELINUX variable in /etc/selinux/config to “permissive”. This ensures that the permissive setting will be maintained after a system reboot.

      In RHEL or CentOS:

      1. $ vi /etc/selinux/config

      Change the following line

      1. SELINUX=enforcing

      to this

      1. SELINUX=permissive
    3. Then set SELinux to permissive starting immediately, without requiring a system reboot.

      1. $ setenforce permissive
  2. Configure Apparmor (Ubuntu)

    1. Check to see whether AppArmor is installed on your machine. If not, you can skip this section.

      In Ubuntu AppArmor is installed and enabled by default. You can verify this with:

      1. $ dpkg --list 'apparmor'
    2. Disable the AppArmor profiles for libvirt

      1. $ ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/
      1. $ ln -s /etc/apparmor.d/usr.lib.libvirt.virt-aa-helper /etc/apparmor.d/disable/
      1. $ apparmor_parser -R /etc/apparmor.d/usr.sbin.libvirtd
      1. $ apparmor_parser -R /etc/apparmor.d/usr.lib.libvirt.virt-aa-helper

Configuring the Networking

Warning

This is a very important section, please make sure you read this thoroughly.

Note

This section details how to configure bridges using the native implementation in Linux. Please refer to the next section if you intend to use OpenVswitch

CloudStack uses the network bridges in conjunction with KVM to connect the guest instances to each other and the outside world. They also are used to connect the System VMs to your infrastructure.

By default these bridges are called cloudbr0 and cloudbr1 etc, but this can be changed to be more description.

Warning

It is essential that you keep the configuration consistent across all of your hypervisors.

There are many ways to configure your networking. Even within the scope of a given network mode. Below are a few simple examples.

Network example for Basic Networks

In the Basic networking, all of the guests in a given pod will be on the same VLAN/subnet. It is common to use the native (untagged) VLAN for the private/management network, so in this example we will have two VLANs, one (native) for your private/management network and one for the guest network.

We assume that the hypervisor has one NIC (eth0) with one tagged VLAN trunked from the switch:

  1. Native VLAN for management network (cloudbr0)
  2. VLAN 200 for guest network of the instances (cloudbr1)

In this the following example we give the Hypervisor the IP-Address 192.168.42.11/24 with the gateway 192.168.42.1

Note

The Hypervisor and Management server don’t have to be in the same subnet

Configuring the Network Bridges for Basic Networks

It depends on the distribution you are using how to configure these, below you’ll find examples for RHEL/CentOS and Ubuntu.

Note

The goal is to have two bridges called ‘cloudbr0’ and ‘cloudbr1’ after this section. This should be used as a guideline only. The exact configuration will depend on your network layout.

Configure RHEL or CentOS for Basic Networks

The required packages were installed when libvirt was installed, we can proceed to configuring the network.

First we configure eth0

  1. $ vi /etc/sysconfig/network-scripts/ifcfg-eth0

Make sure it looks similar to:

  1. DEVICE=eth0
  2. HWADDR=00:04:xx:xx:xx:xx
  3. ONBOOT=yes
  4. HOTPLUG=no
  5. BOOTPROTO=none
  6. TYPE=Ethernet
  7. BRIDGE=cloudbr0

We now have to configure the VLAN interfaces:

  1. $ vi /etc/sysconfig/network-scripts/ifcfg-eth0.200
  1. DEVICE=eth0.200
  2. HWADDR=00:04:xx:xx:xx:xx
  3. ONBOOT=yes
  4. HOTPLUG=no
  5. BOOTPROTO=none
  6. TYPE=Ethernet
  7. VLAN=yes
  8. BRIDGE=cloudbr1

Now that we have the VLAN interfaces configured we can add the bridges on top of them.

  1. $ vi /etc/sysconfig/network-scripts/ifcfg-cloudbr0

Now we configure cloudbr0 and include the Management IP of the hypervisor.

Note

The management IP of the hypervisor doesn’t have to be in same subnet/VLAN as the management network, but its quite common.

  1. DEVICE=cloudbr0
  2. TYPE=Bridge
  3. ONBOOT=yes
  4. BOOTPROTO=none
  5. IPV6INIT=no
  6. IPV6_AUTOCONF=no
  7. DELAY=5
  8. IPADDR=192.168.42.11
  9. GATEWAY=192.168.42.1
  10. NETMASK=255.255.255.0
  11. STP=yes

We configure cloudbr1 as a plain bridge without an IP address

  1. $ vi /etc/sysconfig/network-scripts/ifcfg-cloudbr1
  1. DEVICE=cloudbr1
  2. TYPE=Bridge
  3. ONBOOT=yes
  4. BOOTPROTO=none
  5. IPV6INIT=no
  6. IPV6_AUTOCONF=no
  7. DELAY=5
  8. STP=yes

With this configuration you should be able to restart the network, although a reboot is recommended to see if everything works properly.

Warning

Make sure you have an alternative way like IPMI or ILO to reach the machine in case you made a configuration error and the network stops functioning!

Configure Ubuntu for Basic Networks

All the required packages were installed when you installed libvirt, so we only have to configure the network.

  1. $ vi /etc/network/interfaces

Modify the interfaces file to look like this:

  1. auto lo
  2. iface lo inet loopback
  3. # The primary network interface
  4. auto eth0
  5. iface eth0 inet manual
  6. auto eth0.200
  7. iface eth0 inet manual
  8. # management network
  9. auto cloudbr0
  10. iface cloudbr0 inet static
  11. bridge_ports eth0
  12. bridge_fd 5
  13. bridge_stp off
  14. bridge_maxwait 1
  15. address 192.168.42.11
  16. netmask 255.255.255.240
  17. gateway 192.168.42.1
  18. dns-nameservers 8.8.8.8 8.8.4.4
  19. dns-domain lab.example.org
  20. # guest network
  21. auto cloudbr1
  22. iface cloudbr1 inet manual
  23. bridge_ports eth0.200
  24. bridge_fd 5
  25. bridge_stp off
  26. bridge_maxwait 1

With this configuration you should be able to restart the network, although a reboot is recommended to see if everything works properly.

Warning

Make sure you have an alternative way like IPMI or ILO to reach the machine in case you made a configuration error and the network stops functioning!

Network Example for Advanced Networks

In the Advanced networking mode is most common to have (at least) two physical interfaces. In this example we will again have the hypervisor management interface on cloudbr0 on the untagged (native) VLAN. But now we will have a bridge on top of our additional interface (eth1) for public and guest traffic with no VLANs applied by us - CloudStack will add the VLANs as required.

We again give the Hypervisor the IP-Address 192.168.42.11/24 with the gateway 192.168.42.1

Note

The Hypervisor and Management server don’t have to be in the same subnet

Configuring the Network Bridges for Advanced Networks

It depends on the distribution you are using how to configure these, below you’ll find examples for RHEL/CentOS and Ubuntu.

Note

The goal is to have two bridges called ‘cloudbr0’ and ‘cloudbr1’ after this section. This should be used as a guideline only. The exact configuration will depend on your network layout.

Configure RHEL/CentOS for Advanced Networks

The required packages were installed when libvirt was installed, we can proceed to configuring the network.

First we configure eth0

  1. $ vi /etc/sysconfig/network-scripts/ifcfg-eth0

Make sure it looks similar to:

  1. DEVICE=eth0
  2. HWADDR=00:04:xx:xx:xx:xx
  3. ONBOOT=yes
  4. HOTPLUG=no
  5. BOOTPROTO=none
  6. TYPE=Ethernet
  7. BRIDGE=cloudbr0

We now have to configure the VLAN interfaces:

  1. $ vi /etc/sysconfig/network-scripts/ifcfg-eth1
  1. DEVICE=eth1
  2. HWADDR=00:04:xx:xx:xx:xx
  3. ONBOOT=yes
  4. HOTPLUG=no
  5. BOOTPROTO=none
  6. TYPE=Ethernet
  7. BRIDGE=cloudbr1

Now we have the VLAN interfaces configured we can add the bridges on top of them.

  1. $ vi /etc/sysconfig/network-scripts/ifcfg-cloudbr0

Now we configure cloudbr0 and include the Management IP of the hypervisor.

Note

The management IP of the hypervisor doesn’t have to be in same subnet/VLAN as the management network, but its quite common.

  1. DEVICE=cloudbr0
  2. TYPE=Bridge
  3. ONBOOT=yes
  4. BOOTPROTO=none
  5. IPV6INIT=no
  6. IPV6_AUTOCONF=no
  7. DELAY=5
  8. IPADDR=192.168.42.11
  9. GATEWAY=192.168.42.1
  10. NETMASK=255.255.255.0
  11. STP=yes

We configure cloudbr1 as a plain bridge without an IP address

  1. $ vi /etc/sysconfig/network-scripts/ifcfg-cloudbr1
  1. DEVICE=cloudbr1
  2. TYPE=Bridge
  3. ONBOOT=yes
  4. BOOTPROTO=none
  5. IPV6INIT=no
  6. IPV6_AUTOCONF=no
  7. DELAY=5
  8. STP=yes

With this configuration you should be able to restart the network, although a reboot is recommended to see if everything works properly.

Warning

Make sure you have an alternative way like IPMI or ILO to reach the machine in case you made a configuration error and the network stops functioning!

Configure Ubuntu for Advanced Networks

All the required packages were installed when you installed libvirt, so we only have to configure the network.

  1. $ vi /etc/network/interfaces

Modify the interfaces file to look like this:

  1. auto lo
  2. iface lo inet loopback
  3. # The primary network interface
  4. auto eth0
  5. iface eth0 inet manual
  6. # The second network interface
  7. auto eth1
  8. iface eth1 inet manual
  9. # management network
  10. auto cloudbr0
  11. iface cloudbr0 inet static
  12. bridge_ports eth0
  13. bridge_fd 5
  14. bridge_stp off
  15. bridge_maxwait 1
  16. address 192.168.42.11
  17. netmask 255.255.255.240
  18. gateway 192.168.42.1
  19. dns-nameservers 8.8.8.8 8.8.4.4
  20. dns-domain lab.example.org
  21. # guest network
  22. auto cloudbr1
  23. iface cloudbr1 inet manual
  24. bridge_ports eth1
  25. bridge_fd 5
  26. bridge_stp off
  27. bridge_maxwait 1

With this configuration you should be able to restart the network, although a reboot is recommended to see if everything works properly.

Warning

Make sure you have an alternative way like IPMI or ILO to reach the machine in case you made a configuration error and the network stops functioning!

Configure the network using OpenVswitch

Warning

This is a very important section, please make sure you read this thoroughly.

In order to forward traffic to your instances you will need at least two bridges: public and private.

By default these bridges are called cloudbr0 and cloudbr1, but you do have to make sure they are available on each hypervisor.

The most important factor is that you keep the configuration consistent on all your hypervisors.

Preparing

To make sure that the native bridge module will not interfere with openvswitch the bridge module should be added to the blacklist. See the modprobe documentation for your distribution on where to find the blacklist. Make sure the module is not loaded either by rebooting or executing rmmod bridge before executing next steps.

The network configurations below depend on the ifup-ovs and ifdown-ovs scripts which are part of the openvswitch installation. They should be installed in /etc/sysconfig/network-scripts/

OpenVswitch Network example

There are many ways to configure your network. In the Basic networking mode you should have two VLANs, one for your private network and one for the public network.

We assume that the hypervisor has one NIC (eth0) with three tagged VLANs:

  1. VLAN 100 for management of the hypervisor
  2. VLAN 200 for public network of the instances (cloudbr0)
  3. VLAN 300 for private network of the instances (cloudbr1)

On VLAN 100 we give the Hypervisor the IP-Address 192.168.42.11/24 with the gateway 192.168.42.1

Note

The Hypervisor and Management server don’t have to be in the same subnet

Configuring the network bridges for OpenVswitch

It depends on the distribution you are using how to configure these, below you’ll find examples for RHEL/CentOS.

Note

The goal is to have three bridges called ‘mgmt0’, ‘cloudbr0’ and ‘cloudbr1’ after this section. This should be used as a guideline only. The exact configuration will depend on your network layout.

Configure OpenVswitch

The network interfaces using OpenVswitch are created using the ovs-vsctl command. This command will configure the interfaces and persist them to the OpenVswitch database.

First we create a main bridge connected to the eth0 interface. Next we create three fake bridges, each connected to a specific vlan tag.

  1. # ovs-vsctl add-br cloudbr
  2. # ovs-vsctl add-port cloudbr eth0
  3. # ovs-vsctl set port cloudbr trunks=100,200,300
  4. # ovs-vsctl add-br mgmt0 cloudbr 100
  5. # ovs-vsctl add-br cloudbr0 cloudbr 200
  6. # ovs-vsctl add-br cloudbr1 cloudbr 300

Configure OpenVswitch in RHEL or CentOS

The required packages were installed when openvswitch and libvirt were installed, we can proceed to configuring the network.

First we configure eth0

  1. $ vi /etc/sysconfig/network-scripts/ifcfg-eth0

Make sure it looks similar to:

  1. DEVICE=eth0
  2. HWADDR=00:04:xx:xx:xx:xx
  3. ONBOOT=yes
  4. HOTPLUG=no
  5. BOOTPROTO=none
  6. TYPE=Ethernet

We have to configure the base bridge with the trunk.

  1. $ vi /etc/sysconfig/network-scripts/ifcfg-cloudbr
  1. DEVICE=cloudbr
  2. ONBOOT=yes
  3. HOTPLUG=no
  4. BOOTPROTO=none
  5. DEVICETYPE=ovs
  6. TYPE=OVSBridge

We now have to configure the three VLAN bridges:

  1. $ vi /etc/sysconfig/network-scripts/ifcfg-mgmt0
  1. DEVICE=mgmt0
  2. ONBOOT=yes
  3. HOTPLUG=no
  4. BOOTPROTO=static
  5. DEVICETYPE=ovs
  6. TYPE=OVSBridge
  7. IPADDR=192.168.42.11
  8. GATEWAY=192.168.42.1
  9. NETMASK=255.255.255.0
  1. $ vi /etc/sysconfig/network-scripts/ifcfg-cloudbr0
  1. DEVICE=cloudbr0
  2. ONBOOT=yes
  3. HOTPLUG=no
  4. BOOTPROTO=none
  5. DEVICETYPE=ovs
  6. TYPE=OVSBridge
  1. $ vi /etc/sysconfig/network-scripts/ifcfg-cloudbr1
  1. DEVICE=cloudbr1
  2. ONBOOT=yes
  3. HOTPLUG=no
  4. BOOTPROTO=none
  5. TYPE=OVSBridge
  6. DEVICETYPE=ovs

With this configuration you should be able to restart the network, although a reboot is recommended to see if everything works properly.

Warning

Make sure you have an alternative way like IPMI or ILO to reach the machine in case you made a configuration error and the network stops functioning!

Configuring the firewall

The hypervisor needs to be able to communicate with other hypervisors and the management server needs to be able to reach the hypervisor.

In order to do so we have to open the following TCP ports (if you are using a firewall):

  1. 22 (SSH)
  2. 1798
  3. 16509, 16514 (libvirt)
  4. 5900 - 6100 (VNC consoles)
  5. 49152 - 49216 (libvirt live migration)

It depends on the firewall you are using how to open these ports. Below you’ll find examples how to open these ports in RHEL/CentOS and Ubuntu.

Open ports in RHEL/CentOS

RHEL and CentOS use iptables for firewalling the system, you can open extra ports by executing the following iptable commands:

  1. $ iptables -I INPUT -p tcp -m tcp --dport 22 -j ACCEPT
  1. $ iptables -I INPUT -p tcp -m tcp --dport 1798 -j ACCEPT
  1. $ iptables -I INPUT -p tcp -m tcp --dport 16509 -j ACCEPT
  1. $ iptables -I INPUT -p tcp -m tcp --dport 16514 -j ACCEPT
  1. $ iptables -I INPUT -p tcp -m tcp --dport 5900:6100 -j ACCEPT
  1. $ iptables -I INPUT -p tcp -m tcp --dport 49152:49216 -j ACCEPT

These iptable settings are not persistent accross reboots, we have to save them first.

  1. $ iptables-save > /etc/sysconfig/iptables

Open ports in Ubuntu

The default firewall under Ubuntu is UFW (Uncomplicated FireWall), which is a Python wrapper around iptables.

To open the required ports, execute the following commands:

  1. $ ufw allow proto tcp from any to any port 22
  1. $ ufw allow proto tcp from any to any port 1798
  1. $ ufw allow proto tcp from any to any port 16509
  1. $ ufw allow proto tcp from any to any port 16514
  1. $ ufw allow proto tcp from any to any port 5900:6100
  1. $ ufw allow proto tcp from any to any port 49152:49216

Note

By default UFW is not enabled on Ubuntu. Executing these commands with the firewall disabled does not enable the firewall.

Additional Packages Required for Features

Secondary Storage Bypass

New in 4.11 is the ability to bypass storing a template on secondary storage, and instead directly downloading a ‘template’ from an alternate remote location. In order to facilitate this the Aria2 (https://aria2.github.io/) package must be installed on all of your KVM hosts.

As this package often is not available in standard distribution repos, you will need to install the package from your preferred source.

Volume snapshots

CloudStack uses the qemu-img to perform snapshots. In CentOS >= 6.5, the qemu-img supplied by RedHat/CentOS ceased to include a ‘-s’ switch which performs snapshots. The ‘-s’ switch has been restored in latest CentOS/RHEL 7.x versions.

In order to be able to perform volume snapshots on CentOS 6.x (greater than 6.4) you must replace your version of qemu-img with one which has been patched to include the ‘-s’ switch.

Add the host to CloudStack

The host is now ready to be added to a cluster. This is covered in a later section, see Adding a Host. It is recommended that you continue to read the documentation before adding the host!