====== Configuring the server (target) using LIO ====== # aptitude install targetcli-fb This installs the command **targetcli** and associated python scripts. The command can be used in two ways: - To enter a special semi-graphical "targetcli" shell, and issue sub-commands inside it - By prefixing all required commands with "targetcli", which makes it possible to use it from a script Example:# targetcli ls o- / ......................................................................... [...] o- backstores .............................................................. [...] | o- block .................................................. [Storage Objects: 1] | | o- iscsivolume1 ..................... [/dev/md5 (8.1TiB) write-thru activated] | | o- alua ................................................... [ALUA Groups: 1] | | o- default_tg_pt_gp ....................... [ALUA state: Active/optimized] | o- fileio ................................................. [Storage Objects: 0] | o- pscsi .................................................. [Storage Objects: 0] | o- ramdisk ................................................ [Storage Objects: 0] o- iscsi ............................................................ [Targets: 1] | o- iqn.2020-09.network.hostname:share ................................ [TPGs: 1] | o- tpg1 ............................................... [no-gen-acls, no-auth] | o- acls .......................................................... [ACLs: 2] | | o- iqn.1993-08.org.debian:01:81ab2ca5ba15 ............... [Mapped LUNs: 1] | | | o- mapped_lun0 .......................... [lun0 block/iscsivolume1 (rw)] | | o- iqn.2020-09.network.clientname:openiscsi ............. [Mapped LUNs: 1] | | o- mapped_lun0 .......................... [lun0 block/iscsivolume1 (rw)] | o- luns .......................................................... [LUNs: 1] | | o- lun0 ............... [block/iscsivolume1 (/dev/md5) (default_tg_pt_gp)] | o- portals .................................................... [Portals: 1] | o- 0.0.0.0:3260 ..................................................... [OK] o- loopback ......................................................... [Targets: 0] o- vhost ............................................................ [Targets: 0] o- xen-pvscsi ....................................................... [Targets: 0] This shows that I am sharing an 8.1 Tbyte device named /dev/md5 under the name **iqn.2020-09.network.hostname:share** and this is accessible from two clients **iqn.1993-08.org.debian:01:81ab2ca5ba15** and **iqn.2020-09.network.clientname:openiscsi**. ===== Example ===== I want to share the Logical Volume **/dev/SCSItarget/share** to any machine on my local network 192.168.42.0/24 ==== Pseudo-shell ==== Here are the first steps shown in the semi-graphical pseudo-shell: # targetcli targetcli shell version 2.1.fb48 Copyright 2011-2013 by Datera, Inc and others. For help on commands, type 'help'. /> cd /backstores/block /backstores/block> create iscsivolume2 /dev/SCSItarget/share Created block storage object iscsivolume2 using /dev/SCSItarget/share. /backstores/block> cd /iscsi /iscsi> create iqn.2021-01.network.hostname:bigshare Created target iqn.2021-01.network.hostname:bigshare. Created TPG 1. Global pref auto_add_default_portal=true Created default portal listening on all IPs (0.0.0.0), port 3260. /iscsi> cd iqn.2021-01.network.hostname:bigshare/tpg1/luns /iscsi/iqn.20...tec/tpg1/luns> create /backstores/block/iscsivolume2 Created LUN 0. /iscsi/iqn.20...tec/tpg1/luns> exit Global pref auto_save_on_exit=true Last 10 configs saved in /etc/rtslib-fb-target/backup. Configuration saved to /etc/rtslib-fb-target/saveconfig.json At the end of this, we have: # targetcli ls o- / ......................................................................... [...] o- backstores .............................................................. [...] | o- block .................................................. [Storage Objects: 2] | | o- iscsivolume1 ..................... [/dev/md5 (8.1TiB) write-thru activated] | | | o- alua ................................................... [ALUA Groups: 1] | | | o- default_tg_pt_gp ....................... [ALUA state: Active/optimized] | | o- iscsivolume2 ....... [/dev/SCSItarget/share (13.6TiB) write-thru activated] | | o- alua ................................................... [ALUA Groups: 1] | | o- default_tg_pt_gp ....................... [ALUA state: Active/optimized] | o- fileio ................................................. [Storage Objects: 0] | o- pscsi .................................................. [Storage Objects: 0] | o- ramdisk ................................................ [Storage Objects: 0] o- iscsi ............................................................ [Targets: 2] | o- iqn.2020-09.network.hostname:share ................................ [TPGs: 1] | | o- tpg1 ............................................... [no-gen-acls, no-auth] | | o- acls .......................................................... [ACLs: 2] | | | o- iqn.1993-08.org.debian:01:81ab2ca5ba15 ............... [Mapped LUNs: 1] | | | | o- mapped_lun0 .......................... [lun0 block/iscsivolume1 (rw)] | | | o- iqn.2020-09.network.clientname:openiscsi ............. [Mapped LUNs: 1] | | | o- mapped_lun0 .......................... [lun0 block/iscsivolume1 (rw)] | | o- luns .......................................................... [LUNs: 1] | | | o- lun0 ............... [block/iscsivolume1 (/dev/md5) (default_tg_pt_gp)] | | o- portals .................................................... [Portals: 1] | | o- 0.0.0.0:3260 ..................................................... [OK] | o- iqn.2021-01.network.hostname:bigshare ............................. [TPGs: 1] | o- tpg1 ............................................... [no-gen-acls, no-auth] | o- acls .......................................................... [ACLs: 0] | o- luns .......................................................... [LUNs: 1] | | o- lun0 .. [block/iscsivolume2 (/dev/SCSItarget/share) (default_tg_pt_gp)] | o- portals .................................................... [Portals: 1] | o- 0.0.0.0:3260 ..................................................... [OK] o- loopback ......................................................... [Targets: 0] o- vhost ............................................................ [Targets: 0] o- xen-pvscsi ....................................................... [Targets: 0] ==== Standard command-line ==== Personally I find that sort of thing pretty tedious, so here's the scripted way of doing it, including adding the ACLs to allow the same clients to access the new share: # targetcli /backstores/block create iscsivolume2 /dev/SCSItarget/share Created block storage object iscsivolume2 using /dev/SCSItarget/share. # targetcli /iscsi create iqn.2021-01.network.hostname:bigshare Created target iqn.2021-01.network.hostname:bigshare. Created TPG 1. Global pref auto_add_default_portal=true Created default portal listening on all IPs (0.0.0.0), port 3260. # targetcli /iscsi/iqn.2021-01.network.hostname:bigshare/tpg1/luns create /backstores/block/iscsivolume2 Created LUN 0. # targetcli /iscsi/iqn.2021-01.network.hostname:bigshare/tpg1/acls/ create iqn.1993-08.org.debian:01:81ab2ca5ba15 Created Node ACL for iqn.1993-08.org.debian:01:81ab2ca5ba15 Created mapped LUN 0. # targetcli /iscsi/iqn.2021-01.network.hostname:bigshare/tpg1/acls/ create iqn.2020-09.network.clientname:openiscsi Created Node ACL for iqn.2020-09.network.clientname:openiscsi Created mapped LUN 0. # targetcli saveconfig Last 10 configs saved in /etc/rtslib-fb-target/backup/. Configuration saved to /etc/rtslib-fb-target/saveconfig.json The result of the above commands is then: # targetcli ls o- / ......................................................................... [...] o- backstores .............................................................. [...] | o- block .................................................. [Storage Objects: 2] | | o- iscsivolume1 ..................... [/dev/md5 (8.1TiB) write-thru activated] | | | o- alua ................................................... [ALUA Groups: 1] | | | o- default_tg_pt_gp ....................... [ALUA state: Active/optimized] | | o- iscsivolume2 ....... [/dev/SCSItarget/share (13.6TiB) write-thru activated] | | o- alua ................................................... [ALUA Groups: 1] | | o- default_tg_pt_gp ....................... [ALUA state: Active/optimized] | o- fileio ................................................. [Storage Objects: 0] | o- pscsi .................................................. [Storage Objects: 0] | o- ramdisk ................................................ [Storage Objects: 0] o- iscsi ............................................................ [Targets: 2] | o- iqn.2020-09.network.hostname:share ................................ [TPGs: 1] | | o- tpg1 ............................................... [no-gen-acls, no-auth] | | o- acls .......................................................... [ACLs: 2] | | | o- iqn.1993-08.org.debian:01:81ab2ca5ba15 ............... [Mapped LUNs: 1] | | | | o- mapped_lun0 .......................... [lun0 block/iscsivolume1 (rw)] | | | o- iqn.2020-09.network.clientname:openiscsi ............. [Mapped LUNs: 1] | | | o- mapped_lun0 .......................... [lun0 block/iscsivolume1 (rw)] | | o- luns .......................................................... [LUNs: 1] | | | o- lun0 ............... [block/iscsivolume1 (/dev/md5) (default_tg_pt_gp)] | | o- portals .................................................... [Portals: 1] | | o- 0.0.0.0:3260 ..................................................... [OK] | o- iqn.2021-01.network.hostname:bigshare ............................. [TPGs: 1] | o- tpg1 ............................................... [no-gen-acls, no-auth] | o- acls .......................................................... [ACLs: 2] | | o- iqn.1993-08.org.debian:01:81ab2ca5ba15 ............... [Mapped LUNs: 1] | | | o- mapped_lun0 .......................... [lun0 block/iscsivolume2 (rw)] | | o- iqn.2020-09.network.clientname:openiscsi ............. [Mapped LUNs: 1] | | o- mapped_lun0 .......................... [lun0 block/iscsivolume2 (rw)] | o- luns .......................................................... [LUNs: 1] | | o- lun0 .. [block/iscsivolume2 (/dev/SCSItarget/share) (default_tg_pt_gp)] | o- portals .................................................... [Portals: 1] | o- 0.0.0.0:3260 ..................................................... [OK] o- loopback ......................................................... [Targets: 0] o- vhost ............................................................ [Targets: 0] o- xen-pvscsi ....................................................... [Targets: 0] ==== Either way ==== Take your pick whether you prefer the pseudo-shell environment or the scriptable command-line method, but the significant commands from the above are: * /backstores/block **create** iscsivolume2 /dev/SCSItarget/share * defines the device to be shared * /iscsi **create** iqn.2021-01.network.hostname:bigshare * gives it a name to be connected to * /iscsi/iqn.2021-01.network.hostname:bigshare/tpg1/luns **create** /backstores/block/iscsivolume2 * associates the name with the device * /iscsi/iqn.2021-01.network.hostname:bigshare/tpg1/acls/ **create** iqn.2020-09.network.clientname:openiscsi * allows the client/s to connect You can then connect to the new share from the [[.initiator|client]]. ===== Status ===== For reasons which are beyond me, the standard startup script **/etc/init.d/iscsi-target** (or, in later releases, the spectacularly unmemorable and non-obviously-named **/etc/init.d/rtslib-fb-targetctl**) supports a **status** parameter, the effect of which is to print out **Not supported!**. Somebody actually went to the bother of providing a status command which is totally pointless, when a useful version is so simple. Edit whichever version of the startup script is on your machine and replace the following line: echo "Not supported!"with: targetcli ls targetcli sessions detail Now the **status** command will tell you what this machine is making available, and which other machines are currently connected to it. Note to package maintainer: Now, that wasn't so hard, was it? ---- [[.:|Go up]]\\ Return to [[:|main index]].