@@ -35,6 +35,8 @@ INSTALL_SBIN += $(INSTALL_SBIN-y)
# Everything to be installed in a private bin/
INSTALL_PRIVBIN += xenpvnetboot
+INSTALL_PRIVBIN += target-create-xen-scsiback.sh
+INSTALL_PRIVBIN += target-delete-xen-scsiback.sh
# Everything to be installed
TARGETS_ALL := $(INSTALL_BIN) $(INSTALL_SBIN) $(INSTALL_PRIVBIN)
@@ -45,6 +47,8 @@ TARGETS_COPY += xen-ringwatch
TARGETS_COPY += xencons
TARGETS_COPY += xencov_split
TARGETS_COPY += xenpvnetboot
+TARGETS_COPY += target-create-xen-scsiback.sh
+TARGETS_COPY += target-delete-xen-scsiback.sh
# Everything which needs to be built
TARGETS_BUILD := $(filter-out $(TARGETS_COPY),$(TARGETS_ALL))
new file mode 100755
@@ -0,0 +1,135 @@
+#!/usr/bin/env bash
+unset LANG
+unset ${!LC_*}
+set -x
+set -e
+
+modprobe --version
+targetcli --version
+udevadm --version
+blockdev --version
+parted --version
+sfdisk --version
+mkswap --version
+
+configfs=/sys/kernel/config
+target_path=$configfs/target
+
+num_luns=4
+num_hosts=4
+
+case "$1" in
+ -p)
+ backend="pvops"
+ ;;
+ -x)
+ backend="xenlinux"
+ ;;
+ *)
+ : "usage: $0 [-p|-x]"
+ if grep -qw xenfs$ /proc/filesystems
+ then
+ backend="pvops"
+ else
+ backend="xenlinux"
+ fi
+ ;;
+esac
+
+get_wwn() {
+ sed '
+ s@-@@g
+ s@^\(.\{16\}\)\(.*\)@\1@
+ ' /proc/sys/kernel/random/uuid
+}
+
+if test ! -d "${target_path}"
+then
+ modprobe -v configfs
+ mount -vt configfs configfs $configfs
+ modprobe -v target_core_mod
+fi
+if test "${backend}" = "pvops"
+then
+ modprobe -v xen-scsiback
+fi
+
+host=0
+while test $host -lt $num_hosts
+do
+ host=$(( $host + 1 ))
+ lun=0
+ loopback_wwn="naa.`get_wwn`"
+ pvscsi_wwn="naa.`get_wwn`"
+ targetcli /loopback create ${loopback_wwn}
+ if test "${backend}" = "pvops"
+ then
+ targetcli /xen-pvscsi create ${pvscsi_wwn}
+ fi
+ while test $lun -lt $num_luns
+ do
+ : h $host l $lun
+ f_file=/dev/shm/Fileio.${host}.${lun}.file
+ f_uuid=/dev/shm/Fileio.${host}.${lun}.uuid
+ f_link=/dev/shm/Fileio.${host}.${lun}.link
+ fileio_name="fio_${host}.${lun}"
+ pscsi_name="ps_${host}.${lun}"
+
+ targetcli /backstores/fileio create name=${fileio_name} "file_or_dev=${f_file}" size=$((1024*1024 * 8 )) sparse=true
+ targetcli /loopback/${loopback_wwn}/luns create /backstores/fileio/${fileio_name} $lun
+
+ vpd_uuid="`sed -n '/^T10 VPD Unit Serial Number:/s@^[^:]\+:[[:blank:]]\+@@p' /sys/kernel/config/target/core/fileio_*/${fileio_name}/wwn/vpd_unit_serial`"
+ if test -z "${vpd_uuid}"
+ then
+ exit 1
+ fi
+ echo "${vpd_uuid}" > "${f_uuid}"
+ by_id="`echo ${vpd_uuid} | sed 's@-@@g;s@^\(.\{25\}\)\(.*\)@scsi-36001405\1@'`"
+ udevadm settle --exit-if-exists="/dev/disk/by-id/${by_id}"
+ ln -sfvbn "/dev/disk/by-id/${by_id}" "${f_link}"
+
+ f_major=$((`stat --dereference --format=0x%t "${f_link}"`))
+ f_minor=$((`stat --dereference --format=0x%T "${f_link}"`))
+ if test -z "${f_major}" || test -z "${f_minor}"
+ then
+ exit 1
+ fi
+ f_alias=`ls -d /sys/dev/block/${f_major}:${f_minor}/device/scsi_device/*:*:*:*`
+ if test -z "${f_alias}"
+ then
+ exit 1
+ fi
+ f_alias=${f_alias##*/}
+
+ blockdev --rereadpt "${f_link}"
+ udevadm settle
+ echo 1,96,S | sfdisk "${f_link}"
+ udevadm settle
+ blockdev --rereadpt "${f_link}"
+ udevadm settle
+ parted -s "${f_link}" unit s print
+
+ d_link="`readlink \"${f_link}\"`"
+ if test -n "${d_link}"
+ then
+ p_link="${d_link}-part1"
+ udevadm settle --exit-if-exists="${p_link}"
+ ls -l "${p_link}"
+ mkswap -L "swp_${fileio_name}" "${p_link}"
+ udevadm settle
+ blockdev --rereadpt "${f_link}"
+ udevadm settle
+ parted -s "${f_link}" unit s print
+ fi
+
+ targetcli /backstores/pscsi create "dev=${f_link}" "${pscsi_name}"
+ if test "${backend}" = "pvops"
+ then
+ targetcli /xen-pvscsi/${pvscsi_wwn}/tpg1/luns create "/backstores/pscsi/${pscsi_name}" $lun
+ targetcli /xen-pvscsi/${pvscsi_wwn}/tpg1 set parameter alias=${f_alias%:*}
+ fi
+
+ lun=$(( $lun + 1 ))
+ done
+done
+
new file mode 100755
@@ -0,0 +1,41 @@
+#!/usr/bin/env bash
+unset LANG
+unset ${!LC_*}
+set -x
+set -e
+
+targetcli --version
+
+configfs=/sys/kernel/config
+target_path=$configfs/target
+
+cd "${target_path}"
+if cd xen-pvscsi
+then
+ for wwn in `ls -d naa.*`
+ do
+ targetcli /xen-pvscsi delete $wwn
+ done
+fi
+cd "${target_path}"
+cd core
+for name in `ls -d pscsi_*/*/wwn`
+do
+ name=${name%/wwn}
+ name=${name##*/}
+ targetcli /backstores/pscsi delete $name
+done
+cd "${target_path}"
+cd loopback
+for wwn in `ls -d naa.*`
+do
+ targetcli /loopback delete $wwn
+done
+cd "${target_path}"
+cd core
+for name in `ls -d fileio_*/*/wwn`
+do
+ name=${name%/wwn}
+ name=${name##*/}
+ targetcli /backstores/fileio delete $name
+done
Just to make them public, not meant for merging: The scripts used during development to create a bunch of SCSI devices in dom0 using the Linux target framework. targetcli3 and rtslib3 is used. A patch is required for python-rtslib: http://article.gmane.org/gmane.linux.scsi.target.devel/8146 Signed-off-by: Olaf Hering <olaf@aepfle.de> --- tools/misc/Makefile | 4 + tools/misc/target-create-xen-scsiback.sh | 135 +++++++++++++++++++++++++++++++ tools/misc/target-delete-xen-scsiback.sh | 41 ++++++++++ 3 files changed, 180 insertions(+)