KVM (for Kernel-based Virtual Machine) is a full virtualization solution for Linux on x86 hardware containing virtualization extensions (Intel VT or AMD-V). It consists of a loadable kernel module, kvm.ko, that provides the core virtualization infrastructure and a processor specific module, kvm-intel.ko or kvm-amd.ko. KVM also requires a modified QEMU although work is underway to get the required changes upstream.
Using KVM, one can run multiple virtual machines running unmodified Linux or Windows images. Each virtual machine has private virtualized hardware: a network card, disk, graphics adapter, etc.
The kernel component of KVM is included in mainline Linux as of 2.6.20.
The system image for the virtual machine should be on local disk space. Putting a running virtual machine on networked file space will result in poor performance for both the virtual machine, as well as other users of the filespace.
In order to start using KVM on your machine, UMIACS Staff will first need to install the requisite packages and set a baseline configuration. Please contact staff along with a brief explanation of your goals for running a local virtual machine. Note: Ubuntu requires you to be in the kvm group on the local host.
Once staff has installed the required packages you can then use the program 'virt-manager' to initialize and manager your virtual machines.
- In a terminal run:
virt-manager -c qemu:///session
- This will bring up a graphical interface which can be used to manage various aspects of your virtual machines. The network that is available is called usermode networking which provides a NAT connection to the outside world. See below about forwarding ports using qemu-kvm.
Creating a virtual machine
Initializing the machine
In virt-manager, highlight 'localhost' and then click the 'New' button. This will bring up a new window that will guide you through configuring your virtual machine. For the most part, you should stick with the default options.
This functionality is only available by editing the XML file for your domain directly. Libvirt has the capability to pass arguments directly to the qemu binary. First create your VM with virt-manager and then shut it down. Run in a shell
virsh -c qemu:///session which will drop you into the virsh shell. You can list your VMs both running and off by typing
list --all. Find the name of the VM and type
edit NAME where NAME is the name of the VM.
You need to replace the
<domain> tag in the first line to:
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
Then you need to insert the following lines directly above the last line which should have the
</domain> tag. In this case the port 2222 will be forwarded to the port 22. You may specify multiple ports here but each needs its own
-redir line and the port specifications.
<qemu:commandline> <qemu:arg value='-redir'/> <qemu:arg value='tcp:2222::22'/> </qemu:commandline>
Here is an example forwarding 3389 to 3389 (RDP) when running Windows (you may need to activate RDP within your Windows VM).
<qemu:commandline> <qemu:arg value='-redir'/> <qemu:arg value='tcp:3389::3389'/> </qemu:commandline>
You can start a windows install with
virt-install in a rather automated fashion. Here is an example using a Windows 10 x64 ISO with 40G disk and 16GB of RAM. Please note that this should spawn virt-viewer automatically and show you the Windows installer screen.
virt-install --connect qemu:///session --name=win10 --os-type=windows --network user --disk path=/scratch0/username/win10.img,size=40 --cdrom=/scratch0/username/Win10x64.iso --graphics spice --ram=16384