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