|  | #!/bin/sh | 
|  | # | 
|  | # This script illustrates the sequence of operations in configfs to | 
|  | # create a very simple LIO iSCSI target with a file or block device | 
|  | # backstore. | 
|  | # | 
|  | # (C) Copyright 2014 Christophe Vu-Brugier <[email protected]> | 
|  | # | 
|  |  | 
|  | print_usage() { | 
|  | cat <<EOF | 
|  | Usage: $(basename $0) [-p PORTAL] DEVICE|FILE | 
|  | Export a block device or a file as an iSCSI target with a single LUN | 
|  | EOF | 
|  | } | 
|  |  | 
|  | die() { | 
|  | echo $1 | 
|  | exit 1 | 
|  | } | 
|  |  | 
|  | while getopts "hp:" arg; do | 
|  | case $arg in | 
|  | h) print_usage; exit 0;; | 
|  | p) PORTAL=${OPTARG};; | 
|  | esac | 
|  | done | 
|  | shift $(($OPTIND - 1)) | 
|  |  | 
|  | DEVICE=$1 | 
|  | [ -n "$DEVICE" ] || die "Missing device or file argument" | 
|  | [ -b $DEVICE -o -f $DEVICE ] || die "Invalid device or file: ${DEVICE}" | 
|  | IQN="iqn.2003-01.org.linux-iscsi.$(hostname):$(basename $DEVICE)" | 
|  | [ -n "$PORTAL" ] || PORTAL="0.0.0.0:3260" | 
|  |  | 
|  | CONFIGFS=/sys/kernel/config | 
|  | CORE_DIR=$CONFIGFS/target/core | 
|  | ISCSI_DIR=$CONFIGFS/target/iscsi | 
|  |  | 
|  | # Load the target modules and mount the config file system | 
|  | lsmod | grep -q configfs || modprobe configfs | 
|  | lsmod | grep -q target_core_mod || modprobe target_core_mod | 
|  | mount | grep -q ^configfs || mount -t configfs none $CONFIGFS | 
|  | mkdir -p $ISCSI_DIR | 
|  |  | 
|  | # Create a backstore | 
|  | if [ -b $DEVICE ]; then | 
|  | BACKSTORE_DIR=$CORE_DIR/iblock_0/data | 
|  | mkdir -p $BACKSTORE_DIR | 
|  | echo "udev_path=${DEVICE}" > $BACKSTORE_DIR/control | 
|  | else | 
|  | BACKSTORE_DIR=$CORE_DIR/fileio_0/data | 
|  | mkdir -p $BACKSTORE_DIR | 
|  | DEVICE_SIZE=$(du -b $DEVICE | cut -f1) | 
|  | echo "fd_dev_name=${DEVICE}" > $BACKSTORE_DIR/control | 
|  | echo "fd_dev_size=${DEVICE_SIZE}" > $BACKSTORE_DIR/control | 
|  | echo 1 > $BACKSTORE_DIR/attrib/emulate_write_cache | 
|  | fi | 
|  | echo 1 > $BACKSTORE_DIR/enable | 
|  |  | 
|  | # Create an iSCSI target and a target portal group (TPG) | 
|  | mkdir $ISCSI_DIR/$IQN | 
|  | mkdir $ISCSI_DIR/$IQN/tpgt_1/ | 
|  |  | 
|  | # Create a LUN | 
|  | mkdir $ISCSI_DIR/$IQN/tpgt_1/lun/lun_0 | 
|  | ln -s $BACKSTORE_DIR $ISCSI_DIR/$IQN/tpgt_1/lun/lun_0/data | 
|  | echo 1 > $ISCSI_DIR/$IQN/tpgt_1/enable | 
|  |  | 
|  | # Create a network portal | 
|  | mkdir $ISCSI_DIR/$IQN/tpgt_1/np/$PORTAL | 
|  |  | 
|  | # Disable authentication | 
|  | echo 0 > $ISCSI_DIR/$IQN/tpgt_1/attrib/authentication | 
|  | echo 1 > $ISCSI_DIR/$IQN/tpgt_1/attrib/generate_node_acls | 
|  |  | 
|  | # Allow write access for non authenticated initiators | 
|  | echo 0 > $ISCSI_DIR/$IQN/tpgt_1/attrib/demo_mode_write_protect | 
|  |  | 
|  | echo "Target ${IQN}, portal ${PORTAL} has been created" |