VirtualBox mit iSCSI auf ZFS (Linux)

Aus UUGRN
Version vom 2. März 2014, 04:35 Uhr von Rabe (Diskussion | Beiträge) (→‎Konfiguration VirtualBox: Datei:Screenshot VirtualBox iSCSI 20140302.png)

Dieser Artikel beschreibt die Nutzung von iSCSI-Targets in VirtualBox (OpenSource). Ziel ist es das Festplatten-Image einer Virtuellen Maschine per iSCSI anzusprechen.

Bestandteile

Server

  • Debian Wheezy
  • zfsonlinux, zpool v28
  • zvol mit 30GB
  • iscsitarget

Client

  • Ubuntu 13.04
  • VirtualBox 4.2.10-dfsg-0ubuntu2.1


Aufbau iSCSI Target

Das iSCSI Target soll ein ZFS-Volume sein. Man könnte der Einfachheit halber auch einfach ein 30GB großes Flatfile nehmen. Wir nehmen ZFS.

ZFS

Wir gehen davon aus, dass der Server mit Debian wheezy installiert ist und bereits zfsonlinux/debian-zfs installiert ist. Wir nehmen ferner an, dass es einen zpool namens "tank" gibt, der ausreichend viel Platz und Performance bietet:

# zpool list
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
tank  5,44T  1,95T  3,48T    35%  1.00x  ONLINE  -
# zpool status
  pool: tank
 state: ONLINE
  scan: scrub repaired 0 in 11h40m with 0 errors on Wed Jan 22 11:25:42 2014
config:

        NAME                              STATE     READ WRITE CKSUM
        tank                              ONLINE       0     0     0
          mirror-0                        ONLINE       0     0     0
            wwn-0x50014ee2b0b4a6c5-part1  ONLINE       0     0     0
            wwn-0x50014ee058e266cd-part1  ONLINE       0     0     0
          mirror-1                        ONLINE       0     0     0
            wwn-0x50014ee25e76e28b-part1  ONLINE       0     0     0
            wwn-0x50014ee209153668-part1  ONLINE       0     0     0

errors: No known data errors
  • Anlegen eines Filesystems mit dem Namen "tank/img". Das dient lediglich der Ordnung:
# zfs create tank/img
  • Anlegen eines 30GB großen zvol mit dem Namen "tank/img/foo"
# zfs create -V 30GB tank/img/foo

Es entsteht nun ein Device /dev/zvol/tank/img/foo welches ein Symlink auf /dev/zd16 ist (in diesem Beispiel):

# ls -la /dev/zvol/tank/img/foo 
lrwxrwxrwx 1 root root 13 Mär  2 04:06 /dev/zvol/tank/img/foo -> ../../../zd16
# ls -la /dev/zd16
brw-rw---T 1 root disk 230, 16 Mär  2 04:06 /dev/zd16

iSCSI

Quelle: [1]

  • Zunächst müssen die Packages iscsitarget und iscsitarget-dkms installiert werden
# apt-get install iscsitarget iscsitarget-dkms
  • Anlegen einer Konfiguration, hier sinngemäß:
# cat /etc/iet/ietd.conf
Target iqn.2014-02.de.sigsys:storage.vbox.foo.disk0
        IncomingUser foo Neiz8eehah3zah5ho9ei
        OutgoingUser foo ShaeKoa8Quei
        MaxRecvDataSegmentLength 65536
        MaxXmitDataSegmentLength 65536
        Lun 0 Path=/dev/zvol/tank/img/foo,Type=blockio
        Alias vboxfoo0

Wichtig ist hier, dass MaxRecvDataSegmentLength und MaxXmitDataSegmentLength auf 65536 gesetzt werden. Nimmt man hier kleinere Werte kann der ganze Server crashen, wenn VirtualBox darauf zugreift.

  • Aktivieren von iscsitarget in
# cat /etc/default/iscsitarget 
ISCSITARGET_ENABLE=true

# ietd options
# See ietd(8) for details
ISCSITARGET_OPTIONS=""
  • iscsitarget neu starten:
# service iscsitarget restart 
Removing iSCSI enterprise target devices: :.
Removing iSCSI enterprise target modules: :.
Starting iSCSI enterprise target service:Mar  2 05:10:26 kellermeister kernel: [ 5041.971210] iSCSI Enterprise Target Software - version 1.4.20.3
Mar  2 05:10:26 kellermeister kernel: [ 5041.971326] iscsi_trgt: Registered io type fileio
Mar  2 05:10:26 kellermeister kernel: [ 5041.971330] iscsi_trgt: Registered io type blockio
Mar  2 05:10:26 kellermeister kernel: [ 5041.971333] iscsi_trgt: Registered io type nullio
.
.

Damit ist der iSCSI-target (Storage Server) fertig eingerichtet. Das ZFS-Volume kann nun mit den ZFS üblichen Methoden verwaltet werden, zB snapshots anlegen und zurückrollen.


Konfiguration VirtualBox

  • Zunächst soll eine VM namens "foo" angelegt werden. Das kann mit dem GUI erfolgen. Dabei wird dann keine Festplatte erzeugt, die Warnung ignorieren wir zunächst.
  • Das GUI hat scheinbar keine Möglichkeit ein iSCSI-Target zu verwalten. Mit dem Commandline Tool "VBoxManage" geht es allerdings und wird dann auch im GUI entsprechend angezeigt:
$ VBoxManage storageattach foo --storagectl "SATA" --port 1 --device 0 --type hdd --medium iscsi --server 192.168.0.20 --target iqn.2014-02.de.sigsys:storage.vbox.foo.disk0 --username foo --password Neiz8eehah3zah5ho9ei

Screenshot von VirtualBox, VM mit iSCSI Disk


Der Rest funktioniert wie gewohnt, zum Beispiel die Installation eines OS per CD-Image.

Performancetest

Ein Ubuntu Server 12.04 im VirtualBox Gast wird installiert, dabei wird bei der Installation LVM verwendet. Die VM hat 2GB RAM, der PC, in dem VirtualBox läuft hat 8GB RAM. Nach der Installation kann mittels dd ein einfacher Performance-Test durchgeführt werden:

$ dd if=/dev/zero of=/tmp/big.8G bs=1024k count=8192

Das Ergebnis liegt hier bei ca 72MBytes/sec. Dabei ist anzumerken, dass der zpool "tank" auf dem iSCSI-Server über 4 Platten verteilt ist (2x Mirror). Erschwerend kommt noch hinzu, dass der Server "nur" ein HP microServer N36L ist, d.h. 1.3GHz CPU. Die Anbindung zwischen PC (VirtualBox) und Server (iSCSI Target) ist GBit über einen einfachen Switch (Latenzen!).

Angesichts der Ausstattung sind 72MBytes/sec lineares Schreiben aus einer VM heraus ganz passabel. YMMV.