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. Derzeit unterstützt bhyve nur eine serielle Konsole und kann keine graphische Konsole emulieren. 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 http://ark.intel.com/search/advanced?s=t&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.2-RELEASE-amd64-bootonly.iso 100% of 230 MB 570 kBps 06m17sftp://ftp.freebsd.org/pub/FreeBSD/releases/ISO-IMAGES/10.2/FreeBSD-10.2-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
4
-m1024M
-ttap0
-dguest.img
-i -IFreeBSD-10.0-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
/etc/ttys
und ersetzen Sie die vorhandene
ttyu0
-Zeile durch:
ttyu0 "/usr/libexec/getty 3wire" xterm on secure
Beginnend mit FreeBSD 9.3-RELEASE und 10.1-RELEASE wird die Konsole automatisch konfiguriert.
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,
tap1
-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,
tap1
\$ -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
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,
tap1
-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,
tap1
-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, muss die folgenden Konfiguration in den jeweiligen Dateien vorgenommen werden:
/etc/sysctl.conf
net.link.tap.up_on_open=1
/boot/loader.conf
vmm_load="YES" nmdm_load="YES" if_bridge_load="YES" if_tap_load="YES"
/etc/rc.conf
cloned_interfaces="bridge0
tap0
" ifconfig_bridge0="addmigb0
addmtap0
"
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>.