VirtualBox mit iSCSI auf ZFS (Linux)

Aus UUGRN

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

Bestandteile[Bearbeiten]

Server[Bearbeiten]

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

Client[Bearbeiten]

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


Aufbau iSCSI Target[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

  • 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[Bearbeiten]

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.

1. Test[Bearbeiten]

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.

2. Test: Snapshot+Rollback[Bearbeiten]

In der VM
rabe@foo:~$ dd if=/dev/zero of=/var/tmp/big.8G bs=1024k count=8192
8192+0 Datensätze ein
8192+0 Datensätze aus
8589934592 Bytes (8,6 GB) kopiert, 165,985 s, 51,8 MB/s
Auf dem Server
# zpool iostat -v 10
[…]
                                     capacity     operations    bandwidth
pool                              alloc   free   read  write   read  write
--------------------------------  -----  -----  -----  -----  -----  -----
tank                              1,95T  3,48T     54  6,62K  71,5K  51,7M
  mirror                          1,90T   836G     28    407  34,7K  2,58M
    wwn-0x50014ee2b0b4a6c5-part1      -      -     12     80  52,7K  2,85M
    wwn-0x50014ee058e266cd-part1      -      -     15     84  62,7K  3,10M
  mirror                          52,6G  2,67T     26  6,23K  36,9K  49,1M
    wwn-0x50014ee25e76e28b-part1      -      -     14    429  58,7K  49,4M
    wwn-0x50014ee209153668-part1      -      -     12    424  50,7K  48,8M
--------------------------------  -----  -----  -----  -----  -----  -----
[…]

Immernoch >50MB/sec.

  • Erstmal herunter fahren:
rabe@foo:~$ sudo poweroff
[sudo] password for rabe:
rabe@foo:~$
An alle Benutzer verteilte Nachricht von rabe@foo
        (/dev/pts/0) um 5:45 ...

Das System wird sich JETZT zum Ausschalten herunterfahren!
Connection to foo.fritz.box closed by remote host.
Connection to foo.fritz.box closed.
  • ZFS Snapshot erzeugen:
# zfs snapshot tank/img/foo@test02
  • VM wieder starten und Testdateien in /var/tmp löschen:
rabe@foo:~$ ls -la /var/tmp/
insgesamt 8388620
drwxrwxrwt  2 root root       4096 Mär  2 05:38 .
drwxr-xr-x 12 root root       4096 Mär  2 05:46 ..
-rw-rw-r--  1 rabe rabe 8589934592 Mär  2 05:41 big.8G
rabe@foo:~$ df -h /var/tmp/
Dateisystem              Größe Benutzt Verf. Verw% Eingehängt auf
/dev/mapper/foo--vg-root   28G    9,0G   17G   35% /
rabe@foo:~$ rm /var/tmp/big.8G
rabe@foo:~$ df -h /var/tmp/
Dateisystem              Größe Benutzt Verf. Verw% Eingehängt auf
/dev/mapper/foo--vg-root   28G    985M   25G    4% /
  • VM wieder herunterfahren:
rabe@foo:~$ sudo poweroff
  • ZFS Rollback:

Geht leider nicht so direkt:

# zfs rollback tank/img/foo@test02
cannot remove device links for 'tank/img/foo': Das Gerät oder die Ressource ist belegt: dataset is busy

Vorher iscsitarget anhalten:

# service iscsitarget stop
# zfs rollback tank/img/foo@test02
# service iscsitarget start
  • VM wieder hochahren, Daten sind wieder da:
rabe@foo:~$ ls -la /var/tmp/
insgesamt 8388620
drwxrwxrwt  2 root root       4096 Mär  2 05:38 .
drwxr-xr-x 12 root root       4096 Mär  2 05:46 ..
-rw-rw-r--  1 rabe rabe 8589934592 Mär  2 05:41 big.8G
rabe@foo:~$ du -sh /var/tmp/
8,1G    /var/tmp/

More fun[Bearbeiten]

ZFS Volume von 30GB auf 40GB vergrößern[Bearbeiten]

Diese Operation wird "offline" durchgeführt, d.h. der VirtualHost Gast ist dabei ausgeschaltet!

  • Auf dem Server:
# zfs set volsize=40G tank/img/foo
# service iscsitarget restart
[ ok ] Removing iSCSI enterprise target devices: :.
[ ok ] Stopping iSCSI enterprise target service: :.
[ ok ] Removing iSCSI enterprise target modules: :.
[ ok ] Starting iSCSI enterprise target service:.
. ok
  • VirtualBox: Nach dem Neustart des iscsitarget auf dem Server erkennt VirtualBox die 40GB und auch im gast wird das sichtbar:
rabe@foo:~$ sudo fdisk -l /dev/sda

Disk /dev/sda: 42.9 GB, 42949672960 bytes
255 Köpfe, 63 Sektoren/Spur, 5221 Zylinder, zusammen 83886080 Sektoren
Einheiten = Sektoren von 1 × 512 = 512 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Festplattenidentifikation: 0x00068d2c

   Gerät  boot.     Anfang        Ende     Blöcke   Id  System
/dev/sda1   *        2048      499711      248832   83  Linux
/dev/sda2          501758    62912511    31205377    5  Erweiterte
/dev/sda5          501760    62912511    31205376   8e  Linux LVM
  • Leider scheint zwar das Vergrößern von /dev/sda2 mittels parted zu klappen, jedoch kann /dev/sda5 nicht erweitert werden:
rabe@foo:~$ sudo parted
GNU Parted 2.3
Verwende /dev/sda
Willkommen zu GNU Parted! Geben Sie 'help' ein, um eine Liste der verfügbaren Kommados zu erhalten.
(parted) print
Modell: ATA VBOX HARDDISK (scsi)
Festplatte  /dev/sda:  42,9GB
Sektorgröße (logisch/physisch): 512B/512B
Partitionstabelle: msdos

Nummer  Anfang  Ende    Größe   Typ       Dateisystem  Flags
 1      1049kB  256MB   255MB   primary   ext2         boot
 2      257MB   32,2GB  32,0GB  extended
 5      257MB   32,2GB  32,0GB  logical                LVM

(parted) resize 2
WARNUNG: Sie versuchen parted auf einem Dateisystem (resize) zu verwenden.
Der Dateisystemänderungsquelltext von parted ist nicht so robust, wie der
in speziellen, dateisystemspezifischen Paketen wie e2fsprogs.
Wir empfehlen parted nur zum Verändern von Partitionstabellen zu,
verwenden, falls möglich.
Die Unterstützung dieser Vorgänge wird in zukünftigen
Veröffentlichungen für die meisten Dateisysteme entfallen.
Anfang?  [257MB]?
Ende?  [32,2GB]? 40,9GB
(parted) print
Modell: ATA VBOX HARDDISK (scsi)
Festplatte  /dev/sda:  42,9GB
Sektorgröße (logisch/physisch): 512B/512B
Partitionstabelle: msdos

Nummer  Anfang  Ende    Größe   Typ       Dateisystem  Flags
 1      1049kB  256MB   255MB   primary   ext2         boot
 2      257MB   40,9GB  40,6GB  extended
 5      257MB   32,2GB  32,0GB  logical                LVM

(parted) resize 5
WARNUNG: Sie versuchen parted auf einem Dateisystem (resize) zu verwenden.
Der Dateisystemänderungsquelltext von parted ist nicht so robust, wie der
in speziellen, dateisystemspezifischen Paketen wie e2fsprogs.
Wir empfehlen parted nur zum Verändern von Partitionstabellen zu,
verwenden, falls möglich.
Die Unterstützung dieser Vorgänge wird in zukünftigen
Veröffentlichungen für die meisten Dateisysteme entfallen.
Anfang?  [257MB]?
Ende?  [32,2GB]? 40,9GB
Fehler: Dateisystem konnte nicht erkannt werden.