1. Index
  2. Debian
  3. Desktop
  4. Heimserver
  5. Webserver

Maschinen virtualisieren

VirtualBox simuliert die komplette Hardware eines Rechners. Im Gegensatz zu Containern kann man so auch andere Konfigurationen und andere Betriebssysteme ausprobieren. Virtuelle Maschinen lassen sich sowohl per Kommandozeile als auch über eine graphische Oberfläche steuern.

Pakete installieren

Oracle stellt ein eigenes Depot zur Verfügung.

/etc/apt/sources.list
… deb https://download.virtualbox.org/virtualbox/debian bullseye contrib

Daher müssen wir dem Schlüssel von Oracle vertrauen und die Paketliste aktualisieren, um schließlich die relevanten Pakete zu installieren.

curl https://www.virtualbox.org/download/oracle_vbox_2016.asc | apt-key add
apt update
apt install virtualbox-6.1
adduser User vboxusers

Bei aktiviertem SecureBoot müssen wir noch die Kernelmodule signieren.

for module in vboxdrv vboxpci vboxnetadp vboxnetflt
do
	ko=$(modinfo -n $module)
	key=/etc/ssl/efi/DB.key
	cer=/etc/ssl/efi/DB.cer
	/usr/lib/linux-kbuild-4.19/scripts/sign-file $key $cer sha256 $ko
	modprobe $module
done

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/.virtualbox" … >

Für eine gute Performance sollten wir für dieses Verzeichnis COW deaktivieren.

mkdir  -p ~/.virtualbox
chattr +C ~/.virtualbox

Das Kommando virtualbox startet die graphische Oberfläche. Mit dem CLI vboxmanage kann man das aber auch automatisieren. Um die Kommandos allgemein zu halten, definieren wir uns Variablen für den Namen des Gastes und den Pfad der virtuellen Festplatte.

vm=debian
disk=~/.virtualbox/$vm/$vm.vdi

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.

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 $vm.iso $disk
vboxmanage convertfromraw --format RAW $disk $vm.iso

Virtuelle Maschine bauen

Zuerst registrieren wir den neuen Gast und statten es mit ausreichend Arbeitsspeicher aus.

vboxmanage createvm  --name $vm --ostype Debian_64 --register
vboxmanage modifyvm         $vm --memory 1024 --vram 16 --acpi on \
                                  --pae off --rtcuseutc on --firmware efi

Als nächstes schließen wir eine Festplatte per SATA an.

vboxmanage storagectl    $vm --name SATA --add sata
vboxmanage storageattach $vm --storagectl SATA --medium $disk \
                               --port 0 --device 0 --type hdd

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

Virtuelles Netzwerk aufspannen

Standardmäßig werden Gäste per nat angebunden und können sich mit dem Internet verbinden, aber nicht untereinander kommunizieren. Es stehen folgende Topologien zur Auswahl:

Topologien für virtuelle Netzwerke

Um vom Host direkt auf den Gast zugreifen zu können, müssen wir eine hostonly Schnittstelle einrichten, die auf dem Host als vboxnet0 erscheint.

vboxmanage hostonlyif create
vboxmanage modifyvm $vm --nic1 hostonly --hostonlyadapter1 vboxnet0
none
bridged
nat
natnetwork
hostonly
intnet

Damit die Gäste eine Adresse erhalten und ins Internet kommen, aktivieren wir auf dem Host für die Schnittstelle sowohl DHCP als auch NAT.

/etc/systemd/network/vboxnet0.network
[Match] Name=vboxnet0 [Network] Address=10.0.1.1/24 DHCPServer=yes IPMasquerade=yes

Danach starten wir noch den Netzwerk-Daemon durch.

systemctl restart systemd-networkd

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