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:
Target:
OS: Debian 9
Softwarepaket: tgt (Linux SCSI target user-space daemon and tools)
IP-Adresse: 192.168.5.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:
Formatieren den neuen Blockgeräts
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…