.. _iscsi-praktisch:
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:
* https://www.tecmint.com/setup-iscsi-target-and-initiator-on-debian-9/
* https://www.server-world.info/en/note?os=CentOS_6&p=iscsi&f=2
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:
.. highlight:: shell-session
::
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
backing-store /var/lib/iscsi_disks/disk01.img
initiator-address 192.168.5.100
incominguser blafasel 1234567
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 =
iface.ipaddress =
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 #
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
2) 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
backing-store /var/lib/iscsi_disks/disk01.img
initiator-address 192.168.5.100
incominguser blafasel 1234567
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 =
iface.ipaddress =
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:
a) Formatieren den neuen Blockgeräts
b) 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
backing-store /var/lib/iscsi_disks/disk01.img
#initiator-address 192.168.5.100
#incominguser blafasel 1234567
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...