iSCSI praktisch einrichten

Allgemeines

Die Erfolgsgeschichte von SCSI im Zusammenhang mit Festpatten, Scannern und „usb-storage“ setzt sich via TCP/IP fort.

Siehe dazu auch https://www.computerweekly.com/de/tipp/So-erstellen-Sie-ein-redundantes-SAN-Netzwerk-mit-iSCSI

RECHECHE: iscsi performance

So kann es je nach vorliegender Umgebung vorkommen, dass NFS performanter ist. Insbesondere wenn Virtualisierung via Hyper-V, VMware oder kvm im Spiel ist.

ZIELSTELLUNG: Der als Client agierende Initiator soll über ein lokales Blockgerät Zugriff auf ein entferntes Volume des als Server fungierenden Targets erhalten. Als Target (= Storage anbietender Server) kann z.B. auch ein leichtgewichtiger Docker-Container herhalten.

Software

Unter Debian 9 wurde das Paket ‚iscsitarget‘ aus den Repos entfernt (was die Datei /etc/iet/ietd.conf beinhaltet), dafür gibt es aber ‚tgt‘ (Linux SCSI target user-space daemon and tools). Das Paket ‚open-iscsi‘ (iSCSI initiator tools) existiert weiterhin (es beinhaltet das Kommando ‚iscsiadm‘ und die Datei /etc/iscsi/iscsid.conf).

Zur praxtischen Umsetzung siehe auch:

Konfiguration unter Debian und CentOS (Kurzfassung)

Target (= Server)

Diese Maschine habe die IP-Adresse 192.168.5.1, wogegen der entfernte Initiator mit der Adresse 192.168.5.100 ausgestattet sei.

Zuerst beginnen wir mit der Serverkomponente, die ein Festplattenabbild namens disk01.img freigeben soll. In der neu anzulegenden Datei /etc/tgt/conf.d/target01.conf wird neben einem eindeutigen IQN das freizugebende Disk-Image, die IP-Adresse des Initiators sowie als beispielhafter Benutzername blafasel mitsamt Passwort 1234567 hinterlegt:

root@deb9:~ # apt-get install tgt
root@deb9:~ # mkdir /var/lib/iscsi_disks
root@deb9:~ # dd if=/dev/zero of=/var/lib/iscsi_disks/disk01.img count=0 bs=1 seek=10G
root@deb9:~ #
root@deb9:~ # ## Konfig erstellen, ihr Inhalt sieht schließlich so aus:
root@deb9:~ # grep -v '\s*#\|^$' /etc/tgt/conf.d/target01.conf
<target iqn.2017-06.world.srv:target01>
    backing-store /var/lib/iscsi_disks/disk01.img
    initiator-address 192.168.5.100
    incominguser blafasel 1234567
</target>
root@deb9:~ # systemctl restart tgt
root@deb9:~ # tgtadm --mode target --op show

Initiator/Client (CentOS 6):

[root@cent6 ~]# yum install iscsi-initiator-utils
[root@cent6 ~]#
[root@cent6 ~]# vi /etc/iscsi/iscsid.conf
[root@cent6 ~]#
[root@cent6 ~]# ### Die Ãnderung betrifft dabei folgende Einstellungen:
[root@cent6 ~]# #    node.session.auth.authmethod = CHAP
[root@cent6 ~]# #    node.session.auth.username = blafasel
[root@cent6 ~]# #    node.session.auth.password = 1234567
[root@cent6 ~]#
[root@cent6 ~]#
[root@cent6 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.5.1
iscsid starten:                                            [  OK  ]
192.168.5.1:3260,1 iqn.2017-06.world.srv:target01
[root@cent6 ~]#
[root@cent6 ~]# iscsiadm -m node -o show
...
[root@cent6 ~]#
[root@cent6 ~]# iscsiadm -m node --login
Logging in to [iface: default, target: iqn.2017-06.world.srv:target01, portal: 192.168.5.1,3260] (multiple)
Login to [iface: default, target: iqn.2017-06.world.srv:target01, portal: 192.168.5.1,3260] successful.
[root@cent6 ~]#
[root@cent6 ~]# iscsiadm -m session -o show
tcp: [1] 192.168.5.1:3260,1 iqn.2017-06.world.srv:target01 (non-flash)
[root@cent6 ~]#
[root@cent6 ~]# # Erfolgskontrolle:  dmesg | tail -20
[root@cent6 ~]# lsblk
=> neues Gerät: /dev/sdb

Initiator-Konfiguration für Debian (automatic login)

In diesem Szenario wollen wir den automatischen Login gleich zu Beginn aktivieren, um das Volume auch später automatisch mounten zu können.

Wir gehen davon aus, dass die Target-Maschine (= Server) erfolgreich installiert und konfiguriert wurde (siehe oben).

Nach dem Ausführen von apt-get install open-iscsi kann es ans Konfigurieren der iscsid.conf gehen; im Endfeffekt sieht die Datei so aus:

root@d10:~# grep -v '^#\|^$' /etc/iscsi/iscsid.conf | nl
    1       iscsid.startup = /sbin/iscsid
    2       node.startup = automatic
    3       node.leading_login = No
    4       node.session.auth.authmethod = CHAP
    5       node.session.auth.username = blafasel
    6       node.session.auth.password = 1234567
    7       node.session.timeo.replacement_timeout = 120
    8       node.conn[0].timeo.login_timeout = 15
    9       node.conn[0].timeo.logout_timeout = 15
    10      node.conn[0].timeo.noop_out_interval = 5
    11      node.conn[0].timeo.noop_out_timeout = 5
    12      node.session.err_timeo.abort_timeout = 15
    13      node.session.err_timeo.lu_reset_timeout = 30
    14      node.session.err_timeo.tgt_reset_timeout = 30
    15      node.session.initial_login_retry_max = 8
    16      node.session.cmds_max = 128
    17      node.session.queue_depth = 32
    18      node.session.xmit_thread_priority = -20
    19      node.session.iscsi.InitialR2T = No
    20      node.session.iscsi.ImmediateData = Yes
    21      node.session.iscsi.FirstBurstLength = 262144
    22      node.session.iscsi.MaxBurstLength = 16776192
    23      node.conn[0].iscsi.MaxRecvDataSegmentLength = 262144
    24      node.conn[0].iscsi.MaxXmitDataSegmentLength = 0
    25      discovery.sendtargets.iscsi.MaxRecvDataSegmentLength = 32768
    26      node.session.nr_sessions = 1
    27      node.session.iscsi.FastAbort = Yes
root@d10:~#

Die Änderungen betreffen hierbei 4 Zeilen (die Zeilennummern entsprechen der eben dargestellten Ausgabe mit Hilfe von ‚nl‘):

  • Zeile 2: am besten gleich auf „automatic“ setzen

  • Zeile 4: muss nur einkommentiert werden

  • Zeile 5: gemäß der target-Config zu ändern

  • Zeile 6: gemäß der target-Config zu ändern

Nach der Target-Erkennung suchen wir nach neuen/geänderten Dateien und finden die eigentlich verwendete Datei default:

root@d10:~ # iscsiadm -m discovery -t sendtargets -p 192.168.2.234
192.168.2.234:3260,1 iqn.2021-04.tld.domain:target01
root@d10:~ #
root@d10:~ # find /etc/ -cmin 1
/etc/iscsi
/etc/iscsi/nodes
/etc/iscsi/nodes/iqn.2021-04.tld.domain:target01
/etc/iscsi/nodes/iqn.2021-04.tld.domain:target01/192.168.2.234,3260,1
/etc/iscsi/nodes/iqn.2021-04.tld.domain:target01/192.168.2.234,3260,1/default
/etc/iscsi/send_targets
/etc/iscsi/send_targets/192.168.2.234,3260
/etc/iscsi/send_targets/192.168.2.234,3260/st_config
/etc/iscsi/send_targets/192.168.2.234,3260/iqn.2021-04.tld.domain:target01,192.168.2.234,3260,1,default
root@d10:~ #
root@d10:~ #
root@d10:~ # cat /etc/iscsi/nodes/iqn.2021-04.tld.domain\:target01/192.168.2.234\,3260\,1/default | grep node.startup
node.startup = automatic
root@d10:~ #
root@d10:~ # ##     >> Jetzt steht gleich "automatic" drin, was uns ein späteres '-op update' erspart.   :-)

Zur Kontrolle des Bisherigen:

root@d10:~ # iscsiadm -m node -o show | head -7
# BEGIN RECORD 2.0-874
node.name = iqn.2021-04.tld.domain:target01
node.tpgt = 1
node.startup = automatic
node.leading_login = No
iface.hwaddress = <empty>
iface.ipaddress = <empty>
root@d10:~ #

Das auf dem Target freigegebene Disk-Image nutzen zu können bedeutet, ein neues Blockgerät zu erhalten. Hier soll es beispielhaft /dev/sdb sein:

root@d10:~ # lsblk /dev/sdb
lsblk: /dev/sdb: not a block device
root@d10:~ #
root@d10:~ # systemctl restart iscsid iscsi
root@d10:~ #
root@d10:~ # lsblk /dev/sdb
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  10G  0 disk
└─sdb1   8:17   0  10G  0 part
root@d10:~ #
root@d10:~ # ##   >> Anstelle des manuellen Logins mit 'iscsiadm -m node --login' reicht der Neustart der beiden
root@d10:~ # ##   Daemons aus (in etwa: 'reboot').

Fehlt nur noch das automatische Mounten via fstab - dabei bitte in Spalte 4 auf die erforderlichen Optionen _netdev,auto,sync acht geben:

root@d10:~ # echo '/dev/sdb1  /vol/target1  ext4  _netdev,auto,sync  0  0' >> /etc/fstab
root@d10:~ #
root@d10:~ # nl /etc/fstab
    1       # /etc/fstab: static file system information.
    2       #
    3       # Use 'blkid' to print the universally unique identifier for a
    4       # device; this may be used with UUID= as a more robust way to name devices
    5       # that works even if disks are added and removed. See fstab(5).
    6       #
    7       # <file system> <mount point>   <type>  <options>       <dump>  <pass>
    8       # / was on /dev/sda1 during installation
    9       UUID=2e691d02-aa52-4a3d-ab4d-11d6d58007b7 /               ext4    errors=remount-ro 0       1
    10      # swap was on /dev/sda5 during installation
    11      UUID=887516e0-5b6e-4690-8543-a8137f1e9000 none            swap    sw              0       0
    12      /dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0

    13      /dev/sdb1  /vol/target1  ext4  _netdev,auto,sync  0  0
root@d10:~ #
root@d10:~ # ##   >> Zeile 13 ist neu hinzugekommen
root@d10:~ #
root@d10:~ # mkdir -p /vol/target1
root@d10:~ #
root@d10:~ # init 6

...

root@d10:~ # df -h /vol/target1/
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sdb1       9,8G    118M  9,2G    2% /vol/target1
root@d10:~ #
root@d10:~ # ##   >> Hurraaaaaa :-)

Have a lot of fun…

Konfiguration mittels zweier Debian-Systeme (Ausführliche Variante)

Umsetzung:

  1. Target:

  • OS: Debian 9

  • Softwarepaket: tgt (Linux SCSI target user-space daemon and tools)

  • IP-Adresse: 192.168.5.1

  1. Initiator:

  • OS: Debian 10

  • Softwarepaket: open-iscsi (Werkzeuge für iSCSI-Clients)

  • IP-Adresse: 192.168.5.100

Zu 1) - Target

Nach der Installation des erforderlichen Pakets mittels apt-get install tgt geht es so weiter:

root@deb9:~ # whatis tgtadm
tgtadm (8)           - Linux SCSI Target Administration Utility
root@deb9:~ #
root@deb9:~ # # => https://pemmann.de/cc/Doc/Testbed/vm-deb9-router-lxc-srv.html
root@deb9:~ #
root@deb9:~ # mkdir /var/lib/iscsi_disks
root@deb9:~ # dd if=/dev/zero of=/var/lib/iscsi_disks/disk01.img count=0 bs=1 seek=10G
0+0 Datensätze ein
0+0 Datensätze aus
0 Bytes kopiert, 0,000759171 s, 0,0 kB/s
root@deb9:~ #
root@deb9:~ # ls -lsh /var/lib/iscsi_disks/disk01.img
0 -rw-r--r-- 1 root root 10G Aug 29 11:46 /var/lib/iscsi_disks/disk01.img
root@deb9:~ #
root@deb9:~ # vi /etc/tgt/conf.d/target01.conf
root@deb9:~ #
root@deb9:~ # cat /etc/tgt/conf.d/target01.conf
<target iqn.2019-09.ip.speedport:target01>
    backing-store /var/lib/iscsi_disks/disk01.img
    initiator-address 192.168.5.100
    incominguser blafasel 1234567
</target>
root@deb9:~ #
root@deb9:~ # systemctl restart tgt
root@deb9:~ #
root@deb9:~ # tgtadm --mode target --op show
Target 1: iqn.2019-09.ip.speedport:target01
    System information:
        Driver: iscsi
        State: ready
    I_T nexus information:
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: IET     00010000
            SCSI SN: beaf10
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            SWP: No
            Thin-provisioning: No
            Backing store type: null
            Backing store path: None
            Backing store flags:
        LUN: 1
            Type: disk
            SCSI ID: IET     00010001
            SCSI SN: beaf11
            Size: 10737 MB, Block size: 512
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            SWP: No
            Thin-provisioning: No
            Backing store type: rdwr
            Backing store path: /var/lib/iscsi_disks/disk01.img
            Backing store flags:
    Account information:
        blafasel
    ACL information:
        192.168.5.100
root@deb9:~ #
root@deb9:~ #

Zu 2) - Initiator

Nach der Installation des erforderlichen Pakets mittels apt-get install open-iscsi geht es hier so weiter:

root@deb10:~ # vi /etc/iscsi/iscsid.conf
root@deb10:~ #
root@deb10:~ # ## Die Änderung betraf die folgenden 3 Zeilen:
root@deb10:~ # grep -A2 '^node.session.auth.authmethod' /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = blafasel
node.session.auth.password = 1234567
root@deb10:~ #
root@deb10:~ #
root@deb10:~ # ## Auf Entdeckerfahrt gehen:
root@deb10:~ #  iscsiadm -m discovery -t sendtargets -p 192.168.5.1
192.168.5.1:3260,1 iqn.2019-09.ip.speedport:target01
root@deb10:~ #
root@deb10:~ # ## Detailinfos über diesen entdeckten Knoten ausgeben:
root@deb10:~ # iscsiadm -m node -o show | head -7
# BEGIN RECORD 2.0-874
node.name = iqn.2019-09.ip.speedport:target01
node.tpgt = 1
node.startup = manual
node.leading_login = No
iface.hwaddress = <empty>
iface.ipaddress = <empty>
root@deb10:~ #
root@deb10:~ # ## Mit dem abschließenden Login wird auf dieser Maschine ein neues Blockgerät erstellt:
root@deb10:~ # iscsiadm -m node --login
Logging in to [iface: default, target: iqn.2019-09.ip.speedport:target01, portal: 192.168.5.1,3260] (multiple)
Login to [iface: default, target: iqn.2019-09.ip.speedport:target01, portal: 192.168.5.1,3260] successful.
root@deb10:~ #

Wie es weitergeht, ist altbekannt:

  1. Formatieren den neuen Blockgeräts

  2. Mounten…

root@deb10:~ # ## Zu a)
root@deb10:~ # apt install ntfs-3g parted
root@deb10:~ #
root@deb10:~ # parted -s /dev/sdd -- mklabel msdos mkpart primary 8 100%
root@deb10:~ #
root@deb10:~ # lsblk /dev/sdd
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdd      8:48   0  10G  0 disk
└─sdd1   8:49   0  10G  0 part
root@deb10:~ #
root@deb10:~ # mkntfs -f /dev/sdd1
Cluster size has been automatically set to 4096 bytes.
Creating NTFS volume structures.
mkntfs completed successfully. Have a nice day.
root@deb10:~ #
root@deb10:~ # ## zu b)
root@deb10:~ # mount /dev/sdd1 /mnt
root@deb10:~ #
root@deb10:~ # df -h /mnt
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sdd1        10G     52M   10G    1% /mnt
12:34:50 559 buster ~ #
12:34:50 559 buster ~ # findmnt /mnt
TARGET SOURCE    FSTYPE  OPTIONS
/mnt   /dev/sdd1 fuseblk rw,relatime,user_id=0,group_id=0,allow_other,blksize=4096
root@deb10:~ #
root@deb10:~ #  ##  >> Ziemlich intransparent!
root@deb10:~ #
root@deb10:~ # dmesg | grep sdd
[23843.975124] sd 5:0:0:1: [sdd] 20971520 512-byte logical blocks: (10.7 GB/10.0 GiB)
[23843.975126] sd 5:0:0:1: [sdd] 4096-byte physical blocks
[23843.975375] sd 5:0:0:1: [sdd] Write Protect is off
[23843.975376] sd 5:0:0:1: [sdd] Mode Sense: 69 00 10 08
[23843.977250] sd 5:0:0:1: [sdd] Write cache: enabled, read cache: enabled, supports DPO and FUA
[23843.994996] sd 5:0:0:1: [sdd] Attached SCSI disk
[24553.454546]  sdd: sdd1
root@deb10:~ #
root@deb10:~ # ##   >>> 'dmesg' kann Klarheit schaffen.  :-)

Um den Loginprozess zu automatisieren:

root@deb10:~ # grep -i auto /etc/iscsi/iscsid.conf
# To request that the iscsi initd scripts startup a session set to "automatic".
# node.startup = automatic
# For "automatic" startup nodes, setting this to "Yes" will try logins on each
root@deb10:~ #
root@deb10:~ #
root@deb10:~ # ## Zeile 40 aktivieren, Zeile 43 deaktivieren:
root@deb10:~ # vi /etc/iscsi/iscsid.conf
root@deb10:~ # grep '^node.startup' /etc/iscsi/iscsid.conf
node.startup = automatic
root@deb10:~ #
root@deb10:~ # systemctl restart open-iscsi.service
root@deb10:~ #
root@deb10:~ # mkdir /media/store10
root@deb10:~ #
root@deb10:~ # ## fstab-Eintrag erzeugen; wichtig fürs automatische Mounten ist vor allem '_netdev':
root@deb10:~ # echo '/dev/sdd1  /media/store10  ntfs-3g  _netdev,auto,sync  0  0' >> /etc/fstab

Automatischer Login des Initiators

Es reicht offenbar nicht aus, in der Datei /etc/iscsi/iscsid.conf die Direktive node.startup = automatic zu setzen und beim Mounten in der Optionsspalte der /etc/fstab _netdev,auto zu verwenden.

Nach www.linuxclustering.net ist zusätzlich diese Zeile erforderlich:

iscsiadm -m node -T iqn.2019-09.ip.speedport:target01 -p 192.168.5.1 --op update -n node.startup -v automatic

Insgesamt sieht das Ganze so aus:

root@deb10:~ # lsblk /dev/sdd
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdd      8:48   0  10G  0 disk
└─sdd1   8:49   0   3G  0 part
root@deb10:~ #
root@deb10:~ # iscsiadm -m node --logout
Logging out of session [sid: 5, target: iqn.2019-09.ip.speedport:target01, portal: 192.168.5.1,3260]
Logout of [sid: 5, target: iqn.2019-09.ip.speedport:target01, portal: 192.168.5.1,3260] successful.
root@deb10:~ #
root@deb10:~ #
root@deb10:~ # lsblk /dev/sdd
lsblk: /dev/sdd: not a block device
root@deb10:~ #
root@deb10:~ #
root@deb10:~ # iscsiadm -m node -T iqn.2019-09.ip.speedport:target01 -p 192.168.5.1 --login
Logging in to [iface: default, target: iqn.2019-09.ip.speedport:target01, portal: 192.168.5.1,3260] (multiple)
Login to [iface: default, target: iqn.2019-09.ip.speedport:target01, portal: 192.168.5.1,3260] successful.
root@deb10:~ #
root@deb10:~ #
root@deb10:~ # iscsiadm -m node -T iqn.2019-09.ip.speedport:target01 -p 192.168.5.1 --op update -n node.startup -v automatic
root@deb10:~ # echo $?
0
root@deb10:~ #
root@deb10:~ # iscsiadm -m session
tcp: [6] 192.168.5.1:3260,1 iqn.2019-09.ip.speedport:target01 (non-flash)
root@deb10:~ #
root@deb10:~ # lsblk /dev/sdd
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdd      8:48   0  10G  0 disk
└─sdd1   8:49   0   3G  0 part
root@deb10:~ #
root@deb10:~ # systemctl restart open-iscsi
root@deb10:~ #
root@deb10:~ # lsblk /dev/sdd
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdd      8:48   0  10G  0 disk
└─sdd1   8:49   0   3G  0 part
root@deb10:~ #
root@deb10:~ # ##   >> Wundervoll: Mit diesem "restart" erfolgte auch schon der automatische Re-Login.

Auch nach einem kompletten Neustart, ist alles in bester Ordnung:

root@deb10:~ # grep ntfs /etc/fstab
/dev/sdd1  /media/store10  ntfs-3g  _netdev,auto,sync 0 0
root@deb10:~ #
root@deb10:~ # findmnt /media/store10
TARGET         SOURCE    FSTYPE  OPTIONS
/media/store10 /dev/sdd1 fuseblk rw,relatime,sync,user_id=0,group_id=0,allow_other,blksize=4096
root@deb10:~ #

Windows 7 als Initiator

Zur Einrichtung siehe https://gilsmethod.com/how-to-connect-to-a-target-with-iscsi-initiator-in-windows-7

Testweise kann die für den Linux-Initiator verwendete Config verwendet werden. Vereinfachend kann man dabei auf ACLs und Authentifizierung verzichten. Dazu kommentieren wir auf dem Target zwei Zeilen aus:

root@deb9:~ # cat /etc/tgt/conf.d/target01.conf
<target iqn.2019-09.ip.speedport:target01>
    backing-store /var/lib/iscsi_disks/disk01.img
    #initiator-address 192.168.5.100
    #incominguser blafasel 1234567
</target>
root@deb9:~ #
root@deb9:~ # systemctl restart tgt

Zur Problematik „Kein File-Locking durch iSCSI“ siehe https://www.windowspro.de/wolfgang-sommergut/iscsi-target-mehreren-hosts-verbinden

Have ‚a lot of fun…