Maschinen virtualisieren

VirtualBox simuliert die komplette Hardware von Rechnern mit Hilfe der Virtualisierungsfunktion moderner Prozessoren. Im Gegensatz zu Containern kann man so auch andere Betriebssysteme und Konfigurationen ausprobieren. Virtuelle Maschinen lassen sich sowohl per Kommandozeile als auch über eine graphische Oberfläche steuern.

Pakete installieren

Oracle stellt ein Paket für Debian auf seiner Downloadseite zur Verfügung, welches wir manuell herunterladen und installieren.

apt install ./virtualbox-*.deb
adduser User vboxusers

Standardmäßig legt VirtualBox einen sichtbaren Ordner im Benutzerverzeichnis an. Eine kleine Änderung der Konfiguration sorgt dafür, dass die VDIs in einem versteckten Ordner landen.

~/.config/VirtualBox/VirtualBox.xml
<SystemProperties defaultMachineFolder="/home/User/.local/share/virtualbox" … >

Das Kommando virtualbox startet die graphische Oberfläche. Mit dem CLI vboxmanage kann man das Anlegen, Starten und Stoppen der virtuellen Maschinen auch automatisieren.

Virtuelles Netzwerk aufspannen

Standardmäßig werden Gäste per nat angebunden, können nicht untereinander kommunizieren und sind von außen nicht erreichbar. Es stehen folgende Topologien zur Auswahl:

Topologien für virtuelle Netzwerke

Um vom Host direkt auf den Gast zugreifen zu können, richten wir ein hostonly Netzwerk ein. Der Host verbindet sich dazu über die virtuelle Schnittstelle vboxnet0.

vboxmanage hostonlyif create
vboxmanage hostonlyif ipconfig vboxnet0 --ip 192.168.56.1 --netmask 255.255.255.0
vboxmanage list hostonlyifs
Name:            vboxnet0
GUID:            786f6276-656e-4074-8000-0a0027000000
DHCP:            Disabled
IPAddress:       192.168.56.1
NetworkMask:     255.255.255.0
IPV6Address:     
IPV6NetworkMaskPrefixLength: 0
HardwareAddress: 0a:00:27:00:00:00
MediumType:      Ethernet
Wireless:        No
Status:          Down
VBoxNetworkName: HostInterfaceNetworking-vboxnet0

Von dem oben genannten Standard abweichende Adressbereiche werden nur dann durchgereicht, wenn sie in einer Konfigurationsdatei aufgelistet sind.

/etc/vbox/networks.conf
* 10.0.0.0/8 * 2001::/64

Damit der Host soll als Gateway zum Internet fungiert, aktivieren wir auf der Schnittstelle das Durchleiten des Datenverkehrs (sysctl net.ipv4.ip_forward).

/etc/systemd/network/vboxnet0.network
[Match] Name=vboxnet0 [Network] Address=192.168.56.1/24 IPForward=yes

Zusätzliche richten wir im Paketfilter NAT ein, welche die Netzwerk-Adressen der aus- und eingehenden Pakete entsprechend der Schnittstelle ersetzt.

/etc/nftables.conf
… table ip nat { chain prerouting { type nat hook prerouting priority 0; } chain postrouting { type nat hook postrouting priority srcnat; ip saddr 192.168.56.0/24 oifname "eno1" masquerade; } }

Danach aktivieren wir den Netfilter und starten den Netzwerk-Daemon durch.

systemctl enable --now nftables
systemctl restart systemd-networkd

Virtuelle Festplatte erzeugen

Es gibt zwei Wege, um eine virtuelle Festplatte anzulegen. Der einfachere Weg besteht darin, eine leere Festplatte anzulegen, auf der man später ein Betriebssystem per Startmedium installiert.

vm=debian
disk=~/.local/share/virtualbox/$vm/$vm.vdi
vboxmanage createmedium disk --filename $disk --size 8192
vboxmanage list hdds

Der komplexere Weg erzeugt die virtuelle Festplatte aus einem selbst erstellten Abbild, welche wir dann in eine virtuelle Festplatte konvertieren (und zurück).

vboxmanage convertfromraw --format VDI image.iso $disk
vboxmanage convertfromraw --format RAW $disk image.iso

Virtuelle Maschine bauen

Zuerst registrieren wir den neuen Gast, statten es mit ausreichend Arbeitsspeicher aus, bauen einen Controller ein, schließen dort eine Festplatte an und verbinden ihn schließlich mit dem virtuellen Netzwerk.

vboxmanage createvm  --name $vm --ostype Debian_64 --register
vboxmanage modifyvm         $vm --memory 1024 --vram 16 \
                                 --acpi on --pae off --rtcuseutc on
vboxmanage storagectl       $vm --name SATA --add pcie
vboxmanage storageattach    $vm --storagectl SATA \
                                 --medium $disk --port 0 --device 0 --type hdd
vboxmanage modifyvm         $vm --nic1 hostonly --hostonlyadapter1 vboxnet0
none
bridged
nat
natnetwork
hostonly
intnet

Bei Bedarf schließen wir noch ein DVD-Laufwerk per IDE an und legen ein Installationsmedium ein.

iso=*-netinst.iso
vboxmanage storagectl    $vm --name IDE --add ide
vboxmanage storageattach $vm --storagectl IDE \
                               --medium $iso --port 0 --device 0 --type dvddrive

Nun starten wir den Gast und experimentieren nach Lust und Laune damit herum.

vboxmanage startvm $vmvboxmanage controlvm $vm poweroff

Schließlich wollen wir Gäste auflisten und löschen.

vboxmanage list vms
vboxmanage unregistervm $vm --delete

Dateien austauschen

Über ein gemeinsames Verzeichnis lassen sich bequem Dateien zwischen Host und Gast austauschen. Auf dem Host legen wir ein entsprechendes Ordnerobjekt an.

mkdir -p ~/vm/$vm
vboxmanage sharedfolder add $vm --name shared --hostpath ~/vm/$vm

Außerdem legen wir schon einmal die DVD mit den Gasterweiterungen in das virtuelle Laufwerk ein.

iso=/usr/share/virtualbox/VBoxGuestAdditions.iso
vboxmanage storageattach $vm --medium $iso --storagectl IDE \
                               --port 0 --device 0 --type dvddrive

Auf dem Gast müssen wir noch die Gasterweiterungen installieren und eventuell einen Benutzer in die Gruppe vboxsf aufnehmen.

apt install linux-headers-$(uname -r) build-essential
mount /dev/sr0 /mnt
/mnt/VBoxLinuxAdditions.run
umount /mnt
adduser User vboxsf

Dieser Benutzer kann nun den gemeinsamen Ordner montieren.

mount -t vboxsf shared /mntumount /mnt

Kochbuch

Verschlüsselte Partition auf dem Host montieren.

modprobe nbd max_part=16
qemu-nbd -c /dev/nbd0 $disk
cryptsetup luksOpen /dev/nbd0p2 vroot
Geben Sie die Passphrase für »/dev/nbd0p2« ein:
mount -o subvol=@root /dev/mapper/vroot /mnt/
...
umount /mnt
cryptsetup luksClose vroot
qemu-nbd -d /dev/nbd0

Referenz

Diese Auflistung soll nur einen Überblick über die verfügbaren Kommandos und Optionen vermitteln und erhebt keinen Anspruch auf Vollständigkeit. Als authoritative Quelle gelten nur die Manpages und die offizielle Dokumentation.

Kommando Argument Optionen Beschreibung
list vms|… [--long] [--sorted] Inventar auflisten
showvminfo VmName [--details] Konfiguration eines Gastes ausgeben
registervm Path Gast hinzufügen
unregistervm VmName [--delete] Gast entfernen
createvm --name Name Neuen Gast erzeugen
modifyvm VmName [--name Name] Konfiguration ändern
clonevm VmName [--name Name] Gast klonieren
movevm VmName --type basic Gast verschieben
import Path [--dry-run] Appliance aus .ovf-Datei importieren
export Machines --output Path Gast in .ovf-, .ova- oder tar.gz-Datei exportieren
startvm VmName [--type gui|…] Gast einschalten
controlvm VmName poweroff|… Knöpfe am Gehäuse drücken
discardstate VmName
adoptstate VmName Path
snapshot VmName list|take|… Momentaufnahme erstellen
storagectl VmName --name Name Controller einbauen
storageattach VmName --storagectl Name Medium anschließen
bandwidthctl VmName list|add|set|…
createmedium [disk|dvd|floppy] --filename Path Datenträger erzeugen
showmediuminfo [disk|dvd|floppy] Path Datenträger untersuchen
modifymedium [disk|dvd|floppy] Path Datenträger ändern
clonemedium [disk|dvd|floppy] Path Path Datenträger duplizieren
closemedium [disk|dvd|floppy] Path [--delete]
mediumproperty [disk|dvd|floppy] set|get|delete
encryptmedium Path Datenträger verschlüsseln
checkmediumpwd Path Pwdfile|- Passphrase prüfen
convertfromraw Path|stdin Speicherformat konvertieren
getextradata VmName|global Key|[enumerate]
setextradata VmName|global Key [Value]
setproperty property
sharedfolder add|remove VmName --name Name Verzeichnis teilen
guestproperty get|set|… VmName Property [Value]
guestcontrol VmName run|… Gast fernsteuern
metrics list|… [*|host|VmName]
natnetwork list|… --netname Name NAT-Netzwerk konfigurieren
hostonlyif create|… Hostonly-Netzwerk konfigurieren
dhcpserver add|modify|remove --netname Name
|--ifname vboxnetNumber
DHCP-Server einrichten
usbfilter add|modify|remove Index
usbdevsource add|remove Name
[--type=gui|sdl|headless|separate] Mit oder ohne Fenster
[--putenv Name[=Value] Umgebungsvariablen setzen
Gastsysteme
vms Gäste auflisten
runningvms Laufende Gäste
groups Gruppen von Gästen
hdds Virtuelle Festplatten
dvds Virtuelle DVDs
floppies Virtuelle Disketten
usbfilters
Netzwerke
intnets Interne Netzwerke
bridgedifs Netzwerk-Brücken
hostonlyifs vboxnet-Schnittstellen
natnets NAT-Netzwerke
dhcpservers DHCP-Server
VirtualBox
systemproperties Konfiguration
ostypes Betriebssystemarten
hddbackends Festplattenformate
extpacks Erweiterungspakete
screenshotformats Bildformate
cloudproviders Cloud-Anbieter
cloudprofiles Cloud-Profile
Hostsystem
hostinfo Prozessor, Speicher und Betriebssystem
hostcpuids
hostdvds DVD-Laufwerke
hostfloppies Diskettenlaufwerke
usbhost USB-Geräte
webcams Kameras
[--details]
[--machinereadable]
[--log] Idx
--name VmName Name geben
[--groups] Group,… Gruppe zuordnen
[--ostype] Ostype Betriebssystemart
[--register] Sofort registrieren
[--basefolder] Path In Pfad speichern (statt ~/.virtualbox/VmName)
[--uuid] Uuid UUID vorgeben
[--default]
[--name] VmName Name ändern
[--groups] Group,… Gruppe zuordnen
[--description] Description Beschreibung ändern
[--ostype] Ostype Betriebsystemart ändern
[--iconfile] Path Ikonogramm ändern
[--memory] Megabytes Speicher vergrößern
[--pagefusion] on|off
[--vram] Megabytes Videospeicher vergrößern
[--acpi] on|off ACPI einschalten
[--pciattach] 03:04.0
[--pciattach] 03:04.0@02:01.0
[--pcidetach] 03:04.0
[--ioapic] on|off
[--hpet] on|off
[--triplefaultreset] on|off
[--apic] on|off
[--x2apic] on|off
[--paravirtprovider] none|default|legacy|minimal|hyperv|kvm
[--paravirtdebug] Key=Value,…
[--hwvirtex] on|off
[--nestedpaging] on|off
[--largepages] on|off
[--vtxvpid] on|off
[--vtxux] on|off
[--pae] on|off PAE einschalten
[--longmode] on|off
[--ibpb-on-vm-exit] on|off
[--ibpb-on-vm-entry] on|off
[--spec-ctrl] on|off
[--l1d-flush-on-sched] on|off
[--l1d-flush-on-vm-entry] on|off
[--mds-clear-on-sched] on|off
[--mds-clear-on-vm-entry] on|off
[--nested-hw-virt] on|off
[--cpu-profile] host|"Intel 80[86|286|386]"
[--cpuid-portability-level]Level 0-3
[--cpuid-set] Leaf[:Subleaf]eax ebx ecx edx
[--cpuid-remove] Leaf[:Subleaf]
[--cpuidremoveall]
[--hardwareuuid] Uuid
[--cpus] Number Anzahl der Prozessoren ändern
[--cpuhotplug] on|off
[--plugcpu] Id
[--unplugcpu] Id
[--cpuexecutioncap] Percent
[--rtcuseutc] on|off
[--graphicscontroller] none|vboxvga|vmsvga|vboxsvga
[--monitorcount] Number
[--accelerate3d] on|off 3D-Grafik beschleunigen
[--accelerate2dvideo] on|off 2D-Grafik beschleunigen
[--firmware] bios|efi|efi32|efi64 Firmware auswählen
[--chipset] ich9|piix3 Chipsatz der Hauptplatine
[--bioslogofadein] on|off Logo einblenden
[--bioslogofadeout] on|off Logo ausblenden
[--bioslogodisplaytime] Msec
[--bioslogoimagepath] ImagePath
[--biosbootmenu] disabled|menuonly|messageandmenu Startmenü anzeigen
[--biosapic] disabled|apic|x2apic
[--biossystemtimeoffset] Msec
[--biospxedebug] on|off
[--bootNumber] none|floppy|dvd|disk|net Startreihenfolge festlegen von 1-4
[--nicN] none|null|nat|bridged|intnet|hostonly|generic|natnetwork Netzwerkkarte hinzufügen
[--nictypeN] Am79C970A|Am79C973|82540EM|82543GC|82545EM|virtio
[--cableconnectedN] on|off Kabel einstecken
[--nictraceN] on|off
[--nictracefileN] Path
[--nicpropertyN] Name=[Value]
[--nicspeedN] Kbps
[--nicbootprioN] Priority
[--nicpromiscN] deny|allow-vms|allow-all
[--nicbandwidthgroupN] none|Name
[--bridgeadapterN] none|Device
[--hostonlyadapterN] none|Device
[--intnetN] Network
[--nat-networkN] Network
[--nicgenericdrvN] Driver
[--natnetN] Network|default
[--natsettingsN] [Mtu],[SockSnd],[SockRcv],[TcpSnd],[TcpRcv]
[--natpfN] [Rule],tcp|udp,[HostIp],HostPort,[GuestIp],GuestPort
[--natpfN] delete Rule
[--nattftpprefixN] Prefix
[--nattftpfileN] Path
[--nattftpserverN] IpAddress
[--natbindipN] IpAddress
[--natdnspassdomainN] on|off
[--natdnsproxyN] on|off
[--natdnshostresolverN] on|off
[--nataliasmodeN] default|[log],[proxyonly],[sameports]
[--macaddressN] auto|MacAddress
[--mouse] ps2|usb|usbtablet|usbmultitouch
[--keyboard] ps2|usb
[--lptN] off|IoBase Irq
[--lptmodeN] Device
[--guestmemoryballoon] Megabytes
[--audio] none|null|oss|alsa|pulse
[--audioin] on|off
[--audioout] on|off
[--audiocontroller] ac97|hda|sb16
[--audiocodec] stac9700|ad1980|stac9221|sb16
[--clipboard] disabled|hosttoguest|guesttohost|bidirectional
[--draganddrop] disabled|hosttoguest|guesttohost|bidirectional
[--vrde] on|off
[--vrdeextpack] default|Name
[--vrdeproperty] Name=[Value]
[--vrdeport] HostPort
[--vrdeaddress] HostIp
[--vrdeauthtype] null|external|guest
[--vrdeauthlibrary] default|Name
[--vrdemulticon] on|off
[--vrdereusecon] on|off
[--vrdevideochannel] on|off
[--vrdevideochannelquality]Percent
[--usbohci] on|off
[--usbehci] on|off
[--usbxhci] on|off
[--usbrename] Oldname Newname
[--snapshotfolder] default|Path
[--teleporter] on|off
[--teleporterport] Port
[--teleporteraddress] IpAddress
[--teleporterpassword] Password
[--teleporterpasswordfile] Path|stdin
[--tracing-enabled] on|off
[--tracing-config] String
[--tracing-allow-vm-access]on|off
[--usbcardreader] on|off
[--autostart-enabled] on|off
[--autostart-delay] Seconds
[--recording] on|off
[--defaultfrontend] default|Name
[--name] Name
[--uuid] Uuid
[--groups] Group,…
[--snapshot] Uuid|Name
[--mode] machine|machineandchildren|all
[--options] link|keepallmacs|keepnatmacs|keepdisknames|keephwuuids
[--basefolder] Path
[--register]
--type basic
[--folder] Path
[--dry-run]
[--options] keepallmacs|keepnatmacs|importtovdi
--output Path
[--legacy09] |--ovf09|--ovf10|--ovf20|--opc10
[--manifest]
[--iso]
[--options] manifest|iso|nomacs|nomacsbutnat
[--vsys] Number
[--vmname] Name
[--product] Name
[--producturl] Url
[--vendor] Name
[--vendorurl] Url
[--version] Version
[--description] Description
[--eula] Text
[--eulafile] Path
[--cloud] Number
[--cloudprofile] Name
[--cloudshape] Shape
[--clouddomain] Domain
[--clouddisksize] Gigabytes
[--cloudbucket] Name
[--cloudocivcn] Id
[--cloudocisubnet] Id
[--cloudkeepobject] true|false
[--cloudlaunchinstance] true|false
[--cloudpublicip] true|false
pause Ausführung anhalten
resume Ausführung fortsetzen
reset Reset-Knopf drücken
poweroff Stromzufuhr ausschalten
savestate
acpipowerbutton Ausschalt-Knopf drücken
acpisleepbutton Schlafen-Knopf drücken
keyboardputscancode Hex Tastaturcode senden
keyboardputstring String Tastatureingabe senden
keyboardputfile Path Tastatureingabe aus Datei senden
setlinkstateN on|off Netzwerkkabel ein- oder ausstecken
nicN null|nat|bridged|intnet|
hostonly|generic|natnetwork
[Device]
nictraceN on|off
nictracefileN Path
nicpropertyN Name=[Value]
nicpromiscN deny|allow-vms|allow-all
natpfN [Rule],tcp|udp,[HostIp],HostPort,[GuestIp],GuestPort
natpfN delete Rule
guestmemoryballoon Megabytes
usbattach Uuid|IpAddress [--capturefile Path]
usbdetach Uuid|IpAddress
audioin on|off
audioout on|off
clipboard disabled|hosttoguest|guesttohost|bidirectional
draganddrop disabled|hosttoguest|guesttohost|bidirectional
vrde on|off
vrdeport Port
vrdeproperty Name=[Value]
vrdevideochannelquality Percent
screenshotpng Path [display]
teleport --host Host --port Port
[--maxdowntime Msec]
[--passwordfile Path
|--password Password]
plugcpu Id Prozessor einbauen
unplugcpu Id Prozessor ausbauen
cpuexecutioncap Percent
list [--details|--machinereadable]
take Name [--description Description] [--live] [--uniquename Number,Timestamp,Space,Force
delete Name
restore Name
restorecurrent
edit Name|--current [--name Name]
[--description Description]
showvminfo Name
--name Name
[--add] ide|sata|scsi|floppy|sas|usb|pcie
[--controller] LSILogic|LSILogicSAS|BusLogic|IntelAHCI|PIIX3|PIIX4|ICH6|I82078|[USB|NVMe
[--portcount] Number
[--hostiocache] on|off
[--bootable] on|off
[--rename] Name
[--remove]
--storagectl Name
[--port] Number
[--device] Number
[--type] dvddrive|hdd|fdd
[--medium] none|emptydrive|additions|Path|host:Drive|iscsi
[--mtype] normal|writethrough|immutable|shareable|readonly|multiattach
[--comment] Text
[--setuuid] Uuid
[--setparentuuid] Uuid
[--passthrough] on|off
[--tempeject] on|off
[--nonrotational] on|off
[--discard] on|off
[--hotpluggable] on|off
[--bandwidthgroup] Name
[--forceunmount]
[--server] Name|IpAddress
[--target] Target
[--tport] Port
[--lun] Lun
[--encodedlun] Lun
[--username] User
[--password] Password
[--passwordfile] Path
[--initiator] Initiator
[--intnet]
list [--machinereadable]
add Name --type disk|network
--limit Mbps[kmgKMG]
set Name --limit Mbps[kmgKMG]
remove Name
[--size] Megabytes
[--diffparent] Uuid|Path
[--format] VDI|VMDK|VHD
[--variant] Standard,Fixed,Split2G,Stream,ESX,Formatted
[--type] normal|writethrough|immutable|shareable|readonly|multiattach
[--autoreset] on|off
[--property] Name[=Value]
[--compact]
[--resize] Megabytes|--resizebyte Bytes
[--move] Path
[--setlocation] Path
[--description] Text
[--format] VDI|VMDK|VHD|RAW|Other
[--variant] Standard,Fixed,Split2G,Stream,ESX
[--existing]
set Path Property Value
get Path Property
delete Path Property
[--newpassword] Path|-
[--oldpassword] Path|-
[--cipher] Identifier
[--newpasswordid] Identifier
Path|stdin [Bytes]
[--format] VDI|VMDK|VHD
[--variant] Standard,Fixed,Split2G,Stream,ESX
[--uuid] Uuid
machinefolder default|Folder
hwvirtexclusive on|off
vrdeauthlibrary default|Library
websrvauthlibrary default|null|Library
vrdeextpack null|Library
autostartdbpath null|Folder
loghistorycount Value
defaultfrontend default|Name
logginglevel LogSetting
proxymode system|noproxy|manual
proxyurl Url
--name String
--action ignore|hold
[--active] yes|no
[--vendorid] ""
[--productid] ""
[--revision] ""
[--manufacturer] ""
[--product] ""
[--remote] yes|no
[--serialnumber] ""
[--maskedinterfaces] MacAddress
--hostpath Path
[--transient]
[--readonly]
[--automount]
get
set
delete
enumerate
wait
[--verbose]
[--quiet]
[--username] Name
[--domain] Domain
[--passwordfile] Path
[--password] Password
run [--exe Path] [--timeout Msec] [--putenv Name[=Value]] -- Program [args…] Kommando ausführen
start [--exe Path] [--timeout Msec] [--putenv Name[=Value]] -- Program [args…] Kommando ausführen
copyfrom [--follow] [--recursive] SourceDest Dateien vom Gast zum Host kopieren
copyto [--follow] [--recursive] SourceDest Dateien vom Host zum Gast kopieren
mkdir [--parents] [--mode Mode] Path Verzeichnis anlegen
rmdir [--recursive] Path Verzeichnis löschen
rm [--force] Path Datei löschen
mv SourceDest Datei umbenennen
mktemp [--secure] [--mode Mode] [--tmpdir Path] Template Temporärdatei anlegen
stat Path Metadaten anzeigen
list all|sessions|processes|files Sitzungen, Prozesse, Dateien auflisten
closeprocess --session-id Id|--session-name Pattern Pid Prozess beenden
closesession --all|--session-id Id|--session-name Pattern Sitzung beenden
updatega [--source Iso] [--wait-start] [-- Argument …] Gasterweiterungen aktualisieren
watch
list
query
enable [--list]
disable [--list]
setup [--list] …
collect [--list] …
[--period Seconds=1]
[--samples Count=1]
[--detach]
list [Pattern] NAT-Netzwerke auflisten
add --netname natnetNumber --network Network Neues Netzwerk anlegen
modify --netname natnetNumber [--network Network] … Netzwerk ändern
[--enable|--disable]
[--dhcp on|off]
[--port-forward-4 Rule]
[--loopback-4 Rule]
[--ipv6 on|off]
[--port-forward-6 Rule]
[--loopback-6 Rule]
start --netname natnetNumber Netzwerk einschalten
stop --netname natnetNumber Netzwerk ausschalten
remove --netname natnetNumber Netzwerk entfernen
create vboxnet0-Adapter erzeugen
ipconfig vboxnetNumber Adapter konfigurieren…
[--dhcp] …mit dynamischer oder
|--ip IpAddress …mit statischer Adresse
[--netmask 255.255.255.0]
|--ipv6Ipv6
[--netmasklengthv6Length=64]
remove vboxnetNumber Adapter löschen
[--ip] IpAddress Adresse des Servers
--netmask 255.255.255.0 Netzwerkmaske senden
--lowerip IpAddress Kleinste Adresse
--upperip IpAddress Größte Adresse
[--enable] Server aktivieren
[--disable] Server deaktivieren
[--options] --id Number Optionen senden
[--vm Name --nic N]
[--value String|--remove]]
--backend Backend Unterbau
--address IpAddress Adresse

Literatur

  1. Oracle Corporation: VirtualBox User Manual