iSCSI
iSCSI ist mittlerweile eine ernsthafte Alternative zu Fibre Channel Storage Lösungen. Während Fibre Channel teure Spezial-Komponenten benötigt, baut der iSCSI Standard auf Standardtechnologien auf. Einfach gesprochen werden dabei SCSI Kommandos und Daten in IP Pakete verpackt und über herkömmliche Netzwerkkomponenten zwischen iSCSI-Client (Initiator) und iSCSI-Server (Target) versandt.
Es gibt eine ganze Reihe von iSCSI Implementierungen für Linux, jedoch mit sehr unterschiedlichem Implementationsstand. Die folgenden Tests beziehen sich auf die folgenden Pakete (mit SuSE-Patches):
- Target:
iscsitarget - Initiator:
linux-iscsi
Bislang ist nur ein kleiner Teilbereich des Standards implementiert, vor allem die Authentifizierung ist noch weitestgehend unbrauchbar. Dennoch bieten die Software-Pakete einen recht guten Einblick in die Welt von iSCSI und werden aktiv weiterentwickelt.
Target
Die Software für den iSCSI Target Treiber muss man sich selbst übersetzen und installieren. Die Treiber funktionieren auch nur mit Linux Kernel Version 2.6.13 oder größer.
Die Konfiguration der Targets wir in der Datei /etc/ietd.conf vorgenommen. Eine minimale Konfiguration, die so aussehen könnte:
... Target iqn.2001-04.com.example:storage.disk1.sys1.xyz Lun 0 Path=/dev/md1,Type=fileio Alias Raid ...
target ~> /usr/sbin/ietd -f -d 10 -c /etc/ietd.conf
Genauere Informationen kann man dem Logfile entnehmen:
... kernel: iSCSI Enterprise Target Software - version 0.4.11 kernel: iotype_init(90) register fileio kernel: iotype_init(90) register nullio ...
Für die Authentifizierung zwischen Target und Initiator können in der Datei /etc/ietd.conf Passwörter vergeben werden. Dabei ist darauf zu achten, dass diese 12 Zeichen lang sein müssen. Bei der Passwortvergabe ist zwischen folgenden Möglichkeiten zu unterscheiden:
- Authentifizierung des Initiator während des Suchen nach Targets (Discovery). Mehrere Usernames und Passwörter können gesetzt werden. Wurde kein Passwort gesetzt, ist jeder Initiator berechtigt ein Discovery durchzuführen. (IncomingUser username password)
- Authentifizierung des Target zum Initiator während des Suchen nach Targets (Discovery). Nur ein Usernames und Passwort kann gesetzt werden. (OutgoingUser username password)
- Authentifizierung des Initiator zu genau diesem Target. (IncomingUser username password)
- Authentifizierung genau dieses Targets zum Initiator. (OutgoingUser username password)
Beispiel:
... IncomingUser username password // Während Discovery OutgoingUser username password // Während Discovery ... Target iqn.2001-04.com.example:storage.disk1.sys1.xyz Lun 0 Path=/dev/md1,Type=fileio IncomingUser username password // Während verbinden zu diesem Target OutgoingUser username password // Während verbinden zu diesem Target Alias Raid ...
Nach dieser Konfiguration kann der der iSCSI-Target gestartet werden:
target ~> /etc/init.d/iscsitarget start Starting iSCSI target service: done
Initiator
Bei aktuellen SuSE Distributionen ist der Initiator bereits enthalten. Seine Konfiguration wird in der Datei /etc/iscsid.conf abgelegt und sieht (im einfachsten Fall) so aus:
#TargetName = iqn.2001-04.com.example:storage.disk2.sys1.xyz DiscoveryAddress = 192.168.1.51
Letztendlich wird nur die IP Adresse der iSCSI-Gegenstelle festgelegt.
Nach dieser Konfiguration kann der der iSCSI-Initiator gestartet werden:
initiator ~> /etc/init.d/open-iscsi start Starting iSCSI initiator service: done
Falls auf dem Target Passwörter gesetzt wurden, müssen die selben auch auf dem Initiator gesetzt werden. Als erstes die für die Authentifizierung des Initiator und des Targets zum Initiator während des Suchen nach Targets (Discovery) in der Datei /etc/iscsid.conf :
... DiscoveryAddress = 192.168.1.51 discovery.sendtargets.auth.authmethod = CHAP discovery.sendtargets.auth.username = username discovery.sendtargets.auth.password = password ...
Nun können die Passwörter für die einzelnen Targets gesetzt werden. Dazu muss vorher aber ein Discovery durchgeführt
werden, um die nötige Record ID herauszufinden, die in Eckigen Klammern steht. Dies ist in dem Modus discovery
möglich, der mit der Option -m (Mode) angegeben wird. Weitere nötige Optionen sind -tst
(Type sendtarget) und -p (portal) mit der IP-Adresse des Targets.
!! Ein Discovery sollte man nur einmal durchführen bzw. nicht mehr durchführen, nachdem man die Passwörter
gesetzt hat, denn damit werden alle Konfigurationen wieder in den Urzustand versetzt !!
initiator ~> iscsiadm -m discovery -tst -p 192.168.1.51 [a58bfa] 192.168.1.51,1 iqn.2001-04.com.example:storage.disk1.sys1.xyz
Jetzt können die Passwörter für die Authentifizierung des Initiator zu genau diesem Target bzw. die Authentifizierung genau dieses Targets zum Initiator gesetzt werden. Dies geschiet über die Komandozeile in dem Modus node, der mit der Option -m (Mode) angegeben wird. Weitere nötige Optionen sind -r (Record) mit der entsprechenden Record ID, -o update (operation), -n node.session.auth.username (Name des entsprechenden Eintrags in der Konfigurationsdatei) und -v (value) mit dem ensprechenden Wert, d.h. dem entsprechenden Username bzw. Passwort.
initiator ~> iscsiadm -m node -r recordID -o update -n node.session.auth.username -v username initiator ~> iscsiadm -m node -r recordID -o update -n node.session.auth.password -v password
Nun kann auch das automatische Verbinden mit den Targets konfiguriert werden:
initiator ~> iscsiadm -m node -r recordID -o update -n node.startup -v automatic
Nach einem Neustart des iSCSI-Initiator Services erkennt und verbindet sich der Initiator automatisch mit den Targets. Die erkannten Targets erscheinen dann als SCSI Laufwerke - genauere Informationen kann man dem System-Log entnehmen:
... kernel: iSCSI: 4.0.188.26 ( 21-May-2004) built for Linux 2.6.5-7.244-smp kernel: iSCSI: will translate deferred sense to current sense on disk command responses kernel: iSCSI: control device major number 254 kernel: scsi0 : SFNet iSCSI driver kernel: iSCSI:detected HBA host #0 iscsid[8052]: version 4.0.188.26 ( 21-May-2004) kernel: iSCSI: bus 0 target 0 = iqn.2001-04.com.example:storage.disk1.sys1.xyz kernel: iSCSI: bus 0 target 0 portal 0 = address 192.168.1.51 port 3260 group 1 kernel: iSCSI: starting timer thread at 624972997 kernel: iSCSI: bus 0 target 0 trying to establish session to portal 0, address 192.168.1.51 port 3260 gro kernel: iSCSI: bus 0 target 0 established session #1, portal 0, address 192.168.1.51 port 3260 group 1 kernel: Vendor: IET Model: VIRTUAL-DISK Rev: 0 kernel: Type: Direct-Access ANSI SCSI revision: 04 kernel: SCSI device sda: 20971520 512-byte hdwr sectors (10737 MB) kernel: SCSI device sda: drive cache: write back kernel: sda: unknown partition table kernel: Attached scsi disk sda at scsi0, channel 0, id 0, lun 0 kernel: Attached scsi generic sg0 at scsi0, channel 0, id 0, lun 0, type 0 /etc/hotplug/block.agent[8071]: new block device /block/sda ...
Beim Deaktivieren des iSCSI Initiators wird die Verbindung zum Target getrennt:
... /etc/hotplug/block.agent[9530]: waiting for /var/lock/block.agent.lock, process 9533 holds it kernel: iSCSI: driver shutdown killing timer 8065 kernel: iSCSI: driver shutdown waiting for timer to terminate kernel: iSCSI: driver shutdown complete at 629344812 kernel: iSCSI: releasing HBA host #0 ...
Tests
Schreibgeschwindigkeit des Targets auf sein Target:
target ~> dd if=/dev/zero of=/dev/md1 bs=1M count=46080 46080+0 records in 46080+0 records out 48318382080 bytes (48 GB) copied, 737.498 seconds, 65.5 MB/s
Lesegeschwindigkeit des Targets von seinem Target:
target ~> dd if=/dev/iscsi-space/lvol1 of=/dev/null bs=1M count=46080 46080+0 records in 46080+0 records out 48318382080 bytes (48 GB) copied, 548.493 seconds, 88.1 MB/s
Schreibgeschwindigkeit via iSCSI:
initiator ~> dd if=/dev/zero of=/dev/sda bs=1M count=46080 | netcat 192.168.1.51 3260 46080+0 records in 46080+0 records out 48318382080 bytes (48 GB) copied, 906.514 seconds, 53.3 MB/s
Gegenüberstellung der Befehle der Software mit und der ohne SuSE-Patches
Discovery: mit SuSE-Patches: initiator ~> iscsiadm -m discovery -tst -p 192.168.1.51 [a58bfa] 192.168.1.51,1 iqn.2001-04.com.example:storage.disk1.sys1.xyz Discovery: ohne SuSE-Patches: initiator ~> iscsiadm -m discovery -tst -p 192.168.1.51 192.168.1.51:3260,1 iqn.2001-04.com.example:storage.disk1.sys1.xyz Passwörter: mit SuSE-Patches: initiator ~> iscsiadm -m node -r recordID -o update -n node.session.auth.username -v username -n node.session.auth.password -v password Passwörter: ohne SuSE-Patches: initiator ~> iscsiadm -m node --target iqn.2001-04.com.example:storage.disk1.sys1.xyz -p 192.168.1.51 -o update -n node.session.auth.username -v username -p 192.168.1.51 -o update -n node.session.auth.password -v password



