Saturday, March 8, 2014

Setting up direct access to a block device from VM in Xen XCP (Debian 7.4 (wheezy))

There is no good documentation for XCP at the moment. Amount of documentation for such a complicated project is close to nothing when it comes to XCP on Debian (project Kronos). Citrix XenServer has a better support but I don't use XenServer, I use Debian. Therefore almost any simple task starts with "hours" of search in internet.
Normally you don't need direct access to a block device from a virtual machine, but in some cases it is very to convenient to use one. One of such cases is a file/backup server which needs access to a raid or just a huge hard disk with an existing file system.
Here is what should be done in order to make it work.
1. Create a directory which will contain links to the block devices visible in XEN.
mkdir /srv/xen-devices

2. Create storage repository for the block devices
xe sr-create name-label="Block devices" name-description="Block devices which we want to use directly in XEN" type=udev content-type=disk device-config:location=/srv/xen-devices
assign displayed uuid to shell variable SR

3. [Optional] If step 2 fails with the error message:
The SR could not be connected because the driver was not recognised.
driver: udev

then you need to fix it. Do the following:
cd /usr/lib/xcp/sm/
ln -s udevSR.py udevSR
/usr/lib/xcp/bin/xe-toolstack-restart
And then try again step 2.

4. Find a device you want to make visible in the Xen, for example, like this:
ls -l /dev/disk/by-path

Link it
ln -s /dev/disk/by-id/ata-some-device /srv/xen-devices/some-device

5. Rescan our storage repository
xe sr-scan uuid=$SR

6. List VDIs of the storage repository and spot the one with "Unrecognised bus type"
xe vdi-list sr-uuid=$SR

assign VDI¨s uuid to the VDI variable in shell.

7. Set name and label for the VDI to whatever you like:
xe vdi-param-set uuid=$VDI name-description="A real disk" 
xe vdi-param-set uuid=$VDI name-label="R-disk"

8. Create VBD which assign the VDI to the VM
xe vbd-create device=1 vm-uuid=$VM vdi-uuid=$VDI bootable=false mode=RW type=Disk
assign display uuid to the VBD variable

9. Attach it to the VM
xe vbd-plug uuid=$VBD

That's all. Now you can log into the virtual machine and check with 'dmesg' that a new device is available.