This is a very short quick setup on how to get KVM server up and running. It assumes that
- you want to run a KVM server with at least one virtual machine,
- your KVM server gets an ip address in your network,
- your virtual machine(s) get an ip address from your network – so you can use bridging instead of natting (using NATting instead of bridging is an easy task but not part of this howto),
- you can use lvm for disk space allocation on your KVM master (using other disk space allications methods like image files is easy, too, but not part of this howto)
Get the server running
Get the network up and running
$ sudo apt-get install bridge-utils
$ sudo brctl addbr br0
# The loopback network interface auto lo iface lo inet loopback auto eth0 iface eth0 inet manual auto br0 iface br0 inet static address 192.168.1.100 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 bridge_ports eth0 bridge_fd 9 bridge_hello 2 bridge_maxage 12 bridge_stp off
Please make sure you don’t forget setting your “eth0″ to “iface eth0 inet manual” as shown above. This is needed as you want to prevent eth0 to fetch an address via dhcp but still want it to be there for your bridge as it is the physical layer. After you setup the bridge either restart your network (sudo /etc/init.d/networking restart) or reboot your server. If you are accessing your server already by ssh be warned that a misconfiguration might lock you out.
$ sudo apt-get install qemu-kvm ubuntu-vm-builder uml-utilities \ virtinst
That’s all: You already have a kvm server now. Time to…
Install your first virtual machine
We are going to setup a 100Gb logical volume for the guest, download Ubuntu and create a machine with 2Gb of Ram and 4 cores:
# create an empty 100Gb logical volume sudo lvcreate --size 100G vg0 --name guest1 # download Ubuntu iso $ wget http://..../ # create machine $ sudo virt-install --connect qemu:///system -n guest1 -r 2048 \ --vcpus=4 -f /dev/mapper/guest1 --network=bridge:br0 \ --vnc --accelerate -v -c ./SOMEUBUNTUISO.iso \ --os-type=linux --os-variant=ubuntuKarmic --noautoconsole # please note: "ubuntuKarmic" is currently the most recent # virt-install defaults scheme - just use this if in doubt.
Get a VNC connection
KVM uses VNC to give you ca graphical interface to your machine. The good thing about this is, that it enables you to use graphical installers (and yes, even Windows) without problems. As even Ubuntu server boots into a graphical mode in the beginning – it’s great to use VNC here.
I assume you are working on a remote server. KVM gives every guest it launches a new vnc instance with a new, incremented port. It starts with 5900. So let’s tunnel via ssh:
ssh user@remotekvmhost -L 5900:localhost:5900
You connect to your remote kvm host via ssh and open a ssh tunnel fort port 5900. Now start your prefered VNC client locally and let it connect to either display “0″ or port 5900 which means the same in VNC (duh…).
From now on you should see your server on a VNC display. Install it like you’d install every other server. The networking is bridged, so you could even use dhcp if that is offered in your network.
Please make sure, you install the package “acpi” inside your kvm guest, otherwise you won’t be able to stop the guest from the master (as it is done via acpi):
# make sure, "acpi" is installed in the *guest* machine sudo apt-get install acpi
After installation you can manage your kvm gues by using the following commands:
# list running instances $ virsh list # start an instance $ virsh start INSTANCENAME # stop an instance politely $ virsh stop INSTANCE # immediatly destroy a running instance $ virsh destroy INSTANCE # edit the config file for an instance $ virsh edit INSTANCE
Mounting the LVM volumes
As you might have noticed, your virtual guest’s lvm volumes cannot be mounted directly in the master as they contain their own partition table. If you need access to the guest’s filesystem from the master, though, you have to create some device nodes. There is a great tool called “kpartx” than can create and delete device nodes for you. It’s as easy as this:
# install kpartx $ sudo install kpartx # make sure, virtual gues is switched off! # create device nodes $ sudo kpartx -a /dev/mapper/guest1 # check /dev/mapper for new device nodes and mount/unmount them # after you are done, delete the nodes $ sudo kpartx -d /dev/mapper/guest1
Please note, this methods also works with other block devices like image files containing partition tables. You only might run into trouble, when your lvm volume contains it’s own lvm. If that is the case, play around with pvscan, vgscan and lvscan after using kpartx. Be brave but be warned that backing up data is always a great idea.
Alternative Management Interfaces
In case you really need a gui for your management needs, check “virt-manager”. You can install this on your desktop and remotely manage running instances:
$ sudo install virt-manager
You should check RedHat’s “Virtual Machine Manager” page, though. It might be a good idea to manually compile and install a more recent version and rely on the setup howtos. Personally I prefer using plain text console here, as it helps being able to act quite fast and from everywhere when problems occur.
Nowadays it’s fairly easy setting up a KVM server. As KVM/libvirt enabled guests are quite fast, it’s a nice and easy way for even hosting virtual machines. I run about a dozen virtual machines and three hardware servers for two years now without any serious problems.