xref: /linux/Documentation/target/target-export-device (revision a976c2951d8f376112361830aa7762beff83a205)
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