VirtualBox mit iSCSI auf ZFS (Linux)
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
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.