= Initial Setup = Reboot into Hetzner's Rescue System. I was going to use Debian's AMD64 (which is not related to AMD processors!) Anyways - 32bit Etch. Configure for raid1, /boot for ext2 and / for dom0-root. PART 1 /boot ext2 256M PART 2 lvm vg0 all LV vg0 root / ext3 30G
Note: grub is required for Xen. Lilo will not work for Xen.
= Reboot into new Install = We need to add in a swap space using a neat lv (as opposed to a physical partition via the hetzner installer)
lvcreate -n dom0-swap –size 256M vg0 mkswap /dev/vg0/dom0-swap vi /etc/fstab #Add in the following: /dev/vg0/dom0-swap none swap sw 0 0
swapon /dev/vg0/dom0-swap
= Install Xen =
Check apt's source.list: vi /etc/apt/sources.list deb http://ftp.de.debian.org/debian/ stable main deb-src http://ftp.de.debian.org/debian/ stable main
deb http://security.debian.org/ stable/updates main #The above is a minimal config for a server located in Germany.
Note: AMD64 has nothing to do with AMD processors!! Its the name for the 64bit OS.
apt-get install linux-image-2.6.18-6-xen-amd64 xen-hypervisor-3.0.3-1-amd64 xen-tools bridge-utils sysfsutils #note libc6-xen is not required for AMD64. Note: Etch AMD64 is not just for AMD Processors! It is the name for the 64bit OS and works for Intel as well.
apt-get install linux-image-2.6-xen-686 xen-hypervisor-3.0.3-1-i386-pae xen-tools bridge-utils libc6-xen sysfsutils
Check the grub boot: vi /boot/grub/menu.lst #the xen kernel should have been inserted first.
This step is optional. If you only want to assign dom0 only 128MB of memory as opposed to allowing it to balloon out and use all memory (until a domU is created which would take the memory from dom0), you can do the following: vi /boot/grub/menu.lst #check the xen grub entry and add in the dom0_mem on the end of the kernel line: title Xen 3.0.3-1-i386-pae / Debian GNU/Linux, kernel 2.6.18-6-xen-686 root (hd0,0) kernel /xen-3.0.3-1-i386-pae.gz dom0_mem=128000 module /vmlinuz-2.6.18-6-xen-686 root=/dev/mapper/vg0-dom0–root ro console=tty0 module /initrd.img-2.6.18-6-xen-686 savedefault
The previous step works ok. However after an apt-get upgrade for a new kernel etc. it will disappear. To have the dom0_mem always added to the grub config: vi /boot/grub/menu.lst #look for the following line: # xenhopt= change it to: # xenhopt=dom0_mem=128000 (Leave the # there.)
update-grub #update-grub scans for installed kernels and creates a new menu.lst Thanks to: http://cmrg.fifthhorseman.net/wiki/xen
dom0_mem=128000 is needed to dedicate memory to dom0. Otherwise the following errors may be seen in /var/log/kern.log. This is with Debian Etch. It has also been seen that this squeeze error can appear after a few weeks of dom0 uptime. I highly recommend using this kernel option.
Nov 25 17:21:39 flexo kernel: printk: 4 messages suppressed. Nov 25 17:21:39 flexo kernel: xen_net: Memory squeeze in netback driver. Nov 25 17:21:44 flexo kernel: printk: 4 messages suppressed. Nov 25 17:21:44 flexo kernel: xen_net: Memory squeeze in netback driver.
The network setup will be outlined and described later. Until then this section may be confusing to some. vi /etc/xen/xend-config.sxp #comment out the network-dummy etc. and have the following: (network-script myscript) (vif-script vif-route)
vi /etc/xen/scripts/myscript #!/bin/sh dir=$(dirname “$0”) “$dir/network-nat2” start “$dir/network-route” start chmod 755 /etc/xen/scripts/myscript
cp /etc/xen/scripts/network-nat /etc/xen/scripts/network-nat2 vi /etc/xen/scripts/network-nat2 #op_start() { # echo 1 >/proc/sys/net/ipv4/ip_forward # iptables -t nat -A POSTROUTING -o ${netdev} -j MASQUERADE # "$dhcp" != 'no' && dhcp_start #} op_start() {
echo 1 >/proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o ${netdev} -s 10.0.0.0/24 -j MASQUERADE iptables -t nat -A POSTROUTING -o ${netdev} -s 192.168.1.0/24 -j MASQUERADE [[|"$dhcp" != 'no' ]] && dhcp_start
} #I realise that I technically should do the same above for the op_stop function.
chmod 755 /etc/xen/scripts/network-nat2
vi /etc/network/interfaces #add the following for the public ip address range auto dummy0
iface dummy0 inet static address 78.1.1.20 netmask 255.255.255.248 broadcast 78.1.1.27
#This gives the first routable Public IP to dom0 so it can act as a gateway for the domU's. #Note the above is the quick and simple way to get networking on Xen. There is a pointopoint method allowing the use of all the public ips.
uname -a Linux root2 2.6.18-6-xen-amd64 #1 SMP Fri Jun 6 06:38:05 UTC 2008 x86_64 GNU/Linux
xm list xm top free ifconfig iptables -t nat -L ping 78.1.1.20
= Setup and Config of Xen-Tools = vi /etc/xen-tools/xen-tools.conf #below are the lines only which are uncommented: lvm = vg0 debootstrap = 1 size = 4Gb # Disk image size. memory = 128Mb # Memory size swap = 128Mb # Swap size fs = ext3 # use the EXT3 filesystem for the disk image. dist = etch # Default distribution to install. image = sparse # Specify sparse vs. full disk images. #The network will be done manually later via xm console kernel = /boot/vmlinuz-2.6.18-6-xen-amd64 initrd = /boot/initrd.img-2.6.18-6-xen-amd64 mirror = http://ftp.de.debian.org/debian/
= Automatically create a domU using Xen-Tools = xen-create-image –hostname vm01-burkesys –ip 78.1.1.21 lvscan # to see if a disk and swap lvm were created vi /etc/xen/vm01-burkesys.cfg #Make sure all is in order xm create vm01-burkesys.cfg -c #log in as root with no password passwd #change the root password vi /etc/network/interfaces gateway 78.1.1.20 netmask 255.255.255.0 ifup eth0 ping www.debian.org apt-get update apt-get upgrade
All that changes, is that the –ip is given a 10.0.0.0 range. The config for this is done previously in the Xen Network Settings. xen-create-image –hostname vm02-priv-burke –ip 10.0.0.1 xm create vm02-priv-burke -c #login as root with no password passwd vi /etc/network/interfaces gateway 10.0.0.1 netmask 255.255.255.0 ifup eth0 ping www.debian.org #Enjoy NAT'ed traffic out.
= Migrate a domU from one Server to another =
lvcreate -n vm03-twister-disk –size 3g vg0 lvcreate -n vm03-twister-swap –size 256m vg0 mkfs.ext3 /dev/vg0/vm03-twister-disk mkswap /dev/vg0/vm03-twister-swap nc -l -p 7000 | gzip -dfc | dd of=/dev/vg0/vm03-twister-disk #if you want it faster and dont mind about bandwidth: #nc -l -p 7000 | dd of=/dev/vg0/vm03-twister-disk
dd if=/dev/main-vol2/twister | gzip -cf | nc newserver.ip.address 7000 -q 10 #if you want it faster and dont mind about bandwidth: #dd if=/dev/main-vol2/twister | nc newserver.ip.address 7000 -q 10 scp /etc/xen/twister root@newserver:/etc/xen/
Thats it. Simply do a xm create on the new Xen server for the VM. Note: if the new Xen Server has a different kernel, then there may be issues. If the kernel of the VM is different on the new Server, then the /lib/modules/2.6.kernel will have to be copied onto the VM. Note: Make sure that the twister VM xen config is correct.
In this particular case, a 2GB File based image is been copied (using dd) to a 3GB LVM Partition on a New Server. If it was only a 2GB LVM Partition, there would be nothing extra required. If the LVM partition was too small, the “dd” command would fail once the LVM filled up.
lvcreate -n vm04-volcano-disk –size 3g vg0 lvcreate -n vm04-volcano-swap –size 256m vg0 mkfs.ext3 /dev/vg0/vm04-volcano-disk mkswap /dev/vg0/vm04-volcano-swap nc -l -p 7000 | gzip -dfc | dd of=/dev/vg0/vm04-volcano-disk
dd if=/xens/volcano/centos.5-0.img | gzip -cf | nc newserver.ip.address 7000 -q 10 #Extra steps required because the 3GB LVM is larger than the 2GB file: e2fsck -f /dev/vg0/vm04-volcano-disk resize2fs /dev/vg0/vm04-volcano-disk
With LVM, it is possible to take snapshots of a LV (Logical Volume) which is Live, i.e. currently in use. This is extremely useful for taking backups of a live system without having any downtime. It can also be used for a barebones recovery as we are going to copy/dd all of the LV.
lvcreate -n vm05-zachome-disk –size 90g vg0 lvcreate -n vm05-zachome-swap –size 1g vg0 mkfs.ext3 /dev/vg0/vm05-zachome-disk mkswap /dev/vg0/vm05-zachome-swap nc -l -p 7000 | gzip -dfc | dd of=/dev/vg0/vm05-zachome-disk
lvcreate -L 1G -s -n zachomebackup /dev/main-vol2/zachome lvscan dd if=/dev/main-vol2/zachomebackup | gzip -cf | nc root2.burkesys.com 7000 -q 10
Note: I hope to write a full article on LVM, how it can be used for creating snapshots etc. etc.
= Remove VMs from dom0 =
Typically when xen-create-image is used to create a Xen VM, it creates the LVM partitions etc. and also a key config file: /etc/xen/nameofvm.cfg Its by the file extension .cfg that it will use to produce a list when xen-list-images is called. #xen-list-images #^ by default lists vms which were created with xen-tools xen-delete-image nameofvm
#if however you created the lvm and xen config manaully, you can do the following to add a .cfg extension so xen-tools will recoginise it. mv /etc/xen/nameofvm02 /etc/xen/nameofvm02.cfg xen-list-images xen-delete-image nameofvm02.cfg So xen-list-images parses all .cfg files in /etc/xen/. Whats nice is that when xen-delete-image is called, it also parses .cfg files in /etc/xen/ picks up the name of the lvm's they are using and removes them cleanly. It just saves from having to do a manual lvmremove for vms created manually.