Installing XenServer
First, a minimal OS with GPT (Debian or Ubuntu) is installed on the server. Afterwards you can log in and record the network configuration (/etc/ networking/interfaces). Important is, among other things, the gateway IP.
Download XenServer + unzip on a webserver
Download the XenServer ISO from here on its own, separate Web server: xenserver.org
wget http://downloadns.citrix.com.edgesuite.net/akdlm/6760/XenServer-6.0.201-install-cd.iso mount -o loop XenServer-6.0.201-install-cd.iso /mnt mkdir /var/www/xenserver cp -a /mnt/* /var/www/xenserver
Generate an answer file and copy it to /var/www/xenserver
Here is an example of an XML file that can be called xenserver.xml.
Caution: make sure to enter the correct IP address for the server and the gateway.
<installation mode="fresh" srtype="lvm"> <primary-disk gueststorage="yes">sda</primary-disk> <keymap>de</keymap> <hostname>xenserver-ex4s</hostname> <root-password>my_password</root-password> <source type ="url">http://xx.xx.xx.xx/xenserver/</source> <!-- No Post install scripts configured --> <admin-interface name="eth0" proto="static"> <ip>Hetzner Server IP</ip> <subnet-mask>255.255.255.224</subnet-mask> <gateway>Hetzner Gateway IP</gateway> </admin-interface> <nameserver>213.133.98.98</nameserver> <nameserver>213.133.99.99</nameserver> <nameserver>213.133.100.100</nameserver> <timezone>Europe/Berlin</timezone> <time-config-method>ntp</time-config-method> <ntp-servers>ntp</ntp-servers> <ntpservers>213.239.239.164</ntpservers> <ntpservers>213.239.239.165</ntpservers> <ntpservers>213.239.239.166</ntpservers> </installation>
This file should be stored in the same directory as the rest of the home directory of the XenServer CD.
Adjustments for PXE boot
On the new server: copy the following files from your own web server to the server intended for the XenServer installation:
cd /boot wget http://www.example.com/xenserver/install.img wget http://www.example.com/xenserver/boot/vmlinuz wget http://www.example.com/xenserver/boot/xen.gz
Now you need to customize the Bootloader configuration on the new server. With the minimal version of Ubuntu 12.04 GRUB2 is used. In the /boot/grub/grub.cfg file the first entry needs to be changed (see the last 3 lines):
if [ "${linux_gfx_mode}" != "text" ]; then load_video; fi menuentry 'Ubuntu, with Linux 3.2.0-24-generic' --class ubuntu --class gnu-linux --class gnu --class os { recordfail gfxmode $linux_gfx_mode insmod gzio insmod raid insmod mdraid1x insmod part_gpt insmod part_gpt insmod ext2 set root='(mduuid/xxxxxxxxxxxxx)' search --no-floppy --fs-uuid --set=root 2caba589-8a66-457a-81a2-2f43c7203736 multiboot /xen.gz dom0_mem=752M acpi=off nosmp noapic noirqbalance module /vmlinuz answerfile=http://<IP of the remote server>/xenserver/xenserver.xml install module /install.img }
Note: The URL of the answer file must be specified using the IP of the server, not the host name. Therefore, be careful when you use virtual hosts, etc.
Reboot
Restart the server via a reboot. Now the XenServer installation should start, something you can check on the external web server via “tail -f /var/log/apache2/access.log”.
If, even after a few minutes, there is no activity, the server is probably stuck in the Boot menu. In this case, simply request a KVM (LARA) and confirm the first entry with <ENTER>.
Software RAID1
After the instalaltion the XenServer should be accessible via SSH with the password entered in the answer file. XenServer 6 uses GPT instead of MBR to set up the partitions. The 3 TB drives in an EX4 etc. are thus fully used.
Setting up the second drive sdb
/dev/sda should now contain 3 partitions. To transfer the partitions evenly you can look at the partitions on /dev/sda:
sgdisk -p /dev/sda
Delete the partitions on /dev/sdb:
sgdisk --zap-all /dev/sdb
Create a new GPT table:
sgdisk --mbrtogpt --clear /dev/sdb
Add the start and end of the respective partitions with the following commands (here taken from a 3TB HDD):
sgdisk --new=1:2048:8388641 /dev/sdb sgdisk --typecode=1:fd00 /dev/sdb sgdisk --new=2:8390656:16777249 /dev/sdb sgdisk --typecode=2:fd00 /dev/sdb sgdisk --new=3:16779264:5860533134 /dev/sdb sgdisk --typecode=3:fd00 /dev/sdb sgdisk /dev/sda --attributes=1:set:2 sgdisk /dev/sdb --attributes=1:set:2 sgdisk --typecode=1:fd00 /dev/sda sgdisk --typecode=2:fd00 /dev/sda sgdisk --typecode=3:fd00 /dev/sda
Creating a RAID
The RAID1 setup by Hetzner is still partially in place. XenServer has configured 3 partitions on /dev/sda and left /dev/sdb intact, as shown by the answer file in the example. The remains of the RAID are removed:
mdadm --stop /dev/md0
Create a new RAID:
mknod /dev/md0 b 9 0 mknod /dev/md1 b 9 1 mknod /dev/md2 b 9 2 mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb1 mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sda2 /dev/sdb2 mdadm --create /dev/md2 --level=1 --raid-devices=2 missing /dev/sdb3
Optional: Creating bitmaps for each RAID device. Bitmaps have little influence on the performance but significantly reduce the time in which a failed array must be re-synchronized.
mdadm --grow /dev/md0 -b internal mdadm --grow /dev/md1 -b internal mdadm --grow /dev/md2 -b internal
Save the new RAID configuration in an updated mdadm.conf file:
mdadm --examine --scan > /etc/mdadm.conf
Copy Store Manager Data to RAID:
pvcreate -ff /dev/md2 vgextend VG_<TAB> /dev/md2 pvmove /dev/sda3 /dev/md2
Remove /dev/sda3 from the SR volume group:
vgreduce VG_<TAB> /dev/sda3 pvremove /dev/sda3
Mount /dev/md0 and copy the file system:
mkfs.ext3 /dev/md0 mount /dev/md0 /mnt cd / cp -axv . /mnt
Now the file /mnt/etc/fstab needs to be adjusted:
Note: the editor nano is not recommended, as it inserts an automatic line break with lines that are long, and this can cause the configuration file to become unreadable. This behavior can be bypassed by using “nano –nowrap”, or by simply using another editor, such as vi.
vi /mnt/etc/fstab
Replace the parameter “root=LABEL=root-xxxxxx” with “/dev/md0”
Create a new Initrd:
mkdir /mnt/root/initrd-raid mkinitrd -v --fstab=/mnt/etc/fstab /mnt/root/initrd-raid/initrd-`uname -r`-raid.img `uname -r` cd /mnt/root/initrd-raid zcat initrd-`uname -r`-raid.img | cpio -i
Edit the file “init” and add the following for “raidautorun /dev/md0”:
raidautorun /dev/md1 raidautorun /dev/md2
Copy the new ramdisk to /mnt/boot:
find . -print | cpio -o -Hnewc | gzip -c > /mnt/boot/initrd-`uname -r`-raid.img rm /mnt/boot/initrd-2.6-xen.img ln -s initrd-`uname -r`-raid.img /mnt/boot/initrd-2.6-xen.img vi /mnt/boot/extlinux.conf
Now replace “root=LABEL=root-xyz” with “root=/dev/md0” in all the menu entries.
Setup the MBR for GPT on /dev/sdb:
cat /mnt/usr/share/syslinux/gptmbr.bin > /dev/sdb cd /mnt extlinux --raid -i boot/ umount /dev/md0 sync
The RAID array is now almost complete, it is only missing /dev/sda1. Reboot into the Rescue System (activate the Rescue System in Robot, copy the password, reboot the server via a hardware reset). Run the following in the Rescue System:
mdadm -a /dev/md0 /dev/sda1 mdadm -a /dev/md2 /dev/sda3
The RAID array must now be synchronized for the first time, which can take a moment(!) (Based on this guide on a freshly installed EX4S about 6 hours). Progress can be observed as follows:
watch -n 1 cat /proc/mdstat
Embed a local ISO Library
XenServer has no possibility to offer ISO images via local storage. To enable this nonetheless, in the data area of the LVM a new LV can be created and passed through via a local NFS server. This is not optimal, but it serves its purpose. Source:http://forums.citrix.com/thread.jspa?messageID=1393861&tstart=0
Find your own VG
vgscan #Reading all physical volumes. This may take a while... #Found volume group "VG_XenStorage-709d46ed-8193-d470-4ab8-21953af4f863" using metadata type lvm2
Create a new LVM
(Example with 20 GB)
lvcreate -L 20G -n ISO VG_XenStorage-<myID> #Logical volume "ISO" created
Creating a file system
mkfs.ext3 /dev/VG_XenStorage-<myID>/ISO
Adjust /etc/exports
mkdir /ISO echo "/ISO 127.0.0.1(rw,no_root_squash,sync)" >> /etc/exports
Activate NFS and Portmap
chkconfig --level 345 nfs on chkconfig --level 345 portmap on service nfs start service portmap start
Mount at boot
Add the following to the end of the file “/etc/rc.local”:
lvchange -a y /dev/VG_XenStorage-<myID>/ISO mount /dev/VG_XenStorage-<myID>/ISO /ISO
Enter the ISO Libray in XenCenter
In XenCenter, you can now add a new storage library of the type “NFS ISO”. As a mount point “localhost:/ISO” can be specified.
Network Configuration
Configure the Host as a Router
The XenServer can be configured as a router via changes in the file “/etc/sysctl.conf” (the first few lines up to and including “net.ipv4.ip_forward = 0” must be replaced with the following):
# Kernel sysctl configuration file for Red Hat Linux # # For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and # sysctl.conf(5) for more details. # Controls IP packet forwarding net.ipv4.ip_forward = 1 net.ipv6.conf.all.forwarding=1 # Controls proxy arp net.ipv4.conf.default.proxy_arp = 0 # Turn off redirects net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.lo.send_redirects = 0 net.ipv4.conf.xenbr0.send_redirects = 0
The settings are now active after every reboot. You can also apply them without restarting directly via the sysctl -p command:
sysctl -p
IPv4
Configuration of the additional IP addresses
Each dedicated server at Hetzner comes with a single IPv4 address. However, you can order up to 3 additional single IPv4 addresses. See: IP Addresses
Configuration of a failover IP address
A failover IP address is an additional address that can be switched to any other dedicated Hetzner server.
Configuration of an additional subnet
In the standard configuration with the 3 additional IPv4 addresses you can run up to 3 virtual machines. You can also order subnets. See: IP Addresses
For an additional subnet the same applies as above. An IP address of the subnet acts as a gateway and the others can be used for guests.
To make sure the host knows that it should route packets from that subnet, we need to add the first IP address of the subnet to the xenbr0 interface (example using xx.yy.177.160/27):
ip addr add xx.yy.177.161/27 dev xenbr0
Routing to adjacent servers
If you have ordered multiple servers simultaneously and they are located in the same rack, and have consecutive IP addresses, you will find that you cannot ping or SSH into those servers. This is because, while normally all servers on the same subnet with no gateway should be reachable, at Hetzner this is disabled for security reasons. The neighboring servers are accessible only via Hetzner’s gateway. The routing configuration is as follows:
route add -net xx.yy.44.64 netmask 255.255.255.192 gw xx.yy.44.65 xenbr0
In this case xx.yy.44.65 is the IP address of the Hetzner gateway. To obtain the IP address of the entire subnet, we simply subtract 1, which gives us xx.yy.44.64.
These two commands must be run after every host reboot, otherwise the virtual machines have no connection to the internet.
Configuration example:
- The server is allocated the following IP addresses: xx.yy.44.76, xx.yy.44.105, xx.yy.44.108 and xx.yy.44.110.
- These addresses are all in the same subnet xx.yy.44.64/26.
- The gateway of this subnet is xx.yy.44.65.
- The XenServer virtual machines get the IPs xx.yy.44.105, xx.yy.44.108 and xx.yy.44.110
- The gateway is xx.yy.44.76.
- The additional ordered subnet with 32 IPs is xx.yy.177.160/27
- The first and last IP address are not usable, since they are the subnet address and the broadcast address
- The IP address xx.yy.177.161 acts as gateway, so there are 29 IP addresses available: xx.yy.177.162 – xx.yy.177.191
- The gateway for the virtual machines in this subnet is xx.yy.177.161.
The following can be entered into the file “/etc/sysconfig/networking-scripts/ifcfg-xenbr0” to make sure the entries are available even after a reboot:
up ip addr add xx.yy.177.161/27 dev xenbr0 down ip addr del xx.yy.177.161/27 dev xenbr0 up route add -net xx.yy.44.64 netmask 255.255.255.192 gw xx.yy.44.65 xenbr0 down route del -net xx.yy.44.64 netmask 255.255.255.192 gw xx.yy.44.65 xenbr0
IPv6
All servers come with a /64 IPv6 subnet. For clients who received their servers before February 2013 this subnet can be ordered (freely) via Robot, and will be automatically activated.
An example subnet would be 2a01:4f8:xxx:xxxx::/64
In this example the XenServer would get the IP 2a01:4f8:161:xxxx::2/112.
Since XenServer does not support IPv6 configurations via the management interface in the xconsole, you will need to use a small script. This is located in “/etc/init.d” and is called “network6”. The script looks like this:
#!/bin/bash # # network6 This starts and stops ipv6 on xenbr0 # # chkconfig: 2345 15 85 # description: ipv6 configuration # source: http://www.wirrewelt.de/entry/ipv6-mit-xenserver-5-5-bei-hetzner # Copyright 2010 Sascha Huck # ### BEGIN INIT INFO # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 ### END INIT INFO # Source function library. . /etc/rc.d/init.d/functions # Von Hetzner zugewiesenes Gateway IPV6GATEWAY=fe80::1 # Eigene Adresse und eigenes Subnetz IPV6HOSTADDR=2a01:4f8:161:xxxx::2/112 IPV6HOSTSUBNET=2a01:4f8:161:xxxx::0/112 usage () { echo "Usage: service $prog {start|stop}" RETVAL=1 } start () { # Insert kernel modules modprobe esp6 # Configure our ip address ip -6 addr add $IPV6HOSTADDR dev xenbr0 # Configure routing to hetzner gateway ip -6 route add $IPV6GATEWAY dev eth0 ip -6 route add $IPV6GATEWAY dev xenbr0 ip -6 route add default via $IPV6GATEWAY # Enable ipv6 forwarding (don't work in /etc/sysctl.conf) sysctl -w net.ipv6.conf.all.forwarding=1 } stop () { } case "$1" in start) start; RETVAL=$? ;; stop) stop; RETVAL=$? ;; *) usage ; RETVAL=2 ;; esac exit $RETVAL ########
NOTE: various entries need to be adjusted according to the configuration you have. Make sure to appropriately edit the script before using it. With
chmod a+x
the script is made executable and with
chkconfig network6 on
it is added to the boot process.
Loading the kernel module esp6 is a workaround for XenServer, since “modprobe ipv6” is acknowledged with “Module no not found”, while “modprobe esp6” loads the IPv6 module.
In the VMs (if they run on Linux) you can add the following settings:
ip addr add 2a01:4f8:161:xxx::y/64 dev eth0 ip route add default via 2a01:4f8:161:xxx::2
Change the driver for the network card (optional)
The default driver in XenServer that gets loaded for the Realtek network card (r8169) produces packet loss under some circumstances. Therefore, it can be replaced with a different driver: r8168. To compile the driver the appropriate Driver Development Kit (DDK) is required, which can be downloaded from the Citrix website:http://support.citrix.com/article/CTX138885 (for XenServer 6.2.0 with Hotfix XS62E004)
Assumed is that the ISO file has already been copied to /ISO. Firstly the VM Storage should be marked as the default via XenCenter (right click -> Default Storage) as otherwise the xe vm-import command doesn’t work.
Mount the ISO:
mkdir /mnt/iso mount -o loop /local/iso/XenServer-6.2.0-XS62E004-ddk.iso /mnt/iso
Import DDK VM:
xe vm-import filename=/mnt/iso/ddk/ova.xml
In XenCenter a network device needs to be added to the virtual machine. After that the machine can be restarted and a root password can be set with which you can log in.
Now we can add the correct network settings for the VM in the following files: “/etc/sysconfig/network-scripts/ifcfg-eth0”
DEVICE=eth0 BOOTPROTO=static IPADDR=<IP address of the VM> NETMASK=255.255.255.224 ONBOOT=yes TYPE=ethernet
“/etc/sysconfig/network-scripts/route-eth0”
IP-ADRESSE-DER_VM dev eth0 scope link default via IP-DES-XENSERVERS-BZW-BEI-IP-NETZ-DIE-DES-xenbr0:1
“/etc/resolv.conf”
nameserver 213.133.99.99 nameserver 213.133.100.100
Now grab the driver, unzip it and compile it:
cd /root wget http://r8168.googlecode.com/files/r8168-8.037.00.tar.bz2 tar xjf r8168-8.037.00.tar.bz2 cd r8168-8.037.00 make all
The new driver (src/r8168.ko) needs to be transferred to the host system: “/lib/modules/<newest kernel version>/kernel/drivers/net/”
Give the new driver the proper permissions:
chmod 0744 /lib/modules/<newest kernel version>/kernel/drivers/net/r8168.ko
Now add the new driver to the “/etc/modprobe.conf” file:
echo "alias eth0 r8168" > /etc/modprobe.conf
The compiled driver must now be activated. Since the server will not be reachable via the network during this time (a few seconds) the necessary instructions will all be added to a single command:
rmmod r8169 && depmod -a && modprobe r8168 && service network restart && service ipaliases restart
After a few seconds the server should be reachable via the network again with the new driver.
lspci -nnk | grep -i net -A2
The last line should read: “Kernel driver in use: r8168”
Transferring virtual machines from another (older) Xenserver
XenServer is fortunately quite flexible in terms of transferring other virtual machines on a XenServer host. There are many ways to do this, one of which is to remotely mount a directory (as NFS) of the new XenServer host from the old XenServer host. In this directory a VM is exported to the other host (via “xe vm-export uuid=xxx-xxx filename=vm1.xva”) and then imported on the new host (“xe vm-import filename=vm1.xva”).