Wednesday, 28 July 2010

IPv6 configuration for KVM guests

It is simple and straight forward to enable IPv6 on KVM guests

Configure the host machine with IPv6 Address on the bridge interface

cat ifcfg-br0



IPV6INIT=yes
IPV6ADDR=xxxx.xx::10
IPV6_DEFAULTGW=xxxx.xx::1
IPV6_AUTOCONF=no




Configure the interface on virutal machines with ipv6 address

cat ifcfg-eth0



IPV6INIT=yes
IPV6ADDR=xxxx.xx::11
IPV6_DEFAULTGW=xxxx.xx::1
IPV6_AUTOCONF=no




Add the the necessary firewall rules to ip6tables on the host machine


-A FORWARD -m physdev --physdev-is-bridged -j ACCEPT.



./arun

Tuesday, 20 July 2010

NAT with port forwarding on Virtual Box

You can use the host-only-adapter networking, if you require the virtual machine to be accessible only from the host machine. In this case your virtual machine will not have access to anywhere outside the host. Read more about virtual box networking at http://www.virtualbox.org/manual/ch06.html


On the other hand NAT enabled interface can communicate with clients outside the host, but the host cannot access the services on the virtual machine directly. We need to enabled port forwarding with NAT interface to achieve this.


On Linux:
If you need to have ssh accessible from host machine to virtual machine,
$ VBoxManage modifyvm "VM Name" --natpf1 "openssh,tcp,127.0.0.1,2222,,22"

Where --natpf1 is for adapter1, openssh is just a anme, and you can also input the ip address of virtual machine like
$ VBoxManage modifyvm "VM Name" --natpf1 "openssh,tcp,127.0.0.1,2222,10.0.2.20,22"

(assume the virtual machine ip is 10.0.2.20)

Now you can make ssh connection from host like, $ ssh localhost -p 2222

We can use same port number for port number about 1024 , say for a service running on port 8080 we can forward it with
VBoxManage modifyvm "VM Name" --natpf1 "proxy,tcp,127.0.0.1,8080,10.0.2.20,8080"

These rules will be added to the .VirtualBox/Machines/machine_name/machine_name.xml file like:
< Forwarding name="openssh" proto="1" hostip="127.0.0.1" hostport="2222" guestip=10.0.2.20 guestport="2222"/>

You can forward connection to any port on virtual host like this.

Make sure that the virtual machine interface is closed and the vm is not running while you change it, otherwise the changes will not take effect.

On Windows:
VBoxManage setextradata "VM Name" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/Protocol" TCP
VBoxManage setextradata "VM Name" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort" 22
VBoxManage setextradata "VM Name" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/HostPort" 2222

* Replace VM Name with your virtual instance name

./arun

Convert KVM images to Virtual Box (VDI)

It took a while to get the KVM image working with Sun virtual box.


The advantages of a virtual box image is, you can run it on any platform (linux, mac or windows), works without virtualization enabled processor and will work on a 32bit machine
Here are the steps to create an image that works with virtual box:


From the KVM installed server
$ qemu-img convert kvm-os.img -O raw kvm-os-raw.img

Copy the image (kvm-os-raw.img) to virtual box machine
$ VBoxManage convertfromrow --format VDI kvm-os-raw.img vbox.vdi

Converting from raw image file="kvm-os-raw.img" to file="vbox.vdi"...
Creating dynamic image with size ....

This will create a virtual box compatible image
Incase required you can compact the image to actual size
$ VBoxManage modifyvdi /home/user/vbox.vdi compact

0%...10%...20%...30%...40%...50%...60%...70%
Here the path to vdi image must be absolute.

Now you can create a new virtual machine from virtual box console/command line, with the vdi image as storage.
Boot the machine and hope for the best :)
But it wasn't easy for me even after this beautiful vdi image, boot hangs with a kernel panic, file system not found.


To fix this issue, we need to recreate the initrd image in the virtual machine:
instructions to do it for redhat:
- Boot the virtual machine in rescue mode with Redhat CD
> linux rescue

# chroot /mnt/sysimage

take a backup of existing initrd
# cp /boot/initrd-2.6.xxx.img initrd-2.6-old

create new initrd image
# mkinitrd -v /boot/initrd-new.img kernel-version

// eg: mkinitrd -v /boot/initrd-new.img 2.6.18-194.8.1.el5

edit the grub configuration and replace the initrd image name with new one
# cat /boot/grub/menu.lst

Reboot the machine and see if it boots :)

Hope this will be helpful for someone, I spent hours to get it working :) .
./arun

Monday, 5 July 2010

Netboot KVM guest

To install the KVM guest operating system (eg: RHEL) from the network
- Create the bridge interface on the KVM host machine (http://arunnsblog.com/2010/04/09/virtualization-with-kvm-under-redhat-linux-migrate-vmware-virtual-images-to-kvm/)
- Make sure that the gateway is configured in the bridge interface (GATEWAY=).
- Make sure that you have the required rules added to the iptables:
-A FORWARD -m physdev --physdev-is-bridged -j ACCEPT
- Create virtual machine with supported network interface type (pcnet, rtl8139 used to work)
- Add the mac address of kvm guest to the dhcp server

Start the virtual machine and see if it can kick start from the network.

You can trouble shoot with a tcpdump on the KVM host machine:
tcpdump -i br0 port bootps -vvv -s 1500

./arun