As long as TGT is installed and started, this tutorial can be used on other distros as well.
# systemctl status tgtd | grep Active:
Active: active (running)
I have to create a target to map the LUN to, and the LUN. The LUN can be a sparse file or a device.
Tgt will read /etc/tgt/targets.conf every time it starts.
To create a target, use a unique target ID and name.
# tgtadm --lld iscsi --op new --mode target --tid 34 -T iqn.20140912.ovi
I can also bind this target to specific initiators, so that only those initiators will be able to connect to it:
# tgtadm --lld iscsi --op bind --mode target --tid <target ID> --initiator-name <initiator IP>
# tgt-admin -s | grep Target
Target 34: iqn.20140912.ovi
Now I can create a LUN and map it. In this example i will use the truncate utility, but dd also can be used with the same effect.
# truncate -s 4G lun.img
I can now check the actual size and the apparent size of my LUN.
# du --apparent-size -h lun.img && du -h lun.img
4.0G lun.img
0 lun.img
To map the LUN to my target I need to know the target ID (34 in my example). I will also assign the LUN a LUN ID (non zero), which is also unique.
# tgtadm --lld iscsi --op new --mode logicalunit --tid 34 --lun 1 -b /path_to/lun.img
To save the configuration:
# tgt-admin --dump > /etc/tgt/targets.conf
I can now use an iscsi client and mount the LUN using iscsiadm, create file systems and use them as local disks.