Just to close the loop on this: an answer to Lingfeng's question was provided in a thread on the xen-api mailing list. Here is James Bulpin's answer:
One way would be to, for each VM:
Convert each qcow2 file to a raw file using qcow2raw ' put these files somewhere (e.g. a NFS export) where you can temporarily reach them from XCP's domain0
Using XCP 'install' a VM using the most suitable template but not actually starting the VM or going through the install. Make sure to choose virtual disk sizes at least as big as the virtual size of the original qcow2 ones. Set virtual NIC MAC addresses to match your xl VM. 'For PV you'll need to trick XCP into thinking you've completed the install by
a. changing PV-bootloader to pygrub (xe vm-param-set uuid= PV-bootloader=pygrub)
b. making the first VBD bootable (xe vbd-param-set uuid=$(xe vbd-list vm-uuid= userdevice=0 --minimal) bootable=true)
c. making the virtual CD drive (if present) not bootable: (xe vbd-param-set uuid=$(xe vbd-list vm-uuid= type=CD --minimal) bootable=false)
One by one attach the VM's virtual disks to dom0 ' my preferred way is to:
a. Find the VDI's UUID by using 'xe vm-disk-list uuid=' ' look for e.g. 'Disk 0 VDI'
b. Run '/opt/xensource/debug/with-vdi ' ' this attaches the VDI to dom0 as /dev/$DEVICE and drops you into a shell ' exiting this shell will detach the VDI
Use /opt/xensource/libexec/sparse_dd to dd the contents of the raw file (from step 1) to the VDI.
a. E.g. /opt/xensource/libexec/sparse_dd -src /mnt/MyVM.img -dest /dev/$DEVICE -size 8589934592 -prezeroed
Exit the 'with-vdi' shell
I've tried this for a xl PV VM I have and it worked (I started from raw image rather than qcow2 so skipped step 1). My test also differs in that root is on xvda1 however your case should be fine ' IIRC pygrub is OK with root on the raw device.