ISCSI unter Debian
Inhaltsverzeichnis
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.
- Open-ISCSI - ISCSI Client
- 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