Saturday 19 July 2014

Virtualization with KVM on CentOS 6.4

Virtualization with KVM on CentOS 6.4 Server

This guide explains how you can install and use KVM for creating and running virtual machines on a CentOS 6.4 server. I will show how to create image-based virtual machines and also virtual machines that use a logical volume (LVM). KVM is short for Kernel-based Virtual Machine and makes use of hardware virtualization, i.e., you need a CPU that supports hardware virtualization, e.g. Intel VT or AMD-V.

1 Preliminary Note
I'm using a CentOS 6.4 server with the hostname virt.example.com and the IP address 192.168.0.100 here as my KVM host.
I had SELinux disabled on my CentOS 6.4 system. I didn't test with SELinux on; it might work, but if not, you better switch off SELinux as well:
# vi /etc/selinux/config

Set SELINUX=disabled

Now save the file and reboot
# reboot

We also need a desktop system where we install virt-manager so that we can connect to the graphical console of the virtual machines that we install. I'm using a Fedora 17 desktop here.

2 Installing KVM
CentOS 6.4 KVM Host: First check if your CPU supports hardware virtualization - if this is the case, the command.
# egrep '(vmx|svm)' --color=always /proc/cpuinfo

If nothing is displayed, then your processor doesn't support hardware virtualization, and you must stop here.

Now we import the GPG keys for software packages:
# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*

To install KVM and virtinst (a tool to create virtual machines), we run
# yum install kvm libvirt python-virtinst qemu-kvm

Then start the libvirt daemon:
# /etc/init.d/libvirtd start

To check if KVM has successfully been installed, run
# virsh -c qemu:///system list

It should display something like this:
Id Name                 State
----------------------------------

If it displays an error instead, then something went wrong.
Next we need to set up a network bridge on our server so that our virtual machines can be accessed from other hosts as if they were physical systems in the network. To do this, we install the package bridge-utils...
# yum install bridge-utils

Now configure a bridge. Create the file /etc/sysconfig/network-scripts/ifcfg-br0 (please use the IPADDR, PREFIX, GATEWAY, DNS1 and DNS2 values from the /etc/sysconfig/network-scripts/ifcfg-eth0 file); make sure you use TYPE=Bridge, not TYPE=Ethernet:
# vi /etc/sysconfig/network-scripts/ifcfg-br0

DEVICE="br0"
NM_CONTROLLED="yes"
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=none
IPADDR=192.168.0.100
PREFIX=24
GATEWAY=192.168.0.1
DNS1=8.8.8.8
DNS2=8.8.4.4
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System br0"

Modify /etc/sysconfig/network-scripts/ifcfg-eth0 as follows (comment out BOOTPROTO, IPADDR, PREFIX, GATEWAY, DNS1, and DNS2 and add BRIDGE=br0):
# vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE="eth0"
#BOOTPROTO=none
NM_CONTROLLED="yes"
ONBOOT=yes
TYPE="Ethernet"
UUID="73cb0b12-1f42-49b0-ad69-731e888276ff"
HWADDR=00:1E:90:F3:F0:02
#IPADDR=192.168.0.100
#PREFIX=24
#GATEWAY=192.168.0.1
#DNS1=8.8.8.8
#DNS2=8.8.4.4
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
BRIDGE=br0

Restart the network...
# /etc/init.d/network restart

And run ifconfig. It should now show the network bridge (br0)
# ifconfig

3 Installing virt-viewer Or virt-manager On Your Fedora 17 Desktop
We need a means of connecting to the graphical console of our guests - we can use virt-manager for this. I'm assuming that you're using a Fedora 17 desktop.
Run this command to install virt-manager.
# yum install virt-manager libvirt qemu-system-x86 openssh-askpass

CentOs 6.4 KVM Host:
Now let's go back to our CentOS 6.4 KVM host. Take a look at
# man virt-install                             (to learn how to use virt-install).

5 Connecting To The Guest
Fedora 17 Desktop: The KVM guest will now boot from the Debian Squeeze Netinstall CD and start the Debian installer - that's why we need to connect to the graphical console of the guest. You can do this with virt-manager on the Fedora 17 desktop.
                Go to Applications > System Tools > Virtual Machine Manager to start virt-manager.
                Or run this command on terminal:
# virt-manager
               
When you start virt-manager for the first time, you will most likely see the message Unable to open a connection to the libvirt management daemon. You can ignore this because we don't want to connect to the local libvirt daemon, but to the one on our CentOS 6.4 KVM host. Click on Close and go to File > Add Connection... to connect to our CentOS 6.4 KVM host.
Select QEMU/KVM as Hypervisor, then check Connect to remote host, select SSH in the Method drop-down menu, type in root as the Username and the hostname (virt.example.com) or IP address (192.168.0.100) of the CentOS 6.4 KVM host in the Hostname field. Then click on Connect.
Afterwards type in the root password of the CentOS 6.4 KVM host.
Now create a virtual machine, customise its hardware and then install OS on it graphically.

6. Managing A KVM Guest From The Command Line
CentOS 6.4 KVM Host: KVM guests can be managed through virsh, the "virtual shell". To connect to the virtual shell, run
# virsh --connect qemu:///system
virsh #

You can now type in commands on the virtual shell to manage your guests. Run
virsh # help                                                                        (to get a list of available commands).

Grouped commands:
Domain Management (help keyword 'domain'):
attach-device                                    attach device from an XML file
attach-disk                                          attach disk device
attach-interface                               attach network interface
autostart                                             autostart a domain
blkiotune                                             Get or set blkio parameters
blockpull                                              Populate a disk from its backing image.
Blockjob                                               Manage active block operations.
Console                                                connect to the guest console
cpu-baseline                                      compute baseline CPU
cpu-compare                                     compare host CPU with a CPU described by an XML file
create                                                   create a domain from an XML file
define                                                   define (but don't start) a domain from an XML file
destroy                                                destroy (stop) a domain
detach-device                                   device from an XML file
detach-disk                                        detach disk device
detach-interface                              detach network interface
domid                                                   convert a domain name or UUID to domain id
domjobabort                                     abort active domain job
domjobinfo                                        domain job information
domname                                           convert a domain id or UUID to domain name
domuuid                                              convert a domain name or id to domain UUID
domxml-from-native                     Convert native config to domain XML
domxml-to-native                           Convert domain XML to native config
dump                                                    dump the core of a domain to a file for analysis
dumpxml                                             domain information in XML
edit                                                        edit XML configuration for a domain
inject-nmi                                           Inject NMI to the guest
send-key                                             Send keycodes to the guest
managedsave                                    managed save of a domain state
managedsave-remove                  Remove managed save of a domain
maxvcpus                                            connection vcpu maximum
memtune                                            Get or set memory parameters
migrate                                                migrate domain to another host
migrate-setmaxdowntime           set maximum tolerable downtime
migrate-setspeed                            Set the maximum migration bandwidth
reboot                                                  reboot a domain
restore                                                 restore a domain from a saved state in a file
resume                                                resume a domain
save                                                       save a domain state to a file
save-image-define                          redefine the XML for a domain's saved state file
save-image-dumpxml                    saved state domain information in XML
save-image-edit                               edit XML for a domain's saved state file
schedinfo                                            show/set scheduler parameters
screenshot                                         take a screenshot of a current domain console and store it into a file
setmaxmem                                      change maximum memory limit
setmem                                               change memory allocation
setvcpus                                              change number of virtual CPUs
shutdown                                           gracefully shutdown a domain
start                                                       start a (previously defined) inactive domain
suspend                                               suspend a domain
ttyconsole                                           tty console
undefined                                           undefine an inactive domain
update-device                                  update device from an XML file
vcpucount                                           domain vcpu counts
vcpuinfo                                              detailed domain vcpu information
vcpupin                                                control or query domain vcpu affinity
version                                                 show version
vncdisplay                                           vnc display

Domain Monitoring (help keyword 'monitor'):
domblkinfo                                         domain block device size information
domblklist                                           list all domain blocks
domblkstat                                         get device block stats for a domain
domcontrol                                        domain control interface state
domifstat                                            get network interface stats for a domain
dominfo                                               domain information
dommemstat                                    get memory statistics for a domain
domstate                                            domain state
list                                                          domains

Host and Hypervisor (help keyword 'host'):
capabilities                                          capabilities
connect                                                (re)connect to hypervisor
freecell                                                 NUMA free memory
hostname                                           print the hypervisor hostname
nodecpustats                                    Prints cpu stats of the node.
nodeinfo                                             node information
nodememstats                                 Prints memory stats of the node.
qemu-attach                                      QEMU Attach
qemu-monitor-command            QEMU Monitor Command
sysinfo                                                  print the hypervisor sysinfo
uri                                                           print the hypervisor canonical URI

Interface (help keyword 'interface'):
iface-begin                                         create a snapshot of current interfaces settings, which can be
                                                                later commited (iface-commit) or restored (iface-rollback)
iface-commit                                     commit changes made since iface-begin and free restore point
iface-define                                       define (but don't start) a physical host interface from an XML file
iface-destroy                                     destroy a physical host interface (disable it / "if-down")
iface-dumpxml                                 interface information in XML
iface-edit                                             edit XML configuration for a physical host interface
iface-list                                               list physical host interfaces
iface-mac                                            convert an interface name to interface MAC address
iface-name                                         convert an interface MAC address to interface name
iface-rollback                                     rollback to previous saved configuration created via iface-begin
iface-start                                           start a physical host interface (enable it / "if-up")
iface-undefine                                  undefine a physical host interface (remove it from configuration)

Network Filter (help keyword 'filter'):
nwfilter-define                                 define or update a network filter from an XML file
nwfilter-dumpxml                           network filter information in XML
nwfilter-edit                                      edit XML configuration for a network filter
nwfilter-list                                         list network filters
nwfilter-undefine                            undefine a network filter

Networking (help keyword 'network'):
net-autostart                                     autostart a network
net-create                                          create a network from an XML file
net-define                                          define (but don't start) a network from an XML file
net-destroy                                        destroy (stop) a network
net-dumpxml                                    network information in XML
net-edit                                               edit XML configuration for a network
net-info                                               network information
net-list                                                  list networks
net-name                                            convert a network UUID to network name
net-start                                              start a (previously defined) inactive network
net-undefine                                     undefine an inactive network
net-uuid                                              convert a network name to network UUID

Node Device (help keyword 'nodedev'):
nodedev-create                               create a device defined by an XML file on the node
nodedev-destroy                            destroy (stop) a device on the node
nodedev-dettach                            dettach node device from its device driver
nodedev-dumpxml                         node device details in XML
nodedev-list                                      enumerate devices on this host
nodedev-reattach                           reattach node device to its device driver
nodedev-reset                                 reset node device

Secret (help keyword 'secret'):
secret-define                                    define or modify a secret from an XML file
secret-dumpxml                              secret attributes in XML
secret-get-value                              Output a secret value
secret-list                                            list secrets
secret-set-value                               set a secret value
secret-undefine                               undefine a secret

Snapshot (help keyword 'snapshot'):
snapshot-create                               Create a snapshot from XML
snapshot-create-as                         Create a snapshot from a set of args
snapshot-current                             Get or set the current snapshot
snapshot-delete                              Delete a domain snapshot
snapshot-dumpxml                        Dump XML for a domain snapshot
snapshot-edit                                    edit XML for a snapshot
snapshot-list                                      List snapshots for a domain
snapshot-parent                              Get the name of the parent of a snapshot
snapshot-revert                               Revert a domain to a snapshot

Storage Pool (help keyword 'pool'):
find-storage-pool-sources-as     find potential storage pool sources
find-storage-pool-sources           discover potential storage pool sources
pool-autostart                                   autostart a pool
pool-build                                           build a pool
pool-create-as                                  create a pool from a set of args
pool-create                                        create a pool from an XML file
pool-define-as                                  define a pool from a set of args
pool-define                                        define (but don't start) a pool from an XML file
pool-delete                                        delete a pool
pool-destroy                                      destroy (stop) a pool
pool-dumpxml                                  pool information in XML
pool-edit                                             edit XML configuration for a storage pool
pool-info                                             storage pool information
pool-list                                                list pools
pool-name                                          convert a pool UUID to pool name
pool-refresh                                      refresh a pool
pool-start                                            start a (previously defined) inactive pool
pool-undefine                                   undefine an inactive pool
pool-uuid                                            convert a pool name to pool UUID

Storage Volume (help keyword 'volume'):
vol-clone                                             clone a volume.
vol-create-as                                     create a volume from a set of args
vol-create                                           create a vol from an XML file
vol-create-from                                create a vol, using another volume as input
vol-delete                                           delete a vol
vol-download                                    Download a volume to a file
vol-dumpxml                                     vol information in XML
vol-info                                                storage vol information
vol-key                                                 returns the volume key for a given volume name or path
vol-list                                                   list vols
vol-name                                             returns the volume name for a given volume key or path
vol-path                                               returns the volume path for a given volume name or key
vol-pool                                               returns the storage pool for a given volume key or path
vol-upload                                          upload a file into a volume
vol-wipe                                              wipe a vol

Virsh itself (help keyword 'virsh'):
cd                                                           change the current directory
echo                                                      echo arguments
exit                                                        quit this interactive terminal
help                                                       print help
pwd                                                       print the current directory
quit                                                        quit this interactive terminal

virsh # list                                           (shows all running guests)
virsh # list --all                                  (shows all guests, running and inactive)
Id Name                 State
----------------------------------
  3 vm11                 running
  - vm10                 shut off

If you modify a guest's xml file (located in the /etc/libvirt/qemu/ directory), you must redefine the guest. Please note that whenever you modify the guest's xml file in /etc/libvirt/qemu/, you must run the define command again!
virsh # define /etc/libvirt/qemu/vm10.xml

To start a stopped guest, run:
start vm10

To stop a guest, run:
shutdown vm10

To immediately stop it (i.e., pull the power plug), run
destroy vm10

Suspend a guest:
suspend vm10

Resume a guest:
resume vm10

These are the most important commands.

To leave the virtual shell.
quit



Boot to UEFI Mode or legacy BIOS mode

Boot to UEFI Mode or legacy BIOS mode Choose UEFI or legacy BIOS modes while installing Windows. After Windows is installed, if you nee...