VirtualBox

Mit dem Produkt VirtualBox von InnoTek lassen sich virtuelle Rechner unter einem Betriebsystem z.B. Linux laufen lassen.

Installation

Das Paket kann für die gängigen Linuxdistributionen direkt herunter geladen und installiert werden. VirtualBox Downloads
Empfehlenswert sind die HowTos und das Handbuch als PDF.
Für die Installation unter Ubuntu fügt man folgende Zeile in die Datei /etc/apt/sources.list.d/virtualbox.list ein

deb http://download.virtualbox.org/virtualbox/debian hardy non-free

Da die Pakete signiert sind, benötigen wir noch den entsprechenden Schlüssel:

wget -q http://download.virtualbox.org/virtualbox/debian/sun_vbox.asc -O- | sudo apt-key add -

Jetzt können wir VirtualBox installieren

apt-get update
apt-get install virtualbox-3.1 dkms build-essential linux-headers-`uname -r`

Die Pakete build-essential und die richtigen linux-headers benötigen wir um das vbox Modul zu übersetzen. Das Paket dkms veranlasst die stets nötige Übersetzung nach einem Kernelupdate.

Unter dem Menü Anwendungen→Systemwerkzeuge befindet sich jetzt das VirtualBox Admintool. Damit kann man auch gleich loslegen und virtuelle Maschinen anlegen. (nähere Angaben hierzu beim Hersteller)
Damit die virtuelle Maschine sich angenehmer verhält und damit man die Bildschirmauflösung dynamisch mit der Fenstergrösse anpassen kann, was besonders nützlich für den Vollbildmodus ist, müssen wir noch die Guest Additions installieren.
Bei der gestarteten Maschine findet man das Tool im VirtualBox Menü Devices→Install Guest Additions

Upgrade auf Hardy

Nach einem Upgrade von Gutsy mit VirtualBox 1.5.X auf Hardy mit VirtualBox 1.6.X laufen Windows VMs nicht mehr und quitieren den Dienst gleich nach dem Start mit einem Bluescreen.
Das kommt davon, weil ein anderer IDE-Controller simuliert wird. Darum muss man das bei bestehenden Windows VMs wieder zurück stellen.

Einstellungen->Allgemein->Erweitert->IDE-Controller im Gast = PIIX3

Oder auf der Shell:

VBoxManage modifyvm "Maschine" -idecontroller PIIX3

USB Unterstützung mit Hardy

/etc/init.d/mountdevsubfs.sh

...
#
# Magic to make /proc/bus/usb work
#
mkdir -p /dev/bus/usb/.usbfs
domount usbfs "" /dev/bus/usb/.usbfs -obusmode=0700,devmode=0600,listmode=0644
ln -s .usbfs/devices /dev/bus/usb/devices
mount --rbind /dev/bus/usb /proc/bus/usb
...

Die obigen Zeilen einmarkieren.
Quelle: USB in Hardy

USB verwenden

Damit USB Devices verwendet werden können, muss bei der virtuellen Maschine die USB-Unterstützung eingeschaltet werden. Das geht aber nur, wenn die VM nicht läuft.

VBoxManage modifyvm "Maschine" -usb on

Man kann natürlich alle USB Devices direkt durchschlaufen, aber damit können keine USB Geräte mehr am Host verwendet werden. Daher sollte man die Geräte selektiv verwenden.
Um bestimmte Geräte grundsätzlich einer VM zuzuordnen, werden für die entsprechenden Geräte Filter erstellt. Für den Filter benötigen wir zuerst genaue Angaben zum USB-Device. Mit dem Shellbefehl lsusb werden alle USB Anschlüsse und die angeschlossenen Geräte aufgelistet. Allerdings kann man mit einem Virtualbox Befehl die angeschlossenen Geräte für unsere Zwecke besser auflisten.

VBoxManage list usbhost

Ergibt einen solchen Output:

VirtualBox Command Line Management Interface Version 2.1.2
(C) 2005-2009 Sun Microsystems, Inc.
All rights reserved.

Host USB Devices:

UUID:               4019da16-4adf-4535-a1ac-c6e44a371d85
VendorId:           0x0529 (0529)
ProductId:          0x0001 (0001)
Revision:           0.216 (00216)
Manufacturer:       AKS
Product:            HASP HL 2.16
Address:            sysfs:/sys/devices/pci0000:00/0000:00:02.0/usb2/2-8//device:/dev/bus/usb/002/003
Current State:      Captured

Danach kann man das Device einer oder allen Maschinen zuweisen. Mit dem Parameter -target global gilt der Filter für alle VMs.

VBoxManage usbfilter add 0 -target global -name "HASP HL 2.16" -action hold -active yes -vendorid 0529 -productid 0001

Die Null nach dem add ist die Filternummer und muss eindeutig sein. Es dürfen nicht mehrere Filter auf der gleichen Nummer erfasst werden.

FIXME
Allerdings hat es nicht auf Anhieb funktioniert. Vielleicht greift der Filter erst nach einen erneuten Einstecken des Gerätes.
Und ausserdem ist nicht ganz klar, welche Paramter zwingend angegeben werden müssen.

Die Filtermethode ist immer dann gut, wenn ein Gerät öfters engesteckt und wieder entfernt werden muss, weil es dann automatisch an die VM durchgereicht wird.
Es gibt aber noch eine zweite Methode. Man kann im laufenden Betrieb einfach ein USB-Gerät durchreichen oder entfernen. Das ist die bessere Wahl bei einmaliger oder seltener Verwendung. Dazu verwenden wir den usbattach Befehl:

VBoxManage controlvm "tserver" usbattach sysfs:/sys/devices/pci0000:00/0000:00:02.0/usb2/2-8//device:/dev/bus/usb/002/003

Analog gibt es auch den detach Befehl

VBoxManage controlvm "tserver" usbdetach sysfs:/sys/devices/pci0000:00/0000:00:02.0/usb2/2-8//device:/dev/bus/usb/002/003

Virtuelle Maschine erstellen

Eine Virtuelle Maschine kann vollständig auf der Shell erstellt werden.
VORSICHT! Seit Version 3.1.4 hat sich die Syntax verändert!

Neu seit 3.1.4

Syntax der Parameter wurde stark verändert!
Alle Parameter müssen neu mit zwei Bindestrichen bezeichnet werden.

VBoxManage modifyvm "Windows XP" --memory 512 --acpi on --nic1 bridged --hostifdev1 eth1

Der Parameter –memory wird neu ohneMB” angegeben. Der Parameter -nic1 hostif wurde durch –nic1 bridged ersetzt und der Parameter -hostifdev1 eth1 wurde komplett ausgetauscht durch –bridgeadapter1 eth1.

Ein virtuelles Laufwerk kann nicht mehr mit modifyvm angefügt werden. Zuerst muss ein IDE-Kontroller erstellt werden.

VBoxManage storagectl "Windows XP" --name "IDE Controller" --add ide --controller PIIX4

Danach übergibt man das virtuelle Laufwerk an den neu erstellten Kontroller.

VBoxManage storageattach "Windows XP" --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium "/path/to/winxp.vdi"

Und Fall der Kontroller falsch ist, oder sonstwie geändert werden muss:

VBoxManage storagectl "Windows XP" --name "IDE Controller" --controller PIIX4

Beispiel aus dem Internet:

    1. VBoxManage createvm --name "Windows XP" --ostype WindowsXP --register
    2. VBoxManage modifyvm "Windows XP" --memory 256 --acpi on --boot1 dvd --nic1 nat
    3. VBoxManage createhd --filename "WinXP.vdi" --size 10000 --remember
    4. VBoxManage storagectl "Windows XP" --name "IDE Controller" --add ide --controller PIIX4
    5. VBoxManage storageattach "Windows XP" --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium "WinXP.vdi"
    6. VBoxManage openmedium dvd /full/path/to/iso.iso
    7. VBoxManage storageattach "Windows XP" --storagectl "IDE Controller" --port 0 --device 1 --type dvddrive --medium /full/path/to/iso.iso
    8. VBoxHeadless --startvm "Windows XP"

Windows erstellen

Um Windows installieren zu können benötigen wir eine Installations CD. Einfacher geht es, wenn die CD zuerst als ISO-Image gespeichert wird.

dd if=/dev/scd0 of=winxp.iso bs=1024
dd if=/dev/scd0 of=winxp.iso bs=1024 conv=sync,noerror

Die zweite Zeile ist für defekte oder hartnäckige CDs gedacht. Wie z.B. die Twixtel CD.

Wir benötigen eine Imagedatei, auf welcher Windows installiert wird.

VBoxManage createhd -filename "/path/to/winxp.vdi" -size 20000 -register

Falls bereits eine Imagedatei vorhanden ist, muss diese noch registriert werden:

VBoxManage registerimage disk "/path/to/vboximage.vdi"

Wir müssen auch das CD-Image für die Installation anmelden:

VBoxManage openmedium dvd "/path/to/winxp.iso"

Dann erstellen wir eine Konfigurationsdatei:

VBoxManage createvm -name "Windows XP" -register

Nun können wir weitere Vorgaben hinzufügen:

VBoxManage modifyvm "Windows XP" -hda "/path/to/winxp.vdi" -dvd "/path/to/winxp.iso" -memory "512MB" -acpi on -boot1 dvd -nic1 nat

Alternativ kann die DVD auch während dem Betrieb gemountet werden:

VBoxManage controlvm "Windows XP" dvdattach

Jetzt können wir unsere neue Maschine starten und mit der Installation beginnen.

VBoxHeadless -startvm "Windows XP"

Für den Zugriff auf die Bildschirmausgabe verwendet man einen RDP-Client

rdesktop -a 16 my.host.address

ISO Images

Wenn die ISO-Images nicht mehr benötigt werden, kann man sie auch wieder entfernen.
So entfernen wir die Disc aus dem Laufwerk einer virtuellen Maschine:

VBoxManage modifyvm "Windows XP" -dvd none

Damit die Disc nicht mehr unter Virtualbox zur Verfügung steht:

VBoxManage closemedium dvd /path/to/dvd.iso

Windows optimieren

Damit der Zugriff mit der Maus und die gewünschte Bildschirmauflösung einwandfrei übertragen werden, muss man noch die Guest Additions installieren.
Dafür benötigen wir Zugriff auf die Installationsdateien. Diese befinden sich in einer ISO Datei. welche gemountet werden muss. Zuerst muss die laufenden Maschine beendet werden.

VBoxManage openmedium dvd "/usr/share/virtualbox/VBoxGuestAdditions.iso"
VBoxManage modifyvm "Windows XP" -dvd "/usr/share/virtualbox/VBoxGuestAdditions.iso"

Falls modifyvm nicht funktioniert:

VBoxManage storagedettach "Windows XP" --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium "/usr/share/virtualbox/VBoxGuestAdditions.iso"

Jetzt kann die Maschine wieder gestartet werden und von CD können die zusätzlichen Treiber installiert werden.
Um danach die ISO-Datei wieder aus dem Gast zu entfernen:

VBoxGuestAdditions.iso"VBoxManage modifyvm "Windows XP" --dvd none

Netzwerkmodus

Vorher definierten wir den Netzwerkmodus NAT. Damit hat die virtuelle Maschine zwar Zugriff nach aussen, aber von aussen haben wir keinen Zugriff auf die virtuelle Maschine. Für den Zugriff auf Dienste innerhalb der Maschine muss der Netzwerkmodus von NAT auf Host Interface umgestellt werden.

VBoxManage modifyvm "Windows XP" -nic1 hostif -hostifdev1 eth1

VDI Probleme

Images komprimieren

Die Festpatten Images haben eine variable Grösse. Am Anfang sind sie klein und werden mit der Benutzung immer grösser. Sie werden aber nie mehr kleiner, auch wenn der Platz nicht mehr benötigt wird. Besonders nach umfangreichen Updates schwellen die .VDI Dateien beträchtlich an. Das ist natürlich ärgerlich, wenn man die Images aufbewahren möchte, da sie jetzt viel mehr Platz brauchen als es nötig ist.
Um die Images wieder zu verkleinern muss man zuerst 1-2 mal die Festplatte defragmentieren. Danach füllt man den leeren Platz mit Nullen. Hierfür verwendet man folgendes Tool: http://www.feyrer.de/g4u/nullfile-1.02.exe
nach dem Beenden der virtuellen Maschine komprimieren wir die Datei mit Hilfe von VBoxManage

VBoxManage modifyvdi /pfad/zum/image.vdi compact

Gefunden auf: http://kakku.wordpress.com/2008/06/23/virtualbox-shrink-your-vdi-images-space-occupied-disk-size/

UUID ändern

Wenn man einmal ein System sauber aufgesetzt hat, möchte man es für verschieden Zwecke einsetzen. Da taucht aber folgendes Problem auf. Nach dem Kopieren des Images muss man es beim VirtualBox System anmelden. Dieses meldet nun, dass bereits ein Device mit der gleichen UUID im System vorhanden ist und bricht ab.
Darum muss jede Imagekopie eine eigene UUID haben. Das erreicht man wie folgt:

VBoxManage internalcommands sethduuid /pfad/zum/image.vdi

IDE Kontroller setzen

Damit ältere Windows-Images gestartet werden können, muss der IDE-Kontroller auf eine ältere Version umgestellt werden.

VBoxManage modifyvm "Windows XP" -idecontroller PIIX3

Netzwerk optimieren

Die Verfahren in diesem Abschnitt sind seit der VirtualBox Version 2.1 nicht mehr nötig!
Funktioniert die Maschine, können wir jetzt noch den Netzwerkzugriff optimieren. Als Standartvorgabe ist NAT eingestellt. Damit kann man aus der virtuellen Maschine auf das Netzwerk und das Internet zugreifen, aber von aussen gibt es keinen Zugriff auf die virtuelle Maschine. Damit das möglich wird, müssen wir ein Bridge Interface einrichten.

apt-get install btrl-tools

In der Datei /etc/network/interfaces wird der Eintrag von eth1 durch ein Bridge-Interface ersetzt

...
auto br0
iface br0 inet static
        address 192.168.1.1
        netmask 255.255.255.0
        bridge_ports eth1
...

benötigen wir noch den Proxy Routing Daemon.

apt-get install uml-utilities parprouted

Jetzt müssen wir noch folgende Zeilen eingeben:

tunctl -t tap0 -u [username]
chmod 666 /dev/net/tun
/sbin/ip link set tap0 up
/sbin/ip addr add 172.16.16.16/32 dev tap0
echo "1" > /proc/sys/net/ipv4/conf/tap0/proxy_arp
echo "1" > /proc/sys/net/ipv4/ip_forward
parprouted eth1 tap0

Wobei eth0 auf der letzten Zeile durch das gewünschte Interface angepasst werden kann. Die fiktive IP-Adresse 172.16.16.16/32 kann man genau so belassen. Sie muss nicht an die Infrastruktur angepasst werden.
Eine gute Beschreibung ist in diesem Mailthread zu finden.
Der verwendete User muss Mitglied der Gruppe vboxusers sein, damit er die VBox-Kerneltreiber laden darf.

Damit die VM auch die veränderte Netzwerkverbindung verwendet, stellt man die VM vor dem starten von NAT auf HOST INTERFACE mit der Schnittstelle tap0 um.

Es ist am besten, wenn die VM immer über die gleiche Adresse erreichbar ist. Daher konfiguriere ich in der VM die TCP/IP Eigenschaften von DHCP auf eine fixe IP um.

VirtualBox als Daemon

Damit man auf einem Server den Dienst ohne grafische Oberfläche starten kann benutzt man folgende Kommandozeile:

VBoxVRDP -startvm "VM-Name" &

Das Kaufmannsund am Schluss bewirkt das Starten als Dienst im Hintergrund.

Startscript

/etc/init.d/vmachine

#! /bin/sh
### BEGIN INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="Virtualbox"
NAME=tserver
DAEMON=/usr/bin/VBoxVRDP
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
USER=username
IF=eth1

case "$1" in
  start)
        echo -n "Starting $DESC: $NAME"
        ############################################################
        # VORSICHT! Netzwerkteil darf nur 1 mal ausgeführt werden!!!
        ############################################################
        tunctl -t tap0 -u $USER
        chmod 666 /dev/net/tun
        /sbin/ip link set tap0 up
        /sbin/ip addr add 172.16.16.16/32 dev tap0
        echo "1" > /proc/sys/net/ipv4/conf/tap0/proxy_arp
        echo "1" > /proc/sys/net/ipv4/ip_forward
        /usr/sbin/parprouted $IF tap0
        ############################################################
        sudo -u $USER $DAEMON -startvm "$NAME" &
        echo "."
        ;;
  stop)
        echo -n "Stopping $DESC: $NAME"
        killall VBoxVRDP
        echo "."
        ;;
  restart|force-reload)
        echo -n "Restarting $DESC: $NAME"
        killall VBoxVRDP
        sleep 1
        sudo -u $USER $DAEMON -startvm "$NAME" &
        echo "."
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
        exit 3
        ;;
esac

exit 0
 
linux/virtualbox.txt · Zuletzt geändert: 09.10.2011 14:36 von tangst