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