Beginnend mit FreeBSD 10.0-RELEASE ist bhyve, ein BSD-lizensierter Hypervisor, Teil des Basissystems. Dieser Hypervisor unterstützt eine Reihe von Gastbetriebssystemen, darunter FreeBSD, OpenBSD und viele Linux® Distributionen. In der Voreinstellung unterstützt bhyve eine serielle Konsole, graphische Konsolen werden nicht emuliert. bhyve verwendet Offload-Funktionen von neueren CPUs, um manuelle Speicherzuordnungen und Anweisungen zu vermeiden.
Das Design von bhyve erfordert
einen Prozessor, der Intel® Extended Page Tables
(EPT), AMD® Rapid Vitualization
Indexing (RVI) oder Nested Page Tables
(NPT) unterstützt. FreeBSD- oder
Linux®-Gastsysteme mit mehr als einer vCPU
benötigen VMX unrestricted mode support
(UG). Die meisten neueren Prozessoren,
speziell Intel® Core™ i3/i5/i7 und Intel® Xeon™
E3/E5/E7, unterstützen diese Funktionen. Unterstützung für
UG wurde mit Intel's Westmere
Mikroarchitektur eingeführt. Eine vollständige Liste der
Intel®-Prozessoren mit EPT-Unterstützung
finden Sie unter https://ark.intel.com/content/www/us/en/ark/search/featurefilter.html?productType=873&0_ExtendedPageTables=True.
RVI wird seit der dritten Generation der
AMD Opteron™-Prozessoren (Barcelona) unterstützt. Um zu sehen
ob der Prozessor bhyve unterstützt,
prüfen Sie die Ausgabe von dmesg
oder
/var/run/dmesg.boot
. Für AMD®-Prozessoren
suchen Sie in der Zeile Features2
nach
POPCNT
. Für Intel®-Prozessoren suchen Sie
in der Zeile VT-x
nach EPT
und UG
.
Der erste Schritt bei der Erstellung einer virtuellen Maschine in bhyve ist die Konfiguration des Host-Systems. Laden Sie zunächst das bhyve Kernelmodul:
#
kldload vmm
Erstellen Sie ein tap
-Gerät, um
dieses mit der Netzwerk-Schnittstelle der virtuellen Maschine
zu verbinden. Damit sich die Schnittstelle mit dem
Netzwerk verbinden kann, müssen Sie zusätzlich eine
Bridge-Schnittstelle erzeugen, bestehend aus dem
tap
-Gerät und der physikalischen
Schnittstelle. In diesem Beispiel wird die physikalische
Schnittstelle igb0
verwendet:
#
ifconfig
tap0
create#
sysctl net.link.tap.up_on_open=1
net.link.tap.up_on_open: 0 -> 1#
ifconfig
bridge0
create#
ifconfig
bridge0
addmigb0
addmtap0
#
ifconfig
bridge0
up
Erzeugen Sie eine Datei, die als virtuelle Festplatte für das Gastsystem verwendet wird. Geben Sie die Größe und den Namen der virtuellen Festplatte an:
#
truncate -s
16G
guest.img
Laden Sie ein Installationsabbild von FreeBSD:
#
fetch
FreeBSD-10.3-RELEASE-amd64-bootonly.iso 100% of 230 MB 570 kBps 06m17sftp://ftp.freebsd.org/pub/FreeBSD/releases/ISO-IMAGES/10.3/FreeBSD-10.3-RELEASE-amd64-bootonly.iso
FreeBSD enthält ein Beispielskript um eine virtuelle Maschine
in bhyve auszuführen. Das Skript
wird die virtuelle Maschine starten und sie in einer Schleife
ausführen. Sollte die virtuelle Maschine abstürzen, wird sie
vom Skript automatisch neu gestartet. Das Skript akzeptiert
einige Optionen, um die Konfiguration der virtuellen Maschine
zu kontrollieren: -c
bestimmt die Anzahl der
virtuellen CPUs, -m
begrenzt den verfügbaren Speicher des Gastsystems,
-t
bestimmt das verwendete
tap
-Gerät, -d
gibt das
zu benutzende Festplattenabbild an, -i
sagt
bhyve dass es von
CD booten soll und -I
bestimmt das CD-Abbild. Der letzte
Parameter ist der Name der virtuellen Maschine. Dieses
Beispiel startet die virtuelle Maschine im
Installationsmodus:
#
sh /usr/share/examples/bhyve/vmrun.sh -c
1
-m1024M
-ttap0
-dguest.img
-i -IFreeBSD-10.3-RELEASE-amd64-bootonly.iso
guestname
Die virtuelle Maschine wird starten und das Installationsprogramm ausführen. Nachdem das System in der virtuellen Maschine installiert ist, werden Sie gefragt, ob eine Shell gestartet werden soll. Wählen Sie
.Starten Sie die virtuelle Maschine neu. Ein Neustart der
virtuellen Maschine wird bhyve
beenden, aber da das vmrun.sh
-Skript in
einer Schleife läuft, wird bhyve
automatisch neu gestartet. Wenn dies passiert, wählen Sie die
Option Reboot
im Bootloader-Menü, um die
Schleife zu unterbrechen. Anschließend kann das Gastsystem
von der virtuellen Festplatte gestartet werden:
#
sh /usr/share/examples/bhyve/vmrun.sh -c
4
-m1024M
-ttap0
-dguest.img
guestname
Um andere Betriebssysteme als FreeBSD zu booten, muss zunächst der Port sysutils/grub2-bhyve installiert werden.
Als nächstes erzeugen Sie eine Datei, die das Gastsystem als virtuelle Festplatte verwenden kann:
#
truncate -s
16G
linux.img
Der Start einer virtuellen Maschine mit
bhyve ist ein zweistufiger Prozess.
Zuerst muss ein Kernel geladen werden, dann kann das
Gastsystem gestartet werden. Der Linux®-Kernel wird mit
sysutils/grub2-bhyve geladen. Erstellen
Sie eine device.map
, damit
grub die virtuellen Geräte den
Dateien auf dem Hostsystem zuordnen kann:
(hd0) ./linux.img (cd0) ./somelinux.iso
Benutzen Sie sysutils/grub2-bhyve um den Linux®-Kernel vom ISO-Abbild zu laden:
#
grub-bhyve -m device.map -r cd0 -M
1024M
linuxguest
Damit wird grub gestartet.
Wenn die Installations-CD eine Datei namens
grub.cfg
enthält, wird ein Menü
angezeigt. Wenn nicht, müssen die Dateien
vmlinuz
und initrd
manuell geladen werden:
grub>ls
(hd0) (cd0) (cd0,msdos1) (host) grub>ls (cd0)/isolinux
boot.cat boot.msg grub.conf initrd.img isolinux.bin isolinux.cfg memtest splash.jpg TRANS.TBL vesamenu.c32 vmlinuz grub>linux (cd0)/isolinux/vmlinuz
grub>initrd (cd0)/isolinux/initrd.img
grub>boot
Nun, da der Linux®-Kernel geladen ist, kann das Gastsystem gestartet werden:
#
bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,
tap0
-s 3:0,virtio-blk,./linux.img
\ -s 4:0,ahci-cd,./somelinux.iso
-l com1,stdio -c4
-m1024M
linuxguest
Das System wird booten und das Installtionsprogramm starten. Starten Sie die virtuelle Maschine nach der Installation des Betriebssystems neu. Dies führt auch dazu, dass bhyve beendet wird. Die Instanz der virtuellen Maschine muss zerstört werden, bevor sie erneut in Betrieb genommen werden kann:
#
bhyvectl --destroy --vm=
linuxguest
Nun kann das Gastsystem direkt von der virtuellen Festplatte gestartet werden. Laden Sie den Kernel:
#
grub-bhyve -m device.map -r hd0,msdos1 -M
grub>1024M
linuxguest
ls
(hd0) (hd0,msdos2) (hd0,msdos1) (cd0) (cd0,msdos1) (host) (lvm/VolGroup-lv_swap) (lvm/VolGroup-lv_root) grub>ls (hd0,msdos1)/
lost+found/ grub/ efi/ System.map-2.6.32-431.el6.x86_64 config-2.6.32-431.el6.x 86_64 symvers-2.6.32-431.el6.x86_64.gz vmlinuz-2.6.32-431.el6.x86_64 initramfs-2.6.32-431.el6.x86_64.img grub>linux (hd0,msdos1)/vmlinuz-2.6.32-431.el6.x86_64 root=/dev/mapper/VolGroup-lv_root
grub>initrd (hd0,msdos1)/initramfs-2.6.32-431.el6.x86_64.img
grub>boot
Starten Sie die virtuelle Maschine:
#
bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,
tap0
\$ -s 3:0,virtio-blk,./linux.img
-l com1,stdio -c4
-m1024M
linuxguest
Linux® wird jetzt in der virtuellen Maschine gestartet und präsentiert Ihnen vielleicht einen Anmeldeprompt. Sie können sich anmelden und die virtuelle Maschine benutzen. Wenn Sie fertig sind, starten Sie die virtuelle Maschine neu, um bhyve zu verlassen. Anschließend zerstören Sie die Instanz der virtuellen Maschine:
#
bhyvectl --destroy --vm=
linuxguest
Neben bhyveload und grub-bhyve kann der bhyve Hypervisor virtuelle Maschinen auch über die UEFI-Userspace-Firmware booten. Mit dieser Option werden Gastsysteme unterstützt, die von anderen Bootloadern nicht unterstützt werden.
Um die UEFI-Unterstützung in bhyve nutzen zu können, benötigen Sie zuerst die Abbilder der UEFI-Firmware. Dazu können Sie den Port oder das Paket sysutils/bhyve-firmware installieren.
Mit der Firmware an Ort und Stelle, fügen Sie die Option
-l bootrom,
zur bhyve-Befehlszeile hinzu. Der
eigentliche bhyve-Befehl könnte wie
folgt lauten:/pfad/zur/firmware
#
bhyve -AHP -s 0:0,hostbridge -s 1:0,lpc \ -s 2:0,virtio-net,
tap1
-s 3:0,virtio-blk,./disk.img
\ -s 4:0,ahci-cd,./install.iso
-c4
-m1024M
\ -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd
\guest
sysutils/bhyve-firmware enthält auch eine CSM-fähige Firmware, um Gastsysteme ohne UEFI-Unterstützung im alten BIOS-Modus zu booten:
#
bhyve -AHP -s 0:0,hostbridge -s 1:0,lpc \ -s 2:0,virtio-net,
tap1
-s 3:0,virtio-blk,./disk.img
\ -s 4:0,ahci-cd,./install.iso
-c4
-m1024M
\ -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI_CSM.fd
\guest
Die Unterstützung von UEFI-Firmware ist bei graphischen Betriebssystemen, wie Microsoft Windows®, besonders nützlich.
Unterstützung für den UEFI-GOP Framebuffer kann auch über
die Option
-s 29,fbuf,tcp=
aktiviert werden. Die Framebuffer-Auflösung kann mit
0.0.0.0:5900
w=
und
800
h=
konfiguriert
werden. Mit der Option 600
wait
können Sie
bhyve anweisen, auf eine
VNC-Verbindung zu warten, bevor das
Gastsystem gebootet wird. Vom Host oder aus dem Netzwerk kann
über das VNC-Protokoll auf den Framebuffer
zugegriffen werden. Zusätzlich kann
-s 30,xhci,tablet
hinzugefügt werden, um eine
präzise Mauszeigersynchronisation mit dem Host zu
gewährleisten.
Der daraus resultierende Befehl würde so aussehen:
#
bhyve -AHP -s 0:0,hostbridge -s 31:0,lpc \ -s 2:0,virtio-net,
tap1
-s 3:0,virtio-blk,./disk.img
\ -s 4:0,ahci-cd,./install.iso
-c4
-m1024M
\ -s 29,fbuf,tcp=0.0.0.0:5900
,w=800
,h=600
,wait \ -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd
\ -s 30,xhci,tablet \guest
Beachten Sie, dass der Framebuffer im BIOS-Modus keine Befehle mehr empfängt, sobald die Steuerung von der Firmware an das Gastsystem übergeben wird.
Wenn auf dem Host-Rechner ZFS eingerichtet ist, können Sie ZFS-Volumes anstelle eines Festplattenabbilds verwenden. Dies kann erhebliche Leistungsvorteile für das Gastsystem mit sich bringen. Ein ZFS-Volume kann wie folgt erstellt werden:
#
zfs create -V
16G
-o volmode=devzroot/linuxdisk0
Geben Sie das ZFS-Volume beim Start der virtuellen Maschine an:
#
bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,
tap0
-s3:0,virtio-blk,/dev/zvol/zroot/linuxdisk0
\ -l com1,stdio
-c4
-m1024M
linuxguest
Es ist vorteilhaft, die
bhyve-Konsole mit einem Werkzeug
wie sysutils/tmux oder
sysutils/screen zu bedienen. Damit ist es
leicht, die Konsole zu verbinden oder zu trennen. Es ist auch
möglich, die Konsole als Nullmodem-Gerät zu nutzen, auf das
Sie mit cu
zugreifen können. Laden Sie
dazu das nmdm
Kernelmodul und ersetzen
Sie -l com1,stdio
mit -l
com1,/dev/nmdm0A
. Die
/dev/nmdm
-Geräte werden bei Bedarf
automatisch erstellt, jeweils paarweise, entsprechend den
beiden Enden eines Nullmodemkabels
(/dev/nmdm0A
und
/dev/nmdm0B
). Weitere Informationen
finden Sie in nmdm(4).
#
kldload nmdm
#
bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,
tap0
-s 3:0,virtio-blk,./linux.img
\ -l com1,/dev/nmdm0A
-c4
-m1024M
linuxguest
#
cu -l
Connected Ubuntu 13.10 handbook ttyS0 handbook login:/dev/nmdm0B
Für jede virtuelle Maschine wird unterhalb von
/dev/vmm
ein Gerätename erzeugt.
Dadurch kann der Administrator einfach feststellen, welche
virtuellen Maschinen zur Zeit ausgeführt werden:
#
ls -al /dev/vmm
total 1 dr-xr-xr-x 2 root wheel 512 Mar 17 12:19 ./ dr-xr-xr-x 14 root wheel 512 Mar 17 06:38 ../ crw------- 1 root wheel 0x1a2 Mar 17 12:20 guestname crw------- 1 root wheel 0x19f Mar 17 12:19 linuxguest crw------- 1 root wheel 0x1a1 Mar 17 12:19 otherguest
Mit Hilfe von bhyvectl
kann eine
virtuelle Maschine zerstört werden:
#
bhyvectl --destroy --vm=
guestname
Um das System so zu konfigurieren, dass bhyve-Gastsysteme beim Booten gestartet werden, müssen die folgenden Konfigurationen in den jeweiligen Dateien vorgenommen werden:
/etc/sysctl.conf
net.link.tap.up_on_open=1
/etc/rc.conf
cloned_interfaces="bridge0
tap0
" ifconfig_bridge0="addmigb0
addmtap0
" kld_list="vmm nmdm"
Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an
<de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an
<de-bsd-translators@de.FreeBSD.org>.