Источник тут: http://www.keepingkidsonshred.com/2011/05/ubuntu-1104-on-citrix-xenserver-55-part.html

1. Сначала надо создать темплейт.

# DebianTemplate=`xe template-list name-label="Debian Squeeze 6.0 (64-bit) (experimental)" params=uuid --minimal`
# echo $DebianTemplate

Мы получили UUID темплейта Debian 6.0

Клонируем его и задаем параметры нового темплейта:

# xe vm-clone uuid=$DebianTemplate new-name-label="Ubuntu 12.04 (64-bit)"
# UID=`xe template-list name-label="Ubuntu 12.04 (64-bit)" params=uuid --minimal`
# xe template-param-set uuid=$UID \
    other-config:install-methods=http,ftp \
    other-config:debian-release=precise \
    other-config:default_template=true

Для будущих версий Ubuntu актуально будет изменение параметра other-config:debian-release=precise. Тут указывается имя дистриба. Для Ubuntu 12.04 это precise.

2. Потом делаем из этого нового темплейта виртуальную машину.
Перед установкой убеждаемся, что хост XenServer имеет доступ в интернет.
При установке указываем источник установки - http://archive.ubuntu.com/ubuntu/

При разбиении диска для загрузочного раздела обязательно нужно указать файловую систему ext2 или ext3. ^Ext4 не поддерживается!!!^
Я не использовал LVM, но он должен работать.

После установки можно перезагрузиться и увидеть в логах XenServer 5.5 сообщение типа такого:

RuntimeError: Unable to find partition containing kernel

Такое происходит потому, что XenServer не поддерживает GRUB2.

3. Для исправления этого недостатка нужно скорректировать параметры загрузки.
В консоли XenServer выполняем:

xe-edit-bootloader -n -Disk-Label- -p 1 -f /boot/grub/grub.cfg

Тут -Disk-Label- - это метка диска, которая обычно соответствует имени виртуальной машины.

В открывшемся файле находим кусочек, который собствено загружает Ubuntu:

linux /vmlinuz-2.6.38-8-generic root=UUID=5f05322a-a159-4604-9da9-905b0506d882 ro console=hvc0 quiet vt.handoff=7
initrd /initrd.img-2.6.38-8-generic

Надо сохранить этот куда-нибудь в текстовый файлик, или оставить открытым файл в консоли. Оно нам понадобится.

4. Затем выясним uuid виртуальной машины:

# VMUUID=`xe vm-list name-label="[VM name]" params=uuid --minimal`
# echo $VMUUID

Тут VM name это имя нашей виртуальной машины.
В переменную VMUUID мы поместили uuid

5. Приступаем собственно к корректировке параметров виртуальной машины:

# xe vm-param-clear uuid=$VMUUID param-name=HVM-boot-policy
# xe vm-param-set uuid=$VMUUID PV-bootloader=pygrub
# xe vm-param-set uuid=$VMUUID PV-args="root=UUID=5f05322a-a159-4604-9da9-905b0506d882 ro console=hvc0  splash quiet vt.handoff=7"
# xe vm-param-set uuid=$VMUUID PV-bootloader-args="--kernel=/vmlinuz-2.6.38-8-generic --ramdisk=/initrd.img-2.6.38-8-generic"

В последних двух командах указываем значения root=UUID, kernel и ramdisk из /boot/grub/grub.cfg виртуальной машины, полученные на этапе 3.

6. Теперь надо сделать диск виртуальной машины загрузочным.
Получаем uuid диска (VBD):

# VBDUUID=`xe vm-disk-list uuid=$VMUUID | grep -A1 VBD | tail -n 1 | cut -d: -f2 | awk '{print $1}'`
# echo $VBDUUID

Делаем его загрузочным:

# xe vbd-param-set uuid=$VBDUUID bootable=true

Все. Теперь виртуальная машина должна грузиться.