.. _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...