====== Kernel-based Virtual Machine (KVM) ======
**General Information**
KVM is "a full virtualization solution for Linux on x86 hardware containing virtualization extensions." ([[http://www.linux-kvm.org/page/Main_Page|KVM Main Page]]) It can be run on the desktop with GUI managers or on a headless server.
**Checklist**
* 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.
----
====== Installation ======
==== Install: Required Virtualization Packages (CLI) ====
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.
==== Install: Optional Virtualization Packages (GUI) ====
yum install virt-manager virt-viewer
**GUI Package Explanations**
* virt-manager => GUI VM administration tool.
* virt-viewer => GUI local console connection to VMs.
==== Install: Optional Useful Packages ====
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.
==== NetworkManager vs network ====
* 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 ====
* 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:
**/etc/sysconfig/network-scripts/ifcfg-eth0**
DEVICE="eth0"
HWADDR="00:04:4B:17:3C:FA"
ONBOOT="yes"
BRIDGE="br0"
**/etc/sysconfig/network-scripts/ifcfg-br0**
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO="dhcp"
STP="on"
DELAY="0"
br0 will be the interface with an IP address. To make it static, simply edit ifcfg-br0 and change it:
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO="none"
STP="on"
DELAY="0"
IPADDR="192.168.0.100"
NETMASK="255.255.255.0"
GATEWAY="192.168.0.1"
DNS1="208.67.222.222"
DNS2="208.67.220.220"
Note: Those DNS entries are for OpenDNS.
==== IP Forwarding ====
* 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
----
====== SELinux ======
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/
==== Changing the Default VM Image Path ====
* 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).
==== CLI: virt-install ====
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
--network bridge=br0 (Guest network interface)
Graphics
--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"
virt-manager
* Select the VM
* Click "Open"
Proceed with installation as normal.
----
==== GUI: virt-manager ====
Installing locally via a GUI.
* Open a terminal and type:
virt-manager
* 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 interfacevirsh net-list
* Turn off the interfacevirsh net-destroy default
* Disable auto start on the interfacevirsh net-autostart default –disable
* Verify State is "inactive" and Autostart is "no", then ensure virbr0 is not in the interface listvirsh net-list --all
ip addr show
* Restart the network service
* EL6service network restart
* EL7systemctl restart network
----