iSCSI steht für "internet Small Computer System Interface" und von der Funktionsweise kann es sich wie SCSI nur über ein TCP/IP Netzwerk vorgestellt werden. Ein Vorteil gegenüber Netzwerkprotokollen wie NFS oder Samba ist, dass es als blockorientiertes Gerät auf dem Ziel Computer zur Verfügung steht und somit wie eine eingebaute Festplatte angesprochen werden kann. Im folgenden wird beschrieben, wie es unter Ubuntu 10.04 eingerichtet wird.
Allgemein
Als Target wird der Host bezeichnet, auf dem die physische Festplatte oder ein Bandlaufwerk zur Verfügung gestellt wird. Im Gegenzug dazu wird der Host, der die zur Verfügung gestellte Festplatte einbindet und die Kommunikation steuert Initiator genannt.
In den folgenden Abschnitten wird zwischen den beiden Hosts unterschieden. Diese haben folgende Eigenschaften.
- Target: target.example.org/10.0.0.1
- Initiator: initiator.example.org/10.0.0.2
Zunächst wird der Host eingerichtet, der als Target agieren soll und anschließend der, der als Initiator dient.
Einrichtung: Target
Bevor mit der Konfiguration begonnen werden kann muss das Paket "iscsitarget" installiert werden. Dies kann wie folgt geschehen:
$ sudo apt-get install iscsitarget
Anschließend muss die Datei /etc/default/iscsitarget bearbeitet und dabei ISCSITARGET_ENABLE auf den Wert "true" gesetzt werden. Die sieht dann wie folgt aus:
ISCSITARGET_ENABLE=true
Als physikalischer Speicher wird ein RAID Verbund mit dem Namen /dev/md3 verwendet. Um diesen Speicher per iSCSI zur Verfügung zustellen, muss die Datei /etc/ietd.conf bearbeitet werden. Wurde die Datei noch nicht bearbeitet sind in ihr einige Beispiel zur Konfiguration gegeben, die meisten dieser Einstellungen sollten standardmäßig auskommentiert sein und bieten erfahrenen Benutzern die Möglichkeit zum Feintuning. Die Datei kann mit den wichtigsten Einstellungen um einen beachtlichen Anteil gekürzt werden und sieht dann in etwas so aus:
Target iqn.2010-11.org.example.target:storage.example
Lun 0 Path=/dev/md3,Type=fileio
Achtung: Der Zugang ist im Moment noch nicht durch ein Passwort gesichert. Dies sollte jedoch unbedingt geschehen. Wie dies geht wird später beschrieben.
Der Name des Target muss eindeutig sein. Dafür wird vom iSCSI Standard der so genannte "iSCSI Qualified Name" kurz iqn verwendet. Dieser wird wie folgt definiert: "iqn.yyyy-mm.<reversed domain name>[:identifier]". Dabei steht yyyy-mm für das Jahr und den Monat, typischerweise wird hier das Datum der Erstellung verwendet. "<reversed domain name>" ist wie der Name schon sagt, der umgekehrte Domainnahme. Zum Schluss kann noch ein Identifier kommen.
Anschließend muss dem Initiator noch der Zugriff gewehrt werden. Dies wird erreicht, indem er in die Datei /etc/initiators.allow eingetragen wird. Für Testzwecke können Verbindungen von allen Initiatorn erlaubt werden. Dies wird erreicht, indem die Datei wie folgt angepasst wird.
ALL ALL
Achtung: Für eine höhere Sicherheit im produktiv Betrieb ist es natürlich besser den Initiator direkt einzutragen. Dies könnte dann wie folgt aussehen
iqn.2010-11.org.example.target:storage.example 10.0.0.2
Jetzt kann der Dienst neu gestartet werden:
$ sudo service iscsitarget restart
Einrichtung: Initiator
Auf dem Initiator muss das Paket open-iscsi installiert werden. Dies kann wie folgt geschehen.
$ sudo apt-get install open-iscsi
Damit beim nächsten Startvorgang die iSCSI Geräte automatisch gestartet werden, bietet es sich an den Wert node.startup in der Datei /etc/iscsi/iscsid.conf auf automatic zusetzen. Dies sieht dann wie folgt aus.
...
node.startup = automatic
...
Anschließend kann der Dienst wie folgt neu gestartet werden:
$ sudo service open-iscsi restart
Jetzt kann mit dem Einbinden der eigentlichen iSCSI-Geräte begonnen werden. Dazu muss zunächst ein Discover(Entdecken) durchgeführt werden. Hier für wird das Programm iscsiadm wie folgt aufgerufen und führt zu einer der hier dargestellten sehr ähnlichen Ausgabe
$ sudo iscsiadm -m discovery -t st -p 10.0.0.1
10.0.0.1:3260,1 iqn.2010-11.org.example.target:storage.example
Anschließend kann die Verbdinung mit dem Target aufgebaut werden. Achtung: Dies funktioniert nur, wenn vorher das Discover das entsprechende iSCSI-Gerät erkannt hat.
$ sudo iscsiadm -m node --targetname "iqn.2010-11.org.example.target:storage.example" --portal "10.0.0.1:3260" --login
Logging in to [iface: default, target: iqn.2010-11.org.example.target:storage.example, portal: 10.0.0.1,3260]
Login to [iface: default, target: iqn.2010-11.org.example.target:storage.example, portal: 10.0.0.1,3260]: successful
Achtung: Wird ein Nutzername und ein Passwort verwendet, dann müssen noch ein paar Schritte mehr ausgeführt werden. Dazu jedoch später mehr.
Ob der Vorgang erfolgreich war kann zum Beispiel über den Befehl dmesg nachgeprüft werden. Die Ausgabe sieht dann wie folgt aus. Festzustellen ist, dass es ein neues Gerät sdd gibt, auf dem jedoch noch keine Partitionstabelle vorhanden ist.
$ dmesg
[963549.167983] scsi8 : iSCSI Initiator over TCP/IP
[963549.429181] scsi 8:0:0:0: Direct-Access IET VIRTUAL-DISK 0 PQ: 0 ANSI: 4
[963549.429482] sd 8:0:0:0: Attached scsi generic sg3 type 0
[963549.432327] sd 8:0:0:0: [sdd] 3770487296 512-byte logical blocks: (1.93 TB/1.75 TiB)
[963549.432794] sd 8:0:0:0: [sdd] Write Protect is off
[963549.433620] sd 8:0:0:0: [sdd] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[963549.434834] sdd: unknown partition table
[963549.438440] sd 8:0:0:0: [sdd] Attached SCSI disk
Wird statt dem Parameter "--login" der Parameter "--logout" verwendet, wird sich wieder vom iSCSI Target abgemeldet. Dies sieht dann so oder so ähnlich aus.
$ sudo iscsiadm -m node --targetname "iqn.2010-11.org.example.target:storage.example" --portal "10.0.0.1:3260" --logout
Partitionierung
Bevor die über iSCSI auf dem Initiator eingebundene Festplatte verwendet werden kann muss sie vom Initiator aus partitioniert werden. Dazu kann zum Beispiel über die Konsole das Programm fdisk oder über die grafische Oberfläche das Programm gparted verwendet werden.
Mit gparted kann auch gleich das Dateisystem auf den/der Partition(en) erzeugt werden. Bei der Verwendung von fdisk ist dazu anschließend noch ein Tool wie mkfs.ext4 notwendig. Mit fdisk und mkfs.ext4 könnte der Vorgang wie folgt aussehen.
$ sudo fdisk /dev/sdd
[...]
Befehl (m für Hilfe): n <--
[..]
Befehl Aktion
e Erweiterte
p Primäre Partition (1-4)
p <--
Partitionsnummer (1-4): 1 <--
[... Angabe der Größe ...]
Befehl (m für Hilfe): t <--
Partitionsnummer (1-4): 1 <--
Hex code (L um eine Liste anzuzeigen): 83 <--
Befehl (m für Hilfe): w <--
Anschließend muss dass Dateisystem erzeugt werden.
$ sudo mkfs.ext4 /dev/sdd1
Ist dies alles geschafft kann die neue Partition eingebunden werden.
$ sudo mount /dev/sdd1 /mnt
Anschließend kann die eingebundene Festplatte wie eine im Computer eingebaute verwendet werden.
Sicherheit
Die Frage zu den richtigen Sicherheitsmaßnamen lässt sich immer nur schwer beantworten. Es ist wie immer natürlich auch von der jeweiligen Struktur des Netzwerks und anderen Faktoren abhängig.
Es bietet sich aber auf jeden Fall an ein Passwort zu verwenden. Hier zu muss die Datei /etc/ietd.conf auf dem Target wie folgt erweitert werden.
Target iqn.2010-11.org.example.target:storage.example
Lun 0 Path=/dev/md3,Type=fileio
IncomingUser nutzer passwort
Anschließend muss der Dienst neu gestartet werden. Dies kann mit folgendem Befehl geschehen:
$ sudo service iscsitarget restart
Anschließend muss der Nutzername und das Passwort auch auf dem Initiator eingetragen werden. Dazu wird beim Login wie folgt vorgegangen:
$ sudo iscsiadm -m node --targetname "iqn.2010-11.org.example.target:storage.example" --portal "10.0.0.1:3260" --op=update --name node.session.auth.authmethod --value=CHAP
$ sudo iscsiadm -m node --targetname "iqn.2010-11.org.example.target:storage.example" --portal "10.0.0.1:3260" --op=update --name node.session.auth.username --value=nutzer
$ sudo iscsiadm -m node --targetname "iqn.2010-11.org.example.target:storage.example" --portal "10.0.0.1:3260" --op=update --name node.session.auth.password --value=passwort
$ sudo iscsiadm -m node --targetname "iqn.2010-11.org.example.target:storage.example" --portal "10.0.0.1:3260" --login
Neben dem "IncomingUser" kann auch ein "OutgoingUser" festgelegt werden. Neben diesen Techniken können natürlich noch weitere zum Einsatz kommen. Vorstellbar wären zum Beispiel noch VLANs oder IPsec.
Links
- iSCSI auf Wikipedia (deutsch)
- Linux-iSCSI Project auf sourceforge.net
- The Linux Enterprise Target Project auf sourceforge.net (englisch)
- IPsec auf Wikipedia (deutsch)
- VLAN auf Wikipedia (deutsch)