ISCSI unter Debian

aus PUG, der Penguin User Group
Wechseln zu: Navigation, Suche

Hinweis

Dieser Teil wurde aus einer Xen Anleitung ausgelagert, daher nicht wundern, dass oft Xen erwähnt wird.

Vorbereitung - ISCSI - Einführung

Um die Xen- eigene Migration zu verwenden, bedarf es in jedem Fall eines gemeinsamen Speicherortes. Dieser könnte auf NFS, od. einem SAN liegen. Da die NFS Variente eher selten anzutreffen ist, kommt in dieser Anleitung die SAN basierte Lösung zum Einsatz.
Da ein richtiges SAN in der Regel mit mehreren tausend Euro zu Buche schlägt, kommt das Preisgünstige ISCSI zum Einatz.
Es erlaubt Festplatten, Partitionen und Volumes, gleich welcher Art (IDE, SCSI, SATA), zu exportieren und Clients als SCSI Gerät zur Verfügung zu stellen.
ISCSI sendet SCSI Protokoll- Befehle über ein herkömmliches TCP/IP Netz und kann damit die vorhandene Infrastruktur nutzen. Mittels VPN lassen sich so schnell (De)Zentrale Speichernetze über das Internet aufbauen.
Damit Speicher im Netz über ISCSI verfügbar gemacht werden kann, bedarf es zweier Komponenten:
  • IET - ISCSI Enterprise Target
Der IET ist ein Daemon, der den Speicher über ISCSI verfügbar macht und entsprechend exportiert. Im ISCSI Jargon wird er Target genannt. Ihn benötigen wir daher auf dem Rechner mit dem Speicher.
Er bildet das Gegenstück zum IET. Auch er ist ein Daemon und seine Aufgabe ist es, den vom IET zur Verfügung gestellten Speicher auf dem Client (dem Xen Dom0 Host) einzubinden. Dieser wird Initiator genannt.

Vorbereitung - ISCSI - Installation - Server

Die nachfolgenden Schritte bedürfen einiger Kompilierarbeit und sollten daher dringend auf einer seperaten Maschine, oder einem virtuellen Gast vorgenommen werden. Denn ansonsten würde unser Wirt nur unnötig mit Ballast beladen werden.
Dieser Teil der Anleitung basiert im wesentlichen auf dem englischen Original und wurde nur übersetzt.
Für Debian (Sid/Etch) und Ubuntu Dapper stehen uns inoffizielle Pakete vom IET für Apt zur Verfügung. Um diese Nutzen zu können, müssen wir Apt einen neuen Server mitgeben:
  • /etc/apt/sources.list
# Für Debian Etch
 deb http://debian.hug.cx/debian/ unstable/

# Für Ubuntu Dapper
 deb http://debian.hug.cx/debian/ dapper/
Je nach Distribution sollte die entsprechende Zeile eingebunden werden und dann die Datenbanl per apt-get update auf den neusten Stand gebracht werden.

IET Kernel Modul

Da mir entsprechende Module benötigen, für IET, müssen wir diese passend zu unserem Kernel installieren:
apt-get install module-assistant debhelper linux-source-2.6.18 dpkg-dev \
kernel-package libncurses-dev libssl-dev linux-headers-2.6.18-4-xen-vserver-686
Wurde ein andere Kernel verwendet, sind entsprechend andere Kernel Headers zu installieren.
Als nächstes entpacken wir die Quellen und installieren, sowie übersetzen wir das Modul für den IET.
cd /usr/src/
tar xjf linux-source-2.6.18.tar.bz2
ln -s linux-source-2.6.18 linux
apt-get install  iscsitarget iscsitarget-source
tar xzf iscsitarget.tar.gz
m-a a-i iscsitarget
Es laufen einige Scripte ab, die das Modul iscsi_trgt.ko übersetzen und als Debian Paket (iscsitarget-module-2.6.18-4-xen-vserver-686...deb) zur Installation bereitstellen.

IET Konfiguration

Damit der Daemon nun weiß, welchen Speicher er zur Verfügung stellen darf, müssen wir ihm dies durch eine Konfigurationsdatei mitteilen:
  • /etc/ietd.conf
Target iqn.2007-05.local.mainframe.rohan:lvm.vm03-disk
        Lun 0 Path=/dev/mapper/daten-vm03--disk,Type=fileio
        IncomingUser vm03 geheim
        Alias vm03-disk

Target iqn.2007-05.local.mainframe.rohan:lvm.vm03-swap
        Lun 0 Path=/dev/mapper/daten-vm03--swap,Type=fileio
        IncomingUser vm03 geheim
        Alias vm03-swap
Wir können an diesem Beispiel sehen, dass wir zwei Speicher Einheiten freigeben. So ein Eintrag baut sich im folgenden auf:
Target iqn.2007-06.local.mainframe.rohan:storage.lvm.vm03-disk
Hier wird der Rechner angegeben, mit einer eindeutigen Zuordnung, der sogennanten IQN (ISCSI Qualified Name), ähnlich der MAC einer Netzwerkkarte. Dies muss in der Regel offiziell beantragt werden, doch im internen Umfeld spielt es keine Rolle.
Sie setzt sich zusammen aus:

iqn.<Datum der Target Aktivierung jjjj-mm>.<rekursiver DNS Name>:[freier String]

Lun 0 Path=/dev/mapper/daten-vm03--disk,Type=fileio
Hier wird dem IETD mitgeteilt, welchen Datenträger er exportieren soll. Wie zu erkennen ist, wurde ein LVM Volume exportiert. Der Type fileio nutzt den Seitenspeicher (Page Cache) zum lesen und kopieren und ist daher in der Regel ein wenig schneller, also die Block Variante, die direkt die Blöcke auf den Datenträger schreibt, ohne Zwischenspeicher (Page Cache).
Laut dieser Mail eignet sich fileio gut zum lesen und schreiben von Blöcken mit weniger als 64k, während blockio besser für 64k und größere Blöcke ist.


IncomingUser vm03 geheim
Hier können wir einen User und ein Kennwort bestimmen, welches benötigt wird, um auf diesen Speicher zugriff zu haben. Die Notations ist
Alias vm03-disk
In der letzten Zeilen können wir einen Alias vergeben, welcher dann von den Clients gesehen wird. Er ist nützlich für die Zuordnung und beugt einer Fehlkonfiguration vor.
Nach dieser Anpassung, können wir den IET Daemon (neu)starten:

rohan:# /etc/init.d/iscsitarget start

Starting iSCSI enterprise target service: succeeded.
Im Syslog finden sich dann folgende Zeilen:
May 30 09:03:38 rohan kernel: iSCSI Enterprise Target Software - version 0.4.13
May 30 09:03:38 rohan kernel: iotype_init(90) register fileio
May 30 09:03:38 rohan kernel: iotype_init(90) register nullio
Da in meinem Fall der Rechner Rohan ebenfalls ein Xen Dom0 Wirt ist, bekommt der Rechner ebenfalls den Initiator, in Form von Open-ISCSI, installiert.

Vorbereitung Open-SCSI - Initiator

Open-SCSI wird unter Etch bereits mitgeliefert uns bedarf nur eines einfachen Aufrufes zur Installation:
apt-get install open-iscsi
Danach stehen folgende Programme zur Verfügung:
  • iscsid - Ist der ISCSI Initiator Daemon
  • iscsiadm - Ist unser Verwaltungstool
Da die Node Verwaltungs- Informationen in einem nicht lesbaren Format abgelegt werden (Berkeley Datenbank), werden alle Parameter bezüglich der einzelnen Nodes, über das iscsiadm Tool verwaltet.

Open-SCSI - Konfiguration

Eine besonders wichtige Datei ist die /etc/initiatorname.iscsi. Sie enthält einen eindeutigen Namen, der in keinem Fall zwei Mal im SAN auftauchen darf. Daher ist es notwendig einen Blick in diese zu werfen:
  • /etc/initiatorname.iscsi
## DO NOT EDIT OR REMOVE THIS FILE!
## If you remove this file, the iSCSI daemon will not start.
## If you change the InitiatorName, existing access control lists
## may reject this initiator.  The InitiatorName must be unique
## for each iSCSI initiator.  Do NOT duplicate iSCSI InitiatorNames.
InitiatorName=iqn.2007-05.local.mainframe.rohan:01-storage-server
Normalerweise ist der letzte Teil nach dem : ein eindeutiger String, wie z.B. 01.189fbf1f2ac1, aber in diesem Fall wurde er ausgetauscht.
Bei der Installation wurde eine Default Konfigurationsdatei angelegt, für den Daemon, welche folgenden Inhalt hat:
  • /etc/iscsid.conf
node.active_cnx = 1
node.startup = manual
#node.session.auth.username = dima
#node.session.auth.password = aloha
node.session.timeo.replacement_timeout = 120
node.session.err_timeo.abort_timeout = 10
node.session.err_timeo.reset_timeout = 30
node.session.iscsi.InitialR2T = No
node.session.iscsi.ImmediateData = Yes
node.session.iscsi.FirstBurstLength = 262144
node.session.iscsi.MaxBurstLength = 16776192
node.session.iscsi.DefaultTime2Wait = 0
node.session.iscsi.DefaultTime2Retain = 0
node.session.iscsi.MaxConnections = 0
node.conn[0].iscsi.HeaderDigest = None
node.conn[0].iscsi.DataDigest = None
node.conn[0].iscsi.MaxRecvDataSegmentLength = 65536
#discovery.sendtargets.auth.authmethod = CHAP
#discovery.sendtargets.auth.username = dima
#discovery.sendtargets.auth.password = aloha
Bis auf Benutzername und Passwort sollten die Werte belassen werden, es sei dann, man weiß, woran man dreht.
Um zu überprüfen, ob unsere IET Konfiguration erfolgreich lief, können wir mit dem iscsiadm entsprechend das System scannen:
rohan:~# iscsiadm -m discovery -t st -p 192.168.1.2
192.168.1.2:3260,1 iqn.2007-06.local.mainframe.rohan:lvm.vm03-disk
192.168.1.2:3260,1 iqn.2007-06.local.mainframe.rohan:lvm.vm03-swap
Hier können wir erkennen, das uns der Rechner zwei Datenspeicher anbietet. Über die IQN Nummer können wir die Datenträger zuordnen.
Nach dem absetzen des Befehls, wurden automatisch Dateien erstellt, welche sich unterhalb von /etc/iscsi/nodes/ und /etc/iscsi/send_targets befinden. Darin enthalten sind die Informationen des jeweiligen iSCSI Target und dessen Speicherfreigaben.
Diese Informationen können wir z.B. über folgenden Befehl abfragen:
iscsiadm --mode node --targetname iqn.2007-05.local.mainframe.rohan:lvm.vm03-disk --portal 192.168.1.2
iscsiadm --mode node --targetname iqn.2007-05.local.mainframe.rohan:lvm.vm03-swap --portal 192.168.1.2
Danach stellen sich folgende Werte für z.B. lvm.vm03-disk da:
node.name = iqn.2007-05.local.mainframe.rohan:lvm.vm03-disk
node.transport_name = tcp
node.tpgt = 1
node.active_conn = 1
node.startup = manual
node.session.initial_cmdsn = 0
node.session.auth.authmethod = None
node.session.auth.username = <empty>
node.session.auth.password = <empty>
node.session.auth.username_in = <empty>
node.session.auth.password_in = <empty>
node.session.timeo.replacement_timeout = 120
node.session.err_timeo.abort_timeout = 10
node.session.err_timeo.reset_timeout = 30
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 = 0
node.session.iscsi.MaxConnections = 1
node.session.iscsi.MaxOutstandingR2T = 1
node.session.iscsi.ERL = 0
node.conn[0].address = 192.168.3.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.active_timeout = 5
node.conn[0].timeo.idle_timeout = 60
node.conn[0].timeo.ping_timeout = 5
node.conn[0].timeo.noop_out_interval = 0
node.conn[0].timeo.noop_out_timeout = 0
node.conn[0].iscsi.MaxRecvDataSegmentLength = 131072
node.conn[0].iscsi.HeaderDigest = None,CRC32C
node.conn[0].iscsi.DataDigest = None
node.conn[0].iscsi.IFMarker = No
node.conn[0].iscsi.OFMarker = No
Wie wir erkennen können, ist der Wert node.startup = manual auf Handbetrieb gestellt. Um diesen auf Automatik umstellen zu können, bedarf es folgenden Befehls:
iscsiadm -m node -T iqn.2007-05.local.mainframe.rohan:lvm.vm03-disk -o update -n node.conn[0].startup -v automatic -p 192.168.1.2
iscsiadm -m node -T iqn.2007-05.local.mainframe.rohan:lvm.vm03-swap -o update -n node.conn[0].startup -v automatic -p 192.168.1.2

Nach einem erneuten überprüfen, sehen wir den Wert von node.conn[0].startup = auf automatic stehen. Damit sollte beim erneuten Start des Initiators Open-ISCSI, die Speicher lokal eingebunden werden.
Möchten wir, dass dieser Modus automatisch eingetragen wird, müssen wir in der /etc/iscsid.conf den Wert node.conn[0].startup = automatic eintragen.
Für einen manuellen Login bzw. Verbinden, reicht es einfach, wenn wir folgendes eingeben:
iscsiadm -m node -T iqn.2007-05.local.mainframe.rohan:lvm.vm03-disk -p 192.168.1.2 -l
iscsiadm -m node -T iqn.2007-05.local.mainframe.rohan:lvm.vm03-swap -p 192.168.1.2 -l
Nun können wir uns mittels dmesg davon überzeugen, dass neue SCSI Geräte eingebunden worden sind.
Möchten wir eine solche Verbindung eines Speichers trennen, reicht folgender Befehl:
iscsiadm -m node -T iqn.2007-05.local.mainframe.rohan:lvm.vm03-disk -p 192.168.1.2 -u
iscsiadm -m node -T iqn.2007-05.local.mainframe.rohan:lvm.vm03-swap -p 192.168.1.2 -u