User Tools

Site Tools


it-artikel:linux:iscsi-iscsi-enterprise-target-iet-und-open-iscsi

This is an old revision of the document!


iSCSI - iSCSI Enterprise Target (iet) und Open-iSCSI

Was ist iSCSI?

iSCSI (internet Small Computer System Interface) ist im Prinzip eine über das Netzwerk gesprochene klassische SCSI Schnittstelle. Es nutzt TCP/IP als Transportmedium und ermöglicht es uns Speichergeräte oder einfach auch nur “Speicher” (Storage) über das Netzwerk zur Verfügung zu stellen. iSCSI kann dabei praktisch von allen gängigen Betriebssystemen genutzt werden. Entsprechende Software gibt es kostenlos aus dem Internet.

Es ist dabei zu beachten dass in vielen Fällen zwischen Software zur Erzeugung von Targets und zwischen Initiatoren unterschieden wird. d.H. Oft kann ein Softwarepaket nur eines von beiden Komponenten abdecken. Für Linux verwenden wir die Software-Pakete “iSCSI Enterprise Target” und “Open-iSCSI”.

Wichtige Begriffe

iSCSI TargetDamit ist das iSCSI Endgerät oder Speichermedium gemeint. Also z.B. ein Bandlaufwerk oder eine Festplatte bzw Partition/Volume. Targets können auch per Software dem Netz zur Verfügung gestellt werden. NAS und Storage Server bieten oft ihren Speicherplatz als iSCSI Target an.
iSCSI InitiatorInitiiert Verbindungen - Entsprechend könnte man dazu auch iSCSI Controller, iSCSI Interface oder Hostbusadapter (HBA) sagen. Ein Initiator greift auf Targets zu und nutzt ihren Speicher. Dieser wird dann dem lokalen Betriebssystem als wäre es ein “lokales SCSI Laufwerk” dargestellt.
iSCSI Enterprise TargetDas IET ermöglicht uns das bereitstellen von iSCSI Targets, also Speicher oder Geräten im Netzwerk. Es besteht aus zwei Teilen: Den “iSCSI Enterprise Target userland tools” (iscsitarget) und den Kernel spezifischen Kernelmodulen (z.B. iscsitarget-modules-2.6.26-2-amd64)
open-iscsi“iSCSI Initiator over TCP transport for Linux kernel” - Es ist also die Initiator Komponente um auf iSCSI Targets zugreifen und diese für das lokale Betriebssystem nutzbar zu machen.
iqn iSCSI qualified name - Ist der Name bzw die Adresse eines iSCSI Targets. z.B.:
iqn.2009-04.aok:lvm.vg1.lv-aokfs-homes.ext3
der Aufbau sieht die folgt aus:
iSCSI Address Form:     
   The following are examples of iSCSI qualified names that might be
   generated by "EXAMPLE Storage Arrays, Inc."

                     Naming     String defined by
        Type  Date    Auth      "example.com" naming authority
       +--++-----+ +---------+ +--------------------------------+
       |  ||     | |         | |                                |

       iqn.2001-04.com.example:storage:diskarrays-sn-a8675309
       iqn.2001-04.com.example
       iqn.2001-04.com.example:storage.tape1.sys1.xyz
       iqn.2001-04.com.example:storage.disk2.sys1.xyz

Die hinter dem Doppelpunkt stehende Zeichenkette ist beliebig Wählbar. Sie sollte möglichst aussagekräftig sein, darf aber auch komplett weggelassen werden.

Node Begriff ist nicht eindeutig definiert. Zum einen ist damit das Target selbst, zum anderen das Portal gemeint. Im Allgemeinen wird damit einfach ein Target, Portal oder Initiator innerhalb einer iSCSI Verkettung gemeint.
Portal Als Portal wird oft ein laufender TCPIP Dienst auf einem beliebigen Host bezeichnet welcher dem Netzwerk einen oder mehrere “Targets” zur Verfügung stellt. Targets werden also stets über Portale gefunden und adressiert.

IET (iSCSI Enterprise Target)

Voraussetzungen

Um Geräte , Festplatten, Partitionen oder Volumes für das Netzwerk freigeben zu können müssen diese natürlich bereits vorhanden sein. d.H. wir benötigen auf dem Host direkten Zugriff auf deren Gerätedatei unter /dev . z.B. eine physikalische Partition /dev/sda7 oder auch ein logisches LVM2 Volume /dev/vg1/lv-aokfs-data1 . Es spielt dabei noch keine Rolle ob der Speicher auf dem Gerät bereits partitioniert wurde oder sich bereits ein Dateisystem darauf befindet. Das Gerät mit samt seinem Inhalt wird 1:1 dem Client zur Verfügung gestellt. Dieser muss also am Ende in der Lage sein evtl vorhandene Partitionen oder Filesysteme lesen zu können.

Es ist sogar möglich anstatt Gerätedateien ganz normale Dateien (Files) einer zuvor festgelegten Größe zu verwenden. Diese werden später auf der Client Seite als “leere” Festplatte angezeigt, können Partitioniert und beschrieben werden als wäre es eine lokale SCSI Festplatte.

WICHTIG: Es ist besonders wichtig dass sichergestellt wird dass jeweils NUR EIN INITIATOR zu einem Zeitpunkt eine Verbindung zu einem iSCSI Target aufrecht erhält. Dies gilt insbesondere bei Festplatten bzw Partitionen, da es sonst leicht zu Datenkorruption bzw defekten im Filesystem kommen kann. Ausnahmen sind bei Verwendung von Cluster-Fähigen Filesystemen möglich. Aus diesen Gründen sollte die Anzahl der maximal zulässigen Verbindungen pro Target sicherheitshalber auf 1 gestellt werden.

Installation + Konfiguration

ACHTUNG: Es werden Kernel abhängige Kernelmodule benötigt. Diese muss man entsprechend seines eingesetzten Kernels installieren.

  1. Geben Sie folgendes zur Installation ein:
    aptitude install iscsitarget iscsitarget-modules-`uname -r`
  2. Editieren Sie nun die Datei /etc/default/iscsitarget und ändern Sie den Eintrag entsprechend auf TRUE
    ISCSITARGET_ENABLE=true
  3. Definieren Sie nun Ihre Targets in der Datei /etc/ietd.conf z.B. folgendermaßen:
    ######################################################################################
    
    Target iqn.2009-04.aok:lvm.vg1.lv-aokfs-homes.ext3
            #IncomingUser loginname password - Zur Authentifizierung am Target, damit nicht jeder darauf zugreifen darf
            IncomingUser aok iSCSI
            Lun 1 Path=/dev/vg1/lv-aokfs-homes,Type=fileio
            Alias aokfs-homes
            MaxConnections         1
    
    ######################################################################################
  4. Einschränken der Zugriffe auf die einzelnen Targets per IP Adresse ist über die datei /etc/initiators.allow möglich. Erstellen Sie dort Einträge in folgender Form:
    # /etc/initiators.allow ##########################
    # Some examples
    #
    #iqn.2001-04.com.example:storage.disk1.sys1.xyz 192.168.22.2, 192.168.3.8
    #iqn.2001-04.com.example:storage.disk1.sys2.xyz [3ffe:302:11:1:211:43ff:fe31:5ae2], [3ffe:505:2:1::]/64
    #iqn.2001-04.com.example:storage.disk1.sys3.xyz ALL
    #iqn.2001-04.com.example:storage.disk1.sys4.xyz 192.168.22.3
    #ALL 192.168.22.4
    
    #################################
    #Target IP, IP, NETAddr/NetMask
    #ALL 127.0.0.1, 10.230.20.0/24
    iqn.2009-04.aok:lvm.vg1.lv-aokfs-homes.ext3 127.0.0.1, 172.16.194.0/24
    iqn.2009-04.aok:lvm.vg1.lv-aokfs-data1.ext3 127.0.0.1, 172.16.194.0/24
  5. Starten Sie nun den IET Dienst neu durch Eingabe von:
    /etc/init.d/iscsitarget restart
  6. Die Targets sind nun fertig eingerichtet und stehen dem Netz nun zur Verfügung.

Open-iSCSI Initiator

Voraussetzungen

Es wird davon ausgegangen dass uns bereits im Netz entsprechende Targets zur Verfügung stehen und uns auch die IP Adressen sowie die iSCSI Zugangsdaten (Target Authentication) vorliegen.

Installation + Konfiguration

  1. Geben Sie folgendes zur Installation ein:
    aptitude install open-iscsi
  2. Editieren Sie anschließend die Datei /etc/iscsi/iscsid.conf und ändern Sie den folgenden Eintrag entsprechend. Hiermit legen Sie fest dass Verbindungen zu iSCSI Targets beim Systemstart automatisch verbunden werden sollen:
    ...
    node.startup = automatic
    ...
  3. Starten Sie nun den Initiator Dienst neu durch eingabe von:
    /etc/init.d/open-iscsi restart
  4. Geben Sie folgendes ein um “Portale” in Ihrer Umgebung zu finden. Dieser Punkt ist optional und ist nicht zwingend notwendig:
    iscsiadm -m discovery
  5. Lassen Sie sich alle verfügbaren Targes eines Portals anzeigen in dem wir einen DISCOVERY durchführen. Geben sie folgendes ein:
    iscsiadm -m discovery -t st -p 192.168.0.101

    -t st steht hierbei für Discovery-Typ “Send Targets”. Die IP Adresse entspricht der Adresse eines Portals.

  6. Für jeden Knoten/Target der uns hierdurch bekannt wird, wird automatisch eine “Node” Datei (bzw Verzeichniss) unter /etc/iscsi/nodes/ angelegt. Über diese Verzeichnisse und den Dateiinhalt kann man nun z.B. erkennen über welches Portal ein Target erreichbar ist und auch welche Einstellungen zu einem bestimmten Target vorliegen. Siehe folgendes Beispiel:
    hostname:/etc/iscsi/nodes# ls -laR "iqn.2009-04.aok:lvm.vg1.lv-aokfs-data1.ext3/"
    iqn.2009-04.aok:lvm.vg1.lv-aokfs-data1.ext3/:
    total 12
    drw------- 3 root root 4096 2009-04-20 15:22 .
    drw------- 4 root root 4096 2009-04-20 15:22 ..
    drw------- 2 root root 4096 2009-04-20 15:22 172.16.194.1,3260,1
    
    iqn.2009-04.aok:lvm.vg1.lv-aokfs-data1.ext3/172.16.194.1,3260,1:
    total 12
    drw------- 2 root root 4096 2009-04-20 15:22 .
    drw------- 3 root root 4096 2009-04-20 15:22 ..
    -rw------- 1 root root 1666 2009-04-20 15:26 default
    hostname:/etc/iscsi/nodes#

    Die Datei “default” enthält die dem Initiator bekannten Konfiguration/Einstellungen des Targets. z.B. auch die Zugangsdaten welche benötigt werden um auf ein Target zugreifen zu können. Hier ein Beispiel einer solche “default” Datei:

    node.name = iqn.2009-04.aok:lvm.vg1.lv-aokfs-homes.ext3
    node.tpgt = 1
    node.startup = automatic
    iface.hwaddress = default
    iface.iscsi_ifacename = default
    iface.net_ifacename = default
    iface.transport_name = tcp
    node.discovery_address = 172.16.194.1
    node.discovery_port = 3260
    node.discovery_type = send_targets
    node.session.initial_cmdsn = 0
    node.session.initial_login_retry_max = 8
    node.session.cmds_max = 128
    node.session.queue_depth = 32
    node.session.auth.authmethod = CHAP
    node.session.auth.username = aok
    node.session.auth.password = iSCSI
    node.session.timeo.replacement_timeout = 120
    node.session.err_timeo.abort_timeout = 15
    node.session.err_timeo.lu_reset_timeout = 20
    node.session.err_timeo.host_reset_timeout = 60
    node.session.iscsi.FastAbort = Yes
    node.session.iscsi.InitialR2T = No
    node.session.iscsi.ImmediateData = Yes
    node.session.iscsi.FirstBurstLength = 262144
    node.session.iscsi.MaxBurstLength = 16776192
    node.session.iscsi.DefaultTime2Retain = 0
    node.session.iscsi.DefaultTime2Wait = 2
    node.session.iscsi.MaxConnections = 1
    node.session.iscsi.MaxOutstandingR2T = 1
    node.session.iscsi.ERL = 0
    node.conn[0].address = 172.16.194.1
    node.conn[0].port = 3260
    node.conn[0].startup = manual
    node.conn[0].tcp.window_size = 524288
    node.conn[0].tcp.type_of_service = 0
    node.conn[0].timeo.logout_timeout = 15
    node.conn[0].timeo.login_timeout = 15
    node.conn[0].timeo.auth_timeout = 45
    node.conn[0].timeo.noop_out_interval = 5
    node.conn[0].timeo.noop_out_timeout = 5
    node.conn[0].iscsi.MaxRecvDataSegmentLength = 131072
    node.conn[0].iscsi.HeaderDigest = None
    node.conn[0].iscsi.DataDigest = None
    node.conn[0].iscsi.IFMarker = No
    node.conn[0].iscsi.OFMarker = No
  7. Wir müssen nun an diesen Node-Einträgen noch einige Änderungen vornehmen damit wir auf unsere Targets zugreifen können. z.B. sind im Normalfall die Zugangsdaten für das Target noch nicht hinterlegt. Um diese Änderungen an dem Knoten vorzunehmen verwenden wir allerdings KEINEN TEXTEDITOR, sondern das dem Softwarepaket beiliegende Tool iscsiadm. Es handelt sich dabei praktisch um eine Art “Client/Server” Betrieb. Ein “Server” nämlich den Open-iSCSI Daemon wird durch iscsiadm angewiesen die gewünschten Änderungen für uns vorzunehmen. Geben Sie z.B. folgendes ein um die Authentifizierungseinstellungen vorzunehmen:
    iscsiadm -m node --targetname "iqn.2009-04.aok:lvm.vg1.lv-aokfs-homes.ext3" --portal "172.16.194.1:3260" --op=update --name node.session.auth.authmethod --value=CHAP
    iscsiadm -m node --targetname "iqn.2009-04.aok:lvm.vg1.lv-aokfs-homes.ext3" --portal "172.16.194.1:3260" --op=update --name node.session.auth.username --value=aok
    iscsiadm -m node --targetname "iqn.2009-04.aok:lvm.vg1.lv-aokfs-homes.ext3" --portal "172.16.194.1:3260" --op=update --name node.session.auth.password --value=iSCSI
  8. Die Knoten sind nun fertig eingerichtet. Nun müssen wir uns nur noch bei den Targets einloggen. Dies geschieht entweder durch neustart des Open-iSCSI Dienstes (da wir unter Punkt 2 den automatischen Start verlangt haben) oder durch manuelle Eingabe von:
    iscsiadm -m node --targetname "iqn.2009-04.aok:lvm.vg1.lv-aokfs-homes.ext3" --portal "172.16.194.1:3260" --login

    bzw

    /etc/init.d//open-iscsi restart
  9. Nun müssten Sie eigentlich entsprechend der Anzahl Ihrer eingerichteten Targets unterhalb von /dev neue SCSI Gerätedateien vorfinden. Sie können auch folgendes eingeben um sich eine Liste der bekannten Harddisks und Partitionen zu verschaffen:
    fdisk -l

    oder

    parted -l
  10. Das einbinden der iSCSI Laufwerke ist hiermit erledigt. Diese neuen Laufwerke können nun wie gewöhnliche SCSI Laufwerke behandelt werden. Man kann diese Partitionieren, Formatieren und mounten. Doch beachten Sie bitte folgendes…

WARNUNG - Beachten Sie folgendes

Es ist durchaus möglich auf der Seite der Targets anstatt physikalische Geräte auch einzelne Partitionen oder logische Volumes (LVM2) als Target freizugeben. Solche “Volumes” enthalten oft keine Partitionstabellen, demnach auch keine Partitionen oder sind bereits mit einem Dateisystem ausgestattet, wurden also bereits Formatiert. Dennoch werden diese “Objekte” auf der Seite des Initiators immer nur als ganz normale SCSI Geräte (HDs) angezeigt. Es kann also nicht mehr unterschieden werden ob es sich hierbei ursprünglich um eine HD, eine Partition oder ein einfaches File handelte.

Das führt dazu das manche Programme beim Zugriff auf solche “SCSI Laufwerke” glauben dass diese Laufwerke keine gültigen Partitionstabellen, Partitionen oder Filesysteme enthält. Denken Sie einfach immer daran: iSCSI leitet das was Sie auf der Target-Seite eingeben 1:1 an den Initiator weiter. d.h. Was auf der einen Seite angeschlossen wurde wird auf der anderen Seite auch sichtbar. Nur sieht das darumherum etwas anders aus. Selbstverständlich können Sie unter Linux dieses SCSI Device auch ohne enthaltene Partitionstabelle etc ganz normal mounten und bearbeiten.

Wie Sie diese Tatsachen nicht beachten könnte es passieren dass Sie eine bereits formatierte und mit Daten bestückte Partition oder LVM-Volume vom Client (vom Initiator) aus überschreiben und wichtige Daten vernichten.

Tipps zum Schluss

  • Wenn Sie iSCSI Devices beim starten Ihrer Linux Box automatisch mounten lassen sollen können Sie diese auch in die /etc/fstab eintragen. Siehe Beispiel:
    # iSCSI Eintraege (manuell)
    /dev/disk/by-path/ip-172.16.194.1:3260-iscsi-iqn.2009-04.aok:lvm.vg1.lv-aokfs-homes.ext3-lun-1  /home           ext3    defaults,auto,_netdev0 0
    /dev/disk/by-path/ip-172.16.194.1:3260-iscsi-iqn.2009-04.aok:lvm.vg1.lv-aokfs-data1.ext3-lun-0  /aokfs-data1    ext3    defaults,auto,_netdev0 0

    Achten Sie dabei auf die letzten beiden Werte 0 0. Wenn Sie an dieser Stelle etwas anderes als 0 eintragen wird Linux beim nächsten Bootvorgang versuchen ein FSCheck durchzuführen und wird damit scheitern, da zu diesem Zeitpunkt des Bootvorgangs noch keine iSCSI Devices verbunden sind.

MfG — Axel Werner 2009-04-21 17:45

it-artikel/linux/iscsi-iscsi-enterprise-target-iet-und-open-iscsi.1661949019.txt.gz · Last modified: 2022-08-31 12:30 by 127.0.0.1