Blame view

Documentation/target/target-export-device 2.24 KB
81f7e3824   Eric Lee   Initial Release, ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
  #!/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 <cvubrugier@fastmail.fm>
  #
  
  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"