1*38d454f0SChristophe Vu-Brugier#!/bin/sh 2*38d454f0SChristophe Vu-Brugier# 3*38d454f0SChristophe Vu-Brugier# This script illustrates the sequence of operations in configfs to 4*38d454f0SChristophe Vu-Brugier# create a very simple LIO iSCSI target with a file or block device 5*38d454f0SChristophe Vu-Brugier# backstore. 6*38d454f0SChristophe Vu-Brugier# 7*38d454f0SChristophe Vu-Brugier# (C) Copyright 2014 Christophe Vu-Brugier <cvubrugier@fastmail.fm> 8*38d454f0SChristophe Vu-Brugier# 9*38d454f0SChristophe Vu-Brugier 10*38d454f0SChristophe Vu-Brugierprint_usage() { 11*38d454f0SChristophe Vu-Brugier cat <<EOF 12*38d454f0SChristophe Vu-BrugierUsage: $(basename $0) [-p PORTAL] DEVICE|FILE 13*38d454f0SChristophe Vu-BrugierExport a block device or a file as an iSCSI target with a single LUN 14*38d454f0SChristophe Vu-BrugierEOF 15*38d454f0SChristophe Vu-Brugier} 16*38d454f0SChristophe Vu-Brugier 17*38d454f0SChristophe Vu-Brugierdie() { 18*38d454f0SChristophe Vu-Brugier echo $1 19*38d454f0SChristophe Vu-Brugier exit 1 20*38d454f0SChristophe Vu-Brugier} 21*38d454f0SChristophe Vu-Brugier 22*38d454f0SChristophe Vu-Brugierwhile getopts "hp:" arg; do 23*38d454f0SChristophe Vu-Brugier case $arg in 24*38d454f0SChristophe Vu-Brugier h) print_usage; exit 0;; 25*38d454f0SChristophe Vu-Brugier p) PORTAL=${OPTARG};; 26*38d454f0SChristophe Vu-Brugier esac 27*38d454f0SChristophe Vu-Brugierdone 28*38d454f0SChristophe Vu-Brugiershift $(($OPTIND - 1)) 29*38d454f0SChristophe Vu-Brugier 30*38d454f0SChristophe Vu-BrugierDEVICE=$1 31*38d454f0SChristophe Vu-Brugier[ -n "$DEVICE" ] || die "Missing device or file argument" 32*38d454f0SChristophe Vu-Brugier[ -b $DEVICE -o -f $DEVICE ] || die "Invalid device or file: ${DEVICE}" 33*38d454f0SChristophe Vu-BrugierIQN="iqn.2003-01.org.linux-iscsi.$(hostname):$(basename $DEVICE)" 34*38d454f0SChristophe Vu-Brugier[ -n "$PORTAL" ] || PORTAL="0.0.0.0:3260" 35*38d454f0SChristophe Vu-Brugier 36*38d454f0SChristophe Vu-BrugierCONFIGFS=/sys/kernel/config 37*38d454f0SChristophe Vu-BrugierCORE_DIR=$CONFIGFS/target/core 38*38d454f0SChristophe Vu-BrugierISCSI_DIR=$CONFIGFS/target/iscsi 39*38d454f0SChristophe Vu-Brugier 40*38d454f0SChristophe Vu-Brugier# Load the target modules and mount the config file system 41*38d454f0SChristophe Vu-Brugierlsmod | grep -q configfs || modprobe configfs 42*38d454f0SChristophe Vu-Brugierlsmod | grep -q target_core_mod || modprobe target_core_mod 43*38d454f0SChristophe Vu-Brugiermount | grep -q ^configfs || mount -t configfs none $CONFIGFS 44*38d454f0SChristophe Vu-Brugiermkdir -p $ISCSI_DIR 45*38d454f0SChristophe Vu-Brugier 46*38d454f0SChristophe Vu-Brugier# Create a backstore 47*38d454f0SChristophe Vu-Brugierif [ -b $DEVICE ]; then 48*38d454f0SChristophe Vu-Brugier BACKSTORE_DIR=$CORE_DIR/iblock_0/data 49*38d454f0SChristophe Vu-Brugier mkdir -p $BACKSTORE_DIR 50*38d454f0SChristophe Vu-Brugier echo "udev_path=${DEVICE}" > $BACKSTORE_DIR/control 51*38d454f0SChristophe Vu-Brugierelse 52*38d454f0SChristophe Vu-Brugier BACKSTORE_DIR=$CORE_DIR/fileio_0/data 53*38d454f0SChristophe Vu-Brugier mkdir -p $BACKSTORE_DIR 54*38d454f0SChristophe Vu-Brugier DEVICE_SIZE=$(du -b $DEVICE | cut -f1) 55*38d454f0SChristophe Vu-Brugier echo "fd_dev_name=${DEVICE}" > $BACKSTORE_DIR/control 56*38d454f0SChristophe Vu-Brugier echo "fd_dev_size=${DEVICE_SIZE}" > $BACKSTORE_DIR/control 57*38d454f0SChristophe Vu-Brugier echo 1 > $BACKSTORE_DIR/attrib/emulate_write_cache 58*38d454f0SChristophe Vu-Brugierfi 59*38d454f0SChristophe Vu-Brugierecho 1 > $BACKSTORE_DIR/enable 60*38d454f0SChristophe Vu-Brugier 61*38d454f0SChristophe Vu-Brugier# Create an iSCSI target and a target portal group (TPG) 62*38d454f0SChristophe Vu-Brugiermkdir $ISCSI_DIR/$IQN 63*38d454f0SChristophe Vu-Brugiermkdir $ISCSI_DIR/$IQN/tpgt_1/ 64*38d454f0SChristophe Vu-Brugier 65*38d454f0SChristophe Vu-Brugier# Create a LUN 66*38d454f0SChristophe Vu-Brugiermkdir $ISCSI_DIR/$IQN/tpgt_1/lun/lun_0 67*38d454f0SChristophe Vu-Brugierln -s $BACKSTORE_DIR $ISCSI_DIR/$IQN/tpgt_1/lun/lun_0/data 68*38d454f0SChristophe Vu-Brugierecho 1 > $ISCSI_DIR/$IQN/tpgt_1/enable 69*38d454f0SChristophe Vu-Brugier 70*38d454f0SChristophe Vu-Brugier# Create a network portal 71*38d454f0SChristophe Vu-Brugiermkdir $ISCSI_DIR/$IQN/tpgt_1/np/$PORTAL 72*38d454f0SChristophe Vu-Brugier 73*38d454f0SChristophe Vu-Brugier# Disable authentication 74*38d454f0SChristophe Vu-Brugierecho 0 > $ISCSI_DIR/$IQN/tpgt_1/attrib/authentication 75*38d454f0SChristophe Vu-Brugierecho 1 > $ISCSI_DIR/$IQN/tpgt_1/attrib/generate_node_acls 76*38d454f0SChristophe Vu-Brugier 77*38d454f0SChristophe Vu-Brugier# Allow write access for non authenticated initiators 78*38d454f0SChristophe Vu-Brugierecho 0 > $ISCSI_DIR/$IQN/tpgt_1/attrib/demo_mode_write_protect 79*38d454f0SChristophe Vu-Brugier 80*38d454f0SChristophe Vu-Brugierecho "Target ${IQN}, portal ${PORTAL} has been created" 81