iSCSI mit OCFS2 in einer KVM Umgebung

[Update 2008-12-13]:
Das im Folgenden gezeigte Setup ist im produktiven Einsatz nicht nutzbar, da die in Ubuntu Intrepid vorhandene iSCSI-Version derart instabil ist, dass bei einem Test mit bonnie++ gleich 3 von 4 VMs mit einer Kernel-Panic starben. Hoffentlich ist das kommende Release im April nicht noch einmal eine solche Katastrophe!

Nach Stunden an Arbeit habe ich es heute das erste Mal geschafft, iSCSI und OCFS2 einzurichten. Da sowohl das open-iscsi-Paket als auch das ocfs2-tools Paket Fehler in Ubuntu Intrepid enhalten (was soll ich noch sagen zu diesem Release), musste ich wirklich lange nach Lösungen suchen. Letzendlich finden sich wertvolle Hinweise im Bugtracker von Ubuntu.

Dieser Blog-Eintrag ist ein Ultra-Kurz-Mini-Howto und funktioniert genau so bei mir. Sollte sich aber mit Anpassungen auch bei anderen so installieren lassen.

Hier nun die Installation

iSCSI auf der Hostmaschine

Einfach das Paket iscsitarget installieren.

Da ich LVM liebe habe ich eine neue Partition mit ca. 50GB erstellt.

Die Datei ietd.conf enthält bei mir folegende Zeilen:

Target iqn.2008-12.de.roessner-net:storage.disk0.kvm.share
Lun 0 Path=/dev/vg01/lv_kvm_share,Type=fileio

Ich verzichte hier auf Passwörter, etc., denn ich habe das Init-Skript modifiziert und so geändert, dass ich den iscsid an ein internes Interface binden kann. Ich verwende einen vde-Switch als Intranet-Schnittstelle (siehe andere Blogs-Einträge hier).

Die Änderungen im Initscript:

...
18 # Don't touch this "memsize thingy" unless you are blessed
19 # with knowledge about it.
20 MEM_SIZE=1048576
21
22 test -f /etc/default/iscsitarget && . /etc/default/iscsitarget
23
24 configure_memsize()
25 {
...
62 modprobe iscsi_trgt
63 start-stop-daemon --start --exec $DAEMON --quiet -- $DAEMON_OPTS
64 RETVAL=$?
...

Die Zeilennummern dienen hier nur zur Hilfe.

In der Datei /etc/default/iscsitarget befindet sich Folgendes:

DAEMON_OPTS="--address=10.1.0.1"

Damit ist der iscsi-Host-Teil auch schon startklar. Da leider das Paket verbuggt ist, muss man nun den gesamten Server erstmal neu starten. Arme Welt. Was soll´s. Danach läuft der Dienst und kann von den verschiedenen Nodes angesprochen werden.

open-iscsi

Auf jedem Node muss das Paket open-iscsi und ocfs2-tools installiert werden. Beim open-iscsi Paket zuerst mal den Startpunkt des Init-Skripts fixen. Dazu im Verzeichnis /etc/rcS.d Folgendes ausführen:

mv S25open-iscsi S45open-iscsi

Anschließend dieses Skript editieren und Folgendes ans Ende der start()-Funktion ergänzen:

...
86 MOUNT_RESULT=1
87 if mount -a -O _netdev >/dev/null 2>&1; then
88 MOUNT_RESULT=0
89 break
90 fi
91 log_end_msg $MOUNT_RESULT
92 }
...

Dann in der Konfiguration /etc/iscsi/iscsid.conf Folgendes durchführen:

...
27 # To request that the iscsi initd scripts startup a session set to "automatic".
28 node.startup = automatic
29 #
30 # To manually startup the session set to "manual". The default is manual.
31 # node.startup = manual
...

Nun noch Folgende Kommandos absetzen:

iscsiadm -m discovery -tst -p 10.1.0.1 -d3

iscsiadm -m node -T iqn.2008-12.de.roessner-net:storage.disk0.kvm.share -p 10.1.0.1 -l

iscsiadm -m node -T iqn.2008-12.de.roessner-net:storage.disk0.kvm.share -p 10.1.0.1 --op update -n node.conn[0].startup -v automatic

Die Kommandos machen in etwa Folgendes: Erst Scannen, dann Session anmelden, dann Session so markieren, dass sie auch automatisch beim nächsten Bootvorgang wieder eingebunden wird.

Das wiederholt man auf allen Nodes und erhält so ein neues Device. In meinem Falle heißt es /dev/sda. Näheres liefert fdisk -l

Nun kann man auf _einer_ der Nodes eine Partition auf dem iscsi-Device anlegen. Ich habe eine Primärpartition mit vollen 50GB angelegt (nicht formatiert, nur fdisk!).

OCFS2

Es muss zuallererst sichergestellt werden, dass alle Nodes mit IP und passendem Namen in der Datei /etc/hosts eingetragen sind. Hier ein Beispiel:

10.1.0.2 mx0.roessner-net.de mx0
10.1.0.3 db.roessner-net.de db
10.1.0.4 www.roessner-net.de www
10.1.0.5 dns.roessner-net.de dns

Als nächstes muss auf jeder Node die Datei /etc/ocfs2/cluster.conf identisch angelegt werden. Das Verzeichnis existiert nach einer Neuinstallation vorerst nicht. Muss also erst angelegt werden.

Hier die passende Konfigurationsdatei zu obiger hosts Datei:

node:
ip_port = 7777
ip_address = 10.1.0.2
number = 0
name = mx0
cluster = ocfs2

node:
ip_port = 7777
ip_address = 10.1.0.3
number = 1
name = db
cluster = ocfs2

node:
ip_port = 7777
ip_address = 10.1.0.4
number = 2
name = www
cluster = ocfs2

node:
ip_port = 7777
ip_address = 10.1.0.5
number = 3
name = dns
cluster = ocfs2

cluster:
node_count = 4
name = ocfs2

Auch hier hat das Paket wieder einen schlimmen Fehler im Init-Skript. Folgendes bitte in der Datei /etc/init.d/o2cb ändern:

...
87 LOAD_ACTIONS=("load_module configfs"
88 "mount_fs configfs "'$(configfs_path)'
89 "load_module ocfs2_stackglue"
90 "load_module ocfs2_nodemanager"
91 "load_module ocfs2_dlm"
92 "load_module ocfs2_dlmfs"
93 "mount_fs ocfs2_dlmfs /dlm")
...

Ergänzt wurde hier load_module ocfs2_stackglue.

Nun können die Dienste mit invoke-rc.d o2cb restart auf jeder Node neu gestartet werden. Nun inst es auch schon fast vollbracht.

Auf _einer_ Node nun /dev/sda1 (Hier im Beispiel) mit ocfs2 formatieren:

mkfs.ocfs2 /dev/sda1

Das dauerte bei mir etwas.

Ich habe bei mir auf allen Nodes das Verzeichnis /media/share erzeugt und in der fstab Folgendes eingetragen:

/dev/sda1 /media/share ocfs2 defaults,_netdev 0 0

Auf allen Nodes nu mounten. Glücklich-sein. Fertig.

Abschlussbemerkung

Alle Fehler sind schon bekannt und wurden zum Teil auch schon gefixt, werden dann aber wahrscheinlich erst in der kommenden Ubuntu Version Jaunty Wirkung zeigen.