iSCSI
(Link zu dieser Seite als [[QEMU-KVM-Buch/ Speichermedien/ iSCSI]])
Im_Aufbau
[bearbeiten] iSCSI
Das Protokoll iSCSI (internet Small Computer System Interface) ermöglicht die Nutzung des SCSI-Protokolls über TCP. Dabei wird Storage über das Netzwerk angeboten, daß dieser wie eine lokale Festplatte eingebunden werden kann. Im Gegensatz zu den anderen Netzwerkfreigaben, wie zum Beispiel Samba oder NFS, werden bei iSCSI rohe Datenblöcke übertragen. Dadurch ist das Dateisystem des Speichermediums egal. Das Protokoll iSCSI hat nur geringen Overhead. Der iSCSI-Standard sieht den konkurrierenden Zugriff zweier Server auf dieselbe LUN nicht vor. Wie beim SCSI gibt es einen Controller (Initiator), der die Kommunikation steuert. Die Speichermedien (Festplatten, Bandlaufwerke, optische Laufwerke und so weiter) nennt man Target. Mit Linux lässt sich sowohl die Freigabe wie auch das Einhängen von iSCSI-Speicher realisieren. QEMU kann auf iSCSI-Devices direkt zugreifen.
[bearbeiten] iSCSI-Server (Target)
Damit man das Zusammenspiel von QEMU und iSCSI testen kann wird zunächst ein iSCSI-Server (Target) benötigt. In diesem einfachen Beispiel dient ein separater Linux-Server (Debian 64-Bit) mit dem Namen iscsiserver und IP-Adresse 192.168.178.44 als iSCSI-Server (Target). Es wird eine Partition, eine Festplatte, ein Image-Datei, ein Logical Volume oder ein RAID-Device benötigt. Folgende Pakete sind zu installieren.
iscsiserver ~$ sudo apt-get install iscsitarget iscsitarget-dkms open-iscsi
Es müssen diese Kernel-Module geladen sein:
iscsiserver ~$ lsmod | grep iscsi iscsi_tcp 8113 0 libiscsi_tcp 10946 1 iscsi_tcp libiscsi 29302 3 ib_iser,iscsi_tcp,libiscsi_tcp scsi_transport_iscsi 25036 4 ib_iser,iscsi_tcp,libiscsi scsi_mod 126725 9 ib_iser,iscsi_tcp,libiscsi,scsi_transport_iscsi,firewire_sbp2,sg,sd_mod,sr_mod,libata
Das Verzeichnis /sys/class/iscsi_transport darf nicht leer sein.
iscsiserver ~$ ls /sys/class/iscsi_transport iser tcp
In der Datei /etc/default/iscsitarget ist ISCSITARGET_ENABLE=true zu setzen.
# /etc/default/iscsitarget ISCSITARGET_ENABLE=true
In diesem Beispiel dient eine Image-Datei als iSCSI-Storage.
iscsiserver ~$ mkdir /srv/luns iscsiserver ~$ cd /srv/luns iscsiserver ~$ dd if=/dev/zero of=storagelun0 count=0 obs=1 seek=100G
Jedes iSCSI-Target muss einen eindeutigen Namen nach folgenden Muster erhalten:
iqn.yyyy-mm.<reversed domain name>:identifier
- yyyy-mm gibt das Ablaufdatum der Freigabe an.
- <reversed domain name> ist der FQN des Targets rückwärts.
- identifier steht für einen beliebigen Namen
Hier ist der Taget-Name iqn.2036-12.de.example:storage.target0. Der Zugriff erfolgt mit dem User admin und dem Passwort geheim. Die Datei /etc/iet/ietd.conf wird entsprechend angepasst.
# /etc/iet/ietd.conf Target iqn.2036-12.de.example:storage.target0 CHAP Users IncomingUser admin geheim OutgoingUser admin geheim Lun 0 Path=/srv/luns/storagelun0,Type=fileio Alias lun0
Für den ersten Test wird in der Datei /etc/iet/initiators.allow für alle Rechner der Zugriff auf alle Targets erlaubt (ALL ALL). Die Zeile ALL ALL sollte aber nur zum Testen unkommentiert bleiben, da sich sonst jeder Rechner mit dem Target verbinden kann.
/etc/iet/initiators.allow
ALL ALL # iqn.2036-12.de.example:storage.target0 192.168.178.27
Das iSCSI-Taget ist zu starten.
iscsiserver ~$ sudo /etc/init.d/iscsitarget start
Getestet wird die Verfügbarkeit des iSCSI-Targets mit dem Befehl iscsiadm (Paket iscsiadm).
iscsiserver ~$ sudo iscsiadm -m discovery -t st -p localhost 127.0.0.1:3260,1 iqn.2036-12.de.example:storage.target0 ...
Nun loggt man sich per SSH auf dem Rechner ein, der auf das iSCSI-Target zugreifen soll (Initiator). Dieser hat hier die IP-Adresse 192.168.178.27. Für den Zugriff auf das iSCSI-Target wird das Paket open-iscsi benötigt.
Host ~$ sudo apt-get install open-iscsi
In der Datei /etc/iscsi/iscsid.conf ist node.startup = automatic zu setzen.
# /etc/iscsi/iscsid.conf ... node.startup = automatic ...
Man testet die Verfügbarkeit des iSCSI-Targets vom Initiator. In diesem Beispiel hat der iSCSI-Server die IP-Adresse 192.168.178.44.
Host ~$ sudo iscsiadm -m discovery -t st -p 192.168.178.44 192.168.178.44:3260,1 iqn.2036-12.de.example:storage.target0 Host ~$ sudo iscsiadm -m node 192.168.178.44:3260,1 iqn.2036-12.de.example:storage.target0
Mit folgenden Befehlen wird der User und das Passwort für den Zugriff definiert.
Host ~$ iscsiadm -m node --targetname "iqn.2036-12.de.example:storage.target0" --portal "192.168.178.44:3260" \ --op=update --name node.session.auth.authmethod --value=CHAP Host ~$ iscsiadm -m node --targetname "iqn.2036-12.de.example:storage.target0" --portal "192.168.178.44:3260" \ --op=update --name node.session.auth.username --value=admin Host ~$ iscsiadm -m node --targetname "iqn.2036-12.de.example:storage.target0" --portal "192.168.178.44:3260" \ --op=update --name node.session.auth.password --value=geheim
Die Einstellungen dieses Storages-Devices werden in der folgenden Datei gespeichert.
/etc/iscsi/nodes/iqn.2036-12.de.example\:storage.target0/192.168.178.44\,3260\,1/default
Nun loggt man sich ein.
Host ~$ iscsiadm -m node --targetname "iqn.2036-12.de.example:storage.target0" --portal "192.168.178.44:3260" --login Logging in to [iface: default, target: iqn.2036-12.de.example:storage.target0, portal: 192.168.178.44,3260] Login to [iface: default, target: iqn.2036-12.de.example:storage.target0, portal: 192.168.178.44,3260]: successful
Das neue Device wird von fdisk -l angezeigt. Hier ist es /dev/sdb.
Host ~$ fdisk -l
... Disk /dev/sdb: 107.4 GB, 107374182400 bytes 255 heads, 63 sectors/track, 13054 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/sdb doesn't contain a valid partition table
Das Device wird partitnioniert, formatiert und eingebunden (siehe auch http://qemu-buch.de/d/Anhang/_N%C3%BCtzliche_Tools#Partitionierung). Zum Beispiel /dev/sdb:
Host ~$ fdisk /dev/sdb Host ~$ mkfs.ext3 /dev/sdb1 Host ~$ mount /dev/sdb1 /mnt Host ~$ df -h /mnt Filesystem Size Used Avail Use% Mounted on /dev/sdb1 1004M 18M 936M 2% /mnt
[bearbeiten] Verwendung von iSCSI-Devices in QEMU
Es gibt zwei Varianten um iSCSI-Devices in QEMU zu nutzen. Bei der ersten Variante wird das iSCSI-LUN (Logical Unit Number) im Host-System per Mount eingebunden (siehe oben).
Bei der zweiten Variante wird der in QEMU eingebaute iSCSI-Initiator verwendet. Dazu muss QEMU unter Einbindung der Bibliothek libiscsi kompiliert worden sein (--enable-libiscsi). Damit kann QEMU direkt auf eine iSCSI-Resource zugreifen und diese dem Gast-System zur Verfügung stellen. Dabei werden sowohl Festplatten- als auch CD/DVD-Images unterstützt. Die Syntax zur Angabe der iSCSI-LUNs ist folgende:
iscsi://[<username>[:<password>@]]<host>[:<port]/<target-iqn-name>/<lun>
Die Authentifizierung per username/password ist optional und wird nur verwendet, wenn das Ziel die CHAP-Authentifizierung verwendet. In diesem Beispiel erfolgt keine Authentifizierung.
Host ~$ qemu-system-x86_64 --drive file=iscsi://192.168.178.44/iqn.2036-12.de.example:storage.target0/0
In diesem Beispiel erfolgt eine Authentifizierung mit Benutzername admin und Passwort geheim.
Host ~$ qemu-system-x86_64 -drive file=iscsi://admin:geheim@192.168.178.44/iqn.2036-12.de.example:storage.target0/0
In diesem Beispiel werden Benutzername und Passwort mit Environment-Variablen übergeben.
Host ~$ LIBISCSI_CHAP_USERNAME="admin" Host ~$ LIBISCSI_CHAP_PASSWORD="geheim" Host ~$ qemu-system-x86_64 --drive file=iscsi://192.168.178.44/iqn.2036-12.de.example:storage.target0/0