162306a36Sopenharmony_ci#!/bin/sh
262306a36Sopenharmony_ci#
362306a36Sopenharmony_ci# This script illustrates the sequence of operations in configfs to
462306a36Sopenharmony_ci# create a very simple LIO iSCSI target with a file or block device
562306a36Sopenharmony_ci# backstore.
662306a36Sopenharmony_ci#
762306a36Sopenharmony_ci# (C) Copyright 2014 Christophe Vu-Brugier <cvubrugier@fastmail.fm>
862306a36Sopenharmony_ci#
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciprint_usage() {
1162306a36Sopenharmony_ci    cat <<EOF
1262306a36Sopenharmony_ciUsage: $(basename $0) [-p PORTAL] DEVICE|FILE
1362306a36Sopenharmony_ciExport a block device or a file as an iSCSI target with a single LUN
1462306a36Sopenharmony_ciEOF
1562306a36Sopenharmony_ci}
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cidie() {
1862306a36Sopenharmony_ci    echo $1
1962306a36Sopenharmony_ci    exit 1
2062306a36Sopenharmony_ci}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ciwhile getopts "hp:" arg; do
2362306a36Sopenharmony_ci    case $arg in
2462306a36Sopenharmony_ci        h) print_usage; exit 0;;
2562306a36Sopenharmony_ci        p) PORTAL=${OPTARG};;
2662306a36Sopenharmony_ci    esac
2762306a36Sopenharmony_cidone
2862306a36Sopenharmony_cishift $(($OPTIND - 1))
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ciDEVICE=$1
3162306a36Sopenharmony_ci[ -n "$DEVICE" ] || die "Missing device or file argument"
3262306a36Sopenharmony_ci[ -b $DEVICE -o -f $DEVICE ] || die "Invalid device or file: ${DEVICE}"
3362306a36Sopenharmony_ciIQN="iqn.2003-01.org.linux-iscsi.$(hostname):$(basename $DEVICE)"
3462306a36Sopenharmony_ci[ -n "$PORTAL" ] || PORTAL="0.0.0.0:3260"
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ciCONFIGFS=/sys/kernel/config
3762306a36Sopenharmony_ciCORE_DIR=$CONFIGFS/target/core
3862306a36Sopenharmony_ciISCSI_DIR=$CONFIGFS/target/iscsi
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci# Load the target modules and mount the config file system
4162306a36Sopenharmony_cilsmod | grep -q configfs || modprobe configfs
4262306a36Sopenharmony_cilsmod | grep -q target_core_mod || modprobe target_core_mod
4362306a36Sopenharmony_cimount | grep -q ^configfs || mount -t configfs none $CONFIGFS
4462306a36Sopenharmony_cimkdir -p $ISCSI_DIR
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci# Create a backstore
4762306a36Sopenharmony_ciif [ -b $DEVICE ]; then
4862306a36Sopenharmony_ci    BACKSTORE_DIR=$CORE_DIR/iblock_0/data
4962306a36Sopenharmony_ci    mkdir -p $BACKSTORE_DIR
5062306a36Sopenharmony_ci    echo "udev_path=${DEVICE}" > $BACKSTORE_DIR/control
5162306a36Sopenharmony_cielse
5262306a36Sopenharmony_ci    BACKSTORE_DIR=$CORE_DIR/fileio_0/data
5362306a36Sopenharmony_ci    mkdir -p $BACKSTORE_DIR
5462306a36Sopenharmony_ci    DEVICE_SIZE=$(du -b $DEVICE | cut -f1)
5562306a36Sopenharmony_ci    echo "fd_dev_name=${DEVICE}" > $BACKSTORE_DIR/control
5662306a36Sopenharmony_ci    echo "fd_dev_size=${DEVICE_SIZE}" > $BACKSTORE_DIR/control
5762306a36Sopenharmony_ci    echo 1 > $BACKSTORE_DIR/attrib/emulate_write_cache
5862306a36Sopenharmony_cifi
5962306a36Sopenharmony_ciecho 1 > $BACKSTORE_DIR/enable
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci# Create an iSCSI target and a target portal group (TPG)
6262306a36Sopenharmony_cimkdir $ISCSI_DIR/$IQN
6362306a36Sopenharmony_cimkdir $ISCSI_DIR/$IQN/tpgt_1/
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci# Create a LUN
6662306a36Sopenharmony_cimkdir $ISCSI_DIR/$IQN/tpgt_1/lun/lun_0
6762306a36Sopenharmony_ciln -s $BACKSTORE_DIR $ISCSI_DIR/$IQN/tpgt_1/lun/lun_0/data
6862306a36Sopenharmony_ciecho 1 > $ISCSI_DIR/$IQN/tpgt_1/enable
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci# Create a network portal
7162306a36Sopenharmony_cimkdir $ISCSI_DIR/$IQN/tpgt_1/np/$PORTAL
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci# Disable authentication
7462306a36Sopenharmony_ciecho 0 > $ISCSI_DIR/$IQN/tpgt_1/attrib/authentication
7562306a36Sopenharmony_ciecho 1 > $ISCSI_DIR/$IQN/tpgt_1/attrib/generate_node_acls
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci# Allow write access for non authenticated initiators
7862306a36Sopenharmony_ciecho 0 > $ISCSI_DIR/$IQN/tpgt_1/attrib/demo_mode_write_protect
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ciecho "Target ${IQN}, portal ${PORTAL} has been created"
81