Configuring a Linux initiator for StorPool iSCSI

iSCSI target checks

A tool is available to check if the presently connected targets are properly configured, however it does not parse/check the /etc/iscsi/iscsid.conf or /etc/multipath.conf for proper settings, only suggests setting up recommended values by printing commands for fixing them for the best known performance and reliability.

To download the tool use:

wget -O /usr/local/bin/iscsi_target_checks https://vault.storpool.com/iscsi_target_checks
chmod +x /usr/local/bin/iscsi_target_checks

An example output suggesting proper settings after changing the ``/etc/iscsi/iscsid.conf`` and/or the ``/etc/multipath.conf`` files for an example target:

[root@test ~]# iscsi_target_checks iqn.2020-04.com.storpool:autotest:s23-2-iscsi-test-hdd-centos7
# Target: iqn.2020-04.com.storpool:autotest:s23-2-iscsi-test-hdd-centos7 property node.session.timeo.replacement_timeout expected -1, found 120
# command to fix to -1:
iscsiadm -m node -T iqn.2020-04.com.storpool:autotest:s23-2-iscsi-test-hdd-centos7 -p 10.1.100.204:3260,1 -o update -n node.session.timeo.replacement_timeout -v -1
# /sys/class/iscsi_session/session50/recovery_tmo value is different than expected, required off, got 120
# Please restart the iscsid service:
systemctl restart iscsid.service

Usually piping its output to sh (or sh -x for visibility) would be enough to fix the required values (or stop if something fails). Example:

[root@test ~]# iscsi_target_checks iqn.2020-04.com.storpool:autotest:s23-2-iscsi-test-hdd-centos7  | sh -x
+ iscsiadm -m node -T iqn.2020-04.com.storpool:autotest:s23-2-iscsi-test-hdd-centos7 -p 10.1.100.204:3260,1 -o update -n node.session.timeo.replacement_timeout -v -1
+ systemctl restart iscsid.service

Provided everything was correctly configured, there should be no subsequent output for this target even after a connection reset or a rediscover:

[root@test ~]# iscsi_target_checks iqn.2020-04.com.storpool:autotest:s23-2-iscsi-test-hdd-centos7

Multipath

Install multipath:

yum -y install device-mapper-multipath

Configure multipath

Add in /etc/multipath.conf :

defaults {
        prio                    "alua"
        failback                "manual"
        no_path_retry           "queue"
        queue_without_daemon    "yes"

}

devices {
    device {
        vendor                  "StorPool"
        product                 ".*"
        path_grouping_policy    multibus
        path_selector           "round-robin 0"
        features                "1 queue_if_no_path"
        fast_io_fail_tmo        "0"
    }
}

Restart multipathd:

systemctl restart mutipathd

iSCSI Initiator

Install iscsi initiator tools:

yum -y install iscsi-initiator-utils

Set Initiator IQN in /etc/iscsi/initiatorname.iscsi :

InitiatorName=iqn.2019-01.com.storpool:s09-1

Set the following values in /etc/iscsi/iscsid.conf:

  • multipath:

    node.session.timeo.replacement_timeout = 0
    node.conn[0].timeo.noop_out_interval = 1
    node.conn[0].timeo.noop_out_timeout = 1
    
  • non-multipath:

    node.session.timeo.replacement_timeout = -1
    node.conn[0].timeo.noop_out_interval = 1
    node.conn[0].timeo.noop_out_timeout = 1
    

Restart iscsid:

systemctl restart iscsid

Attention

This is a crucial step, especially if the iscsiadm tool was used for updating values for live connections/sessions, without an explicit restart some of the updated settings will not get applied to the live connection or will be reverted on an event that causes the TCP connection to re-establish. Restarting the iscsid service would re-connect all TCP connections with the updated settings. The re-connect is not known to be service affecting.

Set block device timeout

Add a rule: /etc/udev/rules.d/99-storpool.rules:

# Set the HBA timeout to 3600 seconds
ACTION=="add", SUBSYSTEMS=="scsi", ATTRS{vendor}=="StorPool", RUN+="/bin/sh -c 'echo 3600 > /sys/$DEVPATH/device/timeout'"

Reload udev rules:

udevadm control --reload

Discover and connect to target

iscsiadm --mode discoverydb --type sendtargets --portal ${portal_ip} --discover
iscsiadm --mode node --targetname ${target} --login

Check iscsi session:

iscsiadm -m session -P 3

Check multipath

# multipath -ll
3300000000a1b0b9c dm-2 StorPool,iSCSI DISK
size=100G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=50 status=active
  |- 10:0:0:0 sdp 8:240 active ready running
  `- 11:0:0:0 sdq 65:0  active ready running

Make sure the block devices are in the same group (under the same ‘policy=’ line).

Verify timeouts

# egrep -H . /sys/block/sdb/device/timeout
/sys/block/sdb/device/timeout:3600
# egrep -H . /sys/class/iscsi_session/*/device/*/iscsi_connection/*/{ping,recv}_tmo
/sys/class/iscsi_session/session5/device/connection5:0/iscsi_connection/connection5:0/ping_tmo:1
/sys/class/iscsi_session/session6/device/connection6:0/iscsi_connection/connection6:0/ping_tmo:1
/sys/class/iscsi_session/session5/device/connection5:0/iscsi_connection/connection5:0/recv_tmo:1
/sys/class/iscsi_session/session6/device/connection6:0/iscsi_connection/connection6:0/recv_tmo:1
# egrep -H . /sys/class/iscsi_session/*/recovery_tmo
/sys/class/iscsi_session/session5/recovery_tmo:0
/sys/class/iscsi_session/session6/recovery_tmo:0
# shall be 'off' if iscsi is used without multipath

Failover and recovery

With multipath configuration and the settings above network interface failover is about 2 seconds.

iSCSI target failover (service storpool_iscsi stop) is about 13 seconds.