How to setup ISCSI Linux

Connecting remote storage to your servers is essential task when you work with Virtualized environment like cloud or local vmware environment. There are two common ways to store data on remote location. use ISCSI or NFS share. This article explain how to setup ISCSI allowing your Linux to access remote storage.

What is ISCSI ?

It is an acronym for Internet Small Computer Systems Interface. an IP-based standard for transferring data over the network. In short, iSCSI is a block-level protocol for linking network-based storage to clients.

For example, ISCSI volume appears to the client operating system as a physical hard drive that you can install, configure. That way, your store your data in location-independent storage. for a detailed explanation check Wikipedia iSCSI.


NFS and iSCSI are fundamentally different in various ways in which accessing remote storage.

Multiclient Support

For instance, NFS is built for data sharing among multiple clients. On the other hand, iSCSI is designed for a single client for each volume. Though ISCSI can provide shared multi-client storage, it requires a file system that supports that.


In old days, ISCSI provided more IO performance than NFS. However, with the rapid development in network speed, the gap isn’t noticeable anymore. If your network is 100M or 1G ISCSI, you can observe the performance difference.

File system management

Client OS manages ISCSI-disk’s File system. on the contrary, NFS service handles the file locking, and that allows very efficient concurrent access among multiple clients (for example a VMWare cluster).

ISCSI terms and Keywords

Before we setup ISCSI, We need to understand the following terms:

  • Initiator
    In simple words, the software installed in client ( in our case a Linux server) that initiates SCSI requests to the iSCSI target.
  • Target Portal:
    The IP of the device that provide ISCSI storage service.
  • Target devices
    The iSCSI storage component
  • Discovery
    The process that presents the initiator with a list of available targets
  • iqn
    An iqn (iSCSI qualified name) address is the unique identifier for a device in an iSCSI network

Setup ISCSI on Linux

to enable ISCSI on Debian you need to install the open-iscsi package. in addition to, telnet to check connectivity between the two devices.

apt install -y open-iscsi
apt install -y telnet

Configure ISCSI on Linux

In our scenario, the Network-storage has multiple IPs. therefore, to set up ISCSI on our Linux server successfully.

First, check the connectivity between your server and ISCSI provided by using ping, telnet. So, use ping to check connectivity and telnet command to check port reachability. iSCSI normally uses TCP ports 860 and 3260

# ping STORAGE-IP 

# telnet STORAGE-IP 3260

Second, query ISCSI portal about the available services (target). repeat it with the number of NAS IPs

iscsiadm -m discovery -p -t st
iscsiadm -m discovery -p -t st
iscsiadm -m discovery -p -t st
iscsiadm -m discovery -p -t st

Third, Create a session by login into the storage portal IPs.

iscsiadm -m node -l all

Troubleshooting ISCSI

To delete /cleanup discovery Portals. In case of adding wrong IP or NAS IPs has changed. execute the following command and adjust it to the portal IP you want to remove.

iscsiadm -m discovery -o delete -p

List assigned LUNs

iscsiadm -m session  -P 3

If the server can not connect to storage check the network side first, then try:

sudo iscsiadm -m session -o show

restarting the services to make mount automated

sudo systemctl enable open-iscsi
sudo systemctl start open-iscsi


sudo systemctl enable iscsi

sudo systemctl start iscsi

Check if iface is hardcoded by removing files in the following folder


EXAMPLE OF iscsi.conf 

iscsid.startup = /usr/sbin/iscsid
node.startup = automatic
node.leading_login = Yes
node.session.auth.authmethod = CHAP
node.session.auth.username =
node.session.auth.password = mfcctv01iscsi
discovery.sendtargets.auth.authmethod = CHAP
discovery.sendtargets.auth.username =
discovery.sendtargets.auth.password = mfcctv01iscsi
node.session.timeo.replacement_timeout = 120
node.conn[0].timeo.login_timeout = 15
node.conn[0].timeo.logout_timeout = 15
node.conn[0].timeo.noop_out_interval = 5
node.conn[0].timeo.noop_out_timeout = 5
node.session.err_timeo.abort_timeout = 15
node.session.err_timeo.lu_reset_timeout = 30
node.session.err_timeo.tgt_reset_timeout = 30
node.session.initial_login_retry_max = 8
node.session.cmds_max = 128
node.session.queue_depth = 32
node.session.xmit_thread_priority = -20
node.session.iscsi.InitialR2T = No
node.session.iscsi.ImmediateData = Yes
node.session.iscsi.FirstBurstLength = 262144
node.session.iscsi.MaxBurstLength = 16776192
node.conn[0].iscsi.MaxRecvDataSegmentLength = 262144
node.conn[0].iscsi.MaxXmitDataSegmentLength = 0
discovery.sendtargets.iscsi.MaxRecvDataSegmentLength = 32768
node.session.nr_sessions = 1
node.session.iscsi.FastAbort = Yes