• XCP/Xenserver
  • Access to Internet


Update: June 2nd, 2014 - I changed most of the tgtadm long format options to short format due to my not being able to remember the long format. For some reason --lld didn't seem like a valid option. I did however keep --lun and --backing-store.

Creating an iSCSI target on Xen Cloud Platform 1.1

Premise: I have two pools – The first has one host in it that acts as a router, firewall and Host for a couple of special VMs for (DNS, DHCP, NFS, Web) the hosts in a second pool. I've added iSCSI SAN to it's lists of jobs using a software iSCSI target in the 8 steps below.


1. Install tgt from CentOS repos

yum --enablerepo=base install scsi-target-utils

2. Start the tgt service

service tgtd start

chkconfig tgtd on

3. Preparing for LVM


I'm using a separate hard drive - /dev/sdb and creating one partition which will be used as my LVM Physical Volume. We'll then add it to the Volume Group and carve it up into Logical Volumes. This way I can just add another hard drive to the Volume Group when we want more capacity and the rest of the tutorial stays the same. The bold letters are what I input, I accepted the defaults everywhere else.


[root@cloud0 ~]# fdisk /dev/sdb

Command (m for help): p

Disk /dev/sdb: 240.0 GB, 240057409536 bytes

255 heads, 63 sectors/track, 29185 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


Device Boot Start End Blocks Id System

Command (m for help): n

Command action

e extended

p primary partition (1-4)


Partition number (1-4): 1

First cylinder (1-29185, default 1):

Using default value 1

Last cylinder or +size or +sizeM or +sizeK (1-29185, default 29185):

Using default value 29185

Command (m for help): t

Selected partition 1

Hex code (type L to list codes): 8e

Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): p

Disk /dev/sdb: 240.0 GB, 240057409536 bytes

255 heads, 63 sectors/track, 29185 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System

/dev/sdb1 1 29185 234428481 8e Linux LVM

Command (m for help): w

The partition table has been altered!

Calling ioctl() to re-read partition table.

Syncing disks.

This gives me a new partition - /dev/sdb1. Now lets create the Logical Volumes to be shared out via iSCSI.


pvcreate /dev/sdb1

vgcreate VG_iSCSI /dev/sdb1


VG #PV #LV #SN Attr VSize VFree

VG_XenStorage-19756537-a3bc-5c1f-edfc-01bc47ddf5d8 1 8 0 wz--n- 923.50G 354.21G

VG_iSCSI 1 0 0 wz--n- 223.57G 223.57G

4. Creating a Logical Volume

lvcreate -L 223G –name iSCSI_disk1 VG_iSCSI


LV VG Attr LSize Origin Snap% Move Log Copy% Convert

MGT VG_XenStorage-19756537-a3bc-5c1f-edfc-01bc47ddf5d8 -wi-a- 4.00M

iSCSI_disk1 VG_iSCSI -wi-a- 223.00G


5. List active targets

tgtadm -L iscsi -m target -o show


6. Create a new target device

tgtadm -L iscsi -m target -o new -t 1 -T


7. Add a logical unit (LUN)


tgtadm -L iscsi -m logicalunit -o new -t 1 --lun=1 --backing-store=/dev/VG_iSCSI/iSCSI_disk1 

To add more units repeat step 4 by incrementing the LV --name (iSCSI-disk1) and step 6 by changing the --lun number and --backing-store parameter to add more LUNs.

For example:


lvcreate -L 10G --name iSCSI-disk2 VG_iSCSI

tgtadm -L iscsi -m logicalunit -o new -t 1 --lun=2 --backing-store=/dev/VG_iSCSI/iSCSI_disk2



In case you mess it up and want to delete the LUN and Target



tgtadm -L iscsi -m logicalunit -o delete -t 1 --lun=1

tgtadm -L iscsi -m target -o delete –t 1 




8. Setting up Access Control

We're going to allow all iSCSI initators to connect. This is not very secure so if you want to limit this you'll want to do it here. You can limit by IP address range or network. You can also set up CHAP authentication.

tgtadm -L iscsi -m target -o bind -t 1 -I ALL


9. Creating the Software iSCSI Storage Repository

Log into your Pool Master using ssh and run xsconsole. Choose Disks and Storage Repositories then Create New Storage Repository. When prompted type in the root users name and password then select Software iSCSI. You can name it anything you want and provide a description too. The only field you really need is the Hostname or iSCSI Target field. Put in the IP or Hostname of your iSCSI Target and hit enter to let it probe the iSCSI target. It will show you a list of LUNs, choose the one you want and press F-8. This will create the storage repository. It may also make it default which you may not want.


10. Change the default storage repository

In my case I wanted to use the new iSCSI SAN as additional drives and not my default SR. When you use xsconsole to create the Storage Repository it also makes it default. To make a different SR default follow these instructions. If you want the iSCSI SR to be default skip this step.

Get the pool UUID, get the SR UUID then set it default.


[root@cloud1 ~]# xe pool-list

uuid ( RO) : a8cff715-6ff7-a01f-b7a3-7ad3b158df71

name-label ( RW):

name-description ( RW):

master ( RO): 47c0e22c-eac9-444d-a4b1-d958f0ab60cf

default-SR ( RW): 36bf480a-5df9-4453-50f0-2bac4a86cb42



[root@cloud1 ~]# xe sr-list

uuid ( RO) : 36bf480a-5df9-4453-50f0-2bac4a86cb42

name-label ( RW): Local storage

name-description ( RW):

host ( RO):

type ( RO): lvm

content-type ( RO): user


xe pool-param-set default-SR=36bf480a-5df9-4453-50f0-2bac4a86cb42 uuid=a8cff715-6ff7-a01f-b7a3-7ad3b158df71


Now you a software iSCSI Target on XCP 1.1, a disk that's shared out via iSCSI and a Software Repository that uses it.