We moved this page to our Documentation Portal. You can find the latest updates here. |
Question
How can I migrate virtual server from Citrix XenServer to OnApp Cloud?
Answer
Migrating from XenServer
Prepare for .xva Export
To prepare for .xva export:
- Create a temporary Logical Volume called export001:
#> vgdisplay | grep "VG Name" | awk '{print $3}' | xargs -i lvcreate {} -L200G -n export001
- Format the Logical Volume ext3:
#> mke2fs -j /dev/mapper/[VolGrp]-export001
- Create a directory for mount:
#> mkdir /tmp/export
- Mount the Logical Volume:
#> mount /dev/mapper/[VolGrp]-export001 /tmp/export
Export and Transfer vda File
- Export the vda file:
#> cd /tmp/export
bash#> xe vm-export vm=[UUID] filename=vm1.xva - Transfer the file over to our temporary server:
#> scp vm1.xva root@[TEMP_SERVER_IP]:/tmp/
Prepare Temporary Server
- Download and install cmake:
#> yum install gcc gcc-c++ openssl-devel
#> wget http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz
#> tar xzvf cmake-2.8.4.tar.gz
#> cd cmake-2.8.4
#> ./configure
#> gmake
#> make install - Download and install xvatool:
#> wget http://datahack.se/datastore/xvatool/xvatool-1.1.tar.gz
#> tar xzvf xvatool-1.1.tar.gz
#> cd xvatool-1.1
#> cmake
#> make install
Convert the .xva File
To convert the .xva file:
- Convert the xva to img:
#> cd /tmp
#> mkdir VM1
#> tar -xf vm1.xva -C VM1
#> chmod -R 755 VM1xvatool -p disk-export VM1/Ref\:X/ disk.raw -
Identify the partitions and mount them up as necessary.
Every server will most likely contain different partitions and different partition types, so…
-
You can identify what physical partitions the server has by running the following command:
#> kpartx -a -v disk.raw
From here you will need to mount up each partition individually until you find the / partition. Once you have found this, you will be able to cat the fstab and see the partition layout. If possible it would be easier to view this on the running XenServer VM.
-
Any partition that you are unable to mount as a loop device will most likely be a partition containing LVM data, so you will need to do the following to identify these:
#> vgscan
#> lvscan -
Now you can mount up the server ready for OnApp export. In the example below we have a fairly simple CentOS x64 installation using LVM with a raw ext3 boot partition. Here's a copy of the original fstab for your reference:
[root@test ~]# cat /etc/fstab
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
-
Now I have this information I can mount up the server locally:
#> mkdir /tmp/mnt
#> lvchange -ay VolGroup00/LogVol00
#> mount /dev/mapper/VolGroup00-LogVol00 /tmp/mnt/ -
As my /boot partition is a raw ext3 partition I can just mount it as a loop device:
#> mount -o loop /dev/mapper/loop1p1 /tmp/mnt/boot/
We are ignoring the swap partition here. It will be added later when the VM is imported into OnApp.
-
Now I can see my complete VM mounted up on my temporary server:
[root@tmpserver1 mnt]# ls -al
total 186
drwxr-xr-x 23 root root 4096 Jul 5 14:07 .
drwxrwxrwt 5 root root 4096 Jul 5 14:14 ..
drwxr-xr-x 2 root root 4096 Jun 15 16:55 bin
drwxr-xr-x 4 root root 1024 Jun 15 15:47 boot
drwxr-xr-x 4 root root 4096 Jul 5 13:29 dev
drwxr-xr-x 75 root root 4096 Jul 5 13:42 etc
drwxr-xr-x 2 root root 4096 Mar 11 2009 home
drwxr-xr-x 11 root root 4096 Jun 15 16:55 lib
drwxr-xr-x 7 root root 4096 Jun 15 16:55 lib64
drwx------ 2 root root 16384 Jun 15 15:44 lost+found
drwxr-xr-x 2 root root 4096 Mar 11 2009 media
drwxr-xr-x 2 root root 4096 Sep 4 2009 misc
drwxr-xr-x 2 root root 4096 Mar 11 2009 mnt
drwxr-xr-x 2 root root 4096 Mar 11 2009 opt
dr-xr-xr-x 122 root root 0 Jul 4 12:13 proc
rwxr-xr-x 2 root root 12288 Jun 15 16:55 poweroff
drwxr-x--- 2 root root 4096 Jun 29 11:50 root
drwxr-xr-x 2 root root 12288 Jun 15 16:55 sbin
drwxr-xr-x 2 root root 4096 Jun 15 15:44 selinux
drwxr-xr-x 2 root root 4096 Mar 11 2009 srv
drwxr-xr-x 2 root root 4096 Jun 15 15:44 sys
drwxrwxrwt 3 root root 4096 Jun 29 11:51 tmp
drwxr-xr-x 14 root root 4096 Jun 15 15:46 usr
drwxr-xr-x 19 root root 4096 Jun 15 15:46 var
Import to OnApp Cloud
Make Changes for the OnApp Cloud Import
To prepare for the OnApp Cloud Import:
-
Chroot the mounted image and make the following changes:
#> cd /tmp/mnt
#> chroot .
#> rm poweroff
#> rpm -e xe-guest-utilities
#> rpm -e xe-guest-utilities-xenstore
#> chkconfig --del kudzu -
Update fstab with the following data:
/dev/sda1 / ext3 defaults 1 1/dev/sda2 swap swap defaults 0 0
-
Update /boot/grub/grub.conf and alter a few things:
kernel /boot/vmlinuz-[kernel-version.[distro]xen ro root=/dev/sda1 console=tty0
Make sure the location of the initrd and the kernel are correct. Make sure /dev/sda1 is set to root. Make sure console is set to tty0.
- Update the following in /etc/inittab:
The first console should be configured to run on tty in all runlevels. In most cases this line (1:2345:respawn:/sbin/mingetty tty1) should be the only line not commented out. You will most likely need to comment out the Xen-specific line. -
Exit chroot environment before you continue:
#> exit
-
Create the OnApp package:
#> cd /tmp/mnt
#> tar -czvf /root/ExampleOnAppExport.tar.gz
Import the OnApp Cloud Image
To import the OnApp Cloud image:
- SSH into the OnApp CP server.
-
Transfer over the template to the OnApp template store (On the OnApp CP server):
#> scp root@[TEMP_SERVER_IP]:/root/ExampleOnAppExport.tar.gz /onapp/templates/
Insert Template in the Database and Finish up
To insert template in the database:
-
Add the mysql entry into OnApp:
#> grep password /onapp/interface/config/database.yml #> mysql -u root -p[password] onapp
-
For CentOSdistros:
INSERT INTO templates
VALUES(
'19', # Template ID, increment by 1 each time or just leave as '' for auto-increment
'my_new_template_name', # An alias name for you new template
'2010-12-01 22:20:25', # Template create date/time
'1.0', # Version, update as necessary
'[you_new_template_name].tar.gz', # File name (the gzip you created above
'linux', # The OS, should always be linux or windows ?
'ubuntu', # The distro, ubuntu for ubuntu and debian, rhel for centos
'1', # allow swap, always 1 for linux
'active', # stats, always active
'', # checksum, run mdksum [you_new_template_name].tar.gz
'1', #allow resize without reboot, 1 for centos, 0 for ubuntu
'10', # minimum disk space, check the size of your volume before tarballing it.
NULL, # userid, leave as null unless you know it
NULL # template size, leave as null
);
-
Here is our example from earlier:
INSERT INTO templates VALUES ('','onapp-test001','2011-07-05 12:58:55','2011-07-05 12:59:05','1.0','v5zarb85et9box_20110705135855','linux','rhel',1,'active','4c46ba5f7af2eb6a472800f534cb3d8a',1,8,2,316976,1,'x64',NULL,NULL,1,NULL);
-
The final step is now to create the VM via either the OnApp Control Panel UI or the OnApp API using the template created above.
You will also need to clean up, remove the template file and database entry, and remove the LogVol from the Citrix installation using lvremove.