Benutzer-Werkzeuge

Webseiten-Werkzeuge


freebsd:bhyve

Dies ist eine alte Version des Dokuments!


Bhyve

Bhyve ist ein Hypervisor, auf dem Gastbetriebssysteme in einer virtuellen Maschine ausgeführt werden.

Bhyve installieren

das Virtualisierungsmodul laden:

> kldload vmm
> echo 'vmm_load="YES"' >> /boot/loader.conf

die Netzwerkanbindung vorbereiten:

> ifconfig tap0 create
> sysctl net.link.tap.up_on_open=1
net.link.tap.up_on_open: 0 -> 1
> ifconfig bridge0 create
> ifconfig bridge0 addm igb0 addm tap0
> ifconfig bridge0 up

Konfiguration persistent machen, damit sie nach einem Reboot wieder vorhanden ist:

> echo "net.link.tap.up_on_open=1" >> /etc/sysctl.conf
> echo 'cloned_interfaces="bridge0 tap0"' >> /etc/rc.conf
> echo 'ifconfig_bridge0="addm igb0 addm tap0"' >> /etc/rc.conf
> echo 'kld_list="vmm nmdm"' >> /etc/rc.conf

für eine 2. VM bräuchte man dann ein weiteres TAP:

> ifconfig tap1 create
> ifconfig bridge0 addm tap1

und diese beiden Zeilen müssten dann in der geändert werden:

> vi /etc/rc.conf
...
cloned_interfaces="bridge0 tap0 tap1"
ifconfig_bridge0="addm igb0 addm tap0 addm tap1"
...

FreeBSD als Gast in der VM starten

eine virtuelle Festplatte erstellen:

> truncate -s 16G freebsd.img

FreeBSD 10.3 in der VM installieren:

> sh /usr/share/examples/bhyve/vmrun.sh -c 1 -m 1024M -t tap0 -d freebsd.img -i -I FreeBSD-10.3-RELEASE-amd64-bootonly.iso guestname

die VM von ihrer virtuellen Platte starten:

> sh /usr/share/examples/bhyve/vmrun.sh -c 4 -m 1024M -t tap0 -d freebsd.img guestname

Bhyve-Netzwerkkonfiguration

    • NAT - VM und Host gehen über die selbe Netzwerkkarte und der selben IP ins Netz
    • Bridged networking - VM und Host gehen über die selbe Netzwerkkarte aber unterschiedlichen IPs ins Netz
      • bhyve -c 2 -m 4G -w -H -s 0,hostbridge -s 3,ahci-cd,/home/novel/FreeBSD-11.0-CURRENT-amd64-20160217-r295683-disc1.iso -s 5,virtio-net,tap1 -s 29,fbuf,tcp=0.0.0.0:5900,w=800,h=600,wait -s 30,xhci,tablet -s 31,lpc -l com1,stdio -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd vm0
    • NIC Passthrough - eine Netzwerkkarte alleine nur für die VM
      • bhyve -c 2 -m 1G -w -H -S -s 0,hostbridge -s 4,ahci-hd,/home/novel/img/uefi_fbsd.raw -s 6,passthru,3/0/0 -s 29,fbuf,tcp=0.0.0.0:5900,w=800,h=600,wait -s 30,xhci,tablet -s 31,lpc -l com1,stdio -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd vm0

Bridged networking - VM und Host gehen über die selbe Netzwerkkarte aber unterschiedlichen IPs ins Netz

> pkg install sysutils/grub2-bhyve

eine virtuelle Festplatte erstellen:

> truncate -s 16G linux.img

Linux als Gast in der VM installieren

Map-Datei für den Grub anlegen:

> vi device.map
(hd0) ./linux.img
(cd0) ./buntu-20.04-legacy-server-amd64.iso

Grub läd den Linux-Kernel vom Installations-ISO-Image:

> grub-bhyve -m device.map -r cd0 -M 1024M linuxguest

VM starten:

> ubhyve -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,./buntu-20.04-legacy-server-amd64.iso -l com1,stdio -c 4 -m 1024M linuxguest
> bhyvectl --destroy --vm=linuxguest

in der VM installiertes Linux starten

Map-Datei für den Grub anpassen:

> vi device.map
(hd0) ./linux.img

Grub läd den Linux-Kernel von der virtuellen Festplatte:

> grub-bhyve -m device.map -r hd0,msdos1 -M 1024M linuxguest

VM starten:

> 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 -c 4 -m 1024M linuxguest
> bhyvectl --destroy --vm=linuxguest

Konsolen in der virtuellen Maschine

> 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 -c 4 -m 1024M linuxguest
> cu -l /dev/nmdm0B
Connected

Ubuntu 13.10 handbook ttyS0

handbook login:

Virtuelle Maschinen verwalten

> 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
> bhyvectl --destroy --vm=guestname

vereinfachen per Skript am Beispiel einer Minecraft-VM

Das Host-System heißt in diesem Beispiel "server", die VM hat die IP "192.168.1.250" und den Namen "minecraft". Auf dem Host-System tun wir fast alles als Benutzer "fritz" und in der VM als "root".

Die VM sollte derart vorbereitet sein, dass "fritz" sich passwortlos per ssh root@192.168.1.250 einloggen kann.

  • dazu muss eine statische Netzwerkkonfiguration im VM-OS konfiguriert sein
  • weiterhin muss der Benutzer "fritz" einen SSH-Schlüssel besitzen
  • und der öffentliche Teil von "fritz" seinem SSH-Schlüssel muss beim Benutzer "root" in der VM hinterlegt werden ⇒ Schlüsselpaar generieren

Dann ist das stoppen der VM viel einfacher.

Auch wenn das Verzeichnis /home/Minecraft/ in diesem Fall unter /home/ liegt, ist es kein Home-Verzeichnis. Ich habe es nur als allgemeinen Ablageort für die Dateien bezüglich dieser VM gewählt:

> ls -lha /home/Minecraft/
drwxr-xr-x   3 root  wheel    10B 13 Nov. 02:22 .
drwxr-xr-x  31 root  wheel    52B 13 Nov. 09:13 ..
-rwxr-xr-x   1 root  wheel   754B 13 Nov. 09:11 Minecraft_VM.sh
drwxr-xr-x   2 root  wheel     3B 13 Nov. 01:56 bin
-rw-r--r--   1 root  wheel    32B 13 Nov. 00:59 device.map
-rw-r--r--   1 root  wheel   100G 13 Nov. 09:50 linux.img
-rwx------   1 root  wheel   787M 12 Nov. 23:10 ubuntu-20.04-legacy-server-amd64.iso

> ls -lha /home/Minecraft/bin/
drwxr-xr-x  2 root  wheel     3B 13 Nov. 01:56 .
drwxr-xr-x  3 root  wheel    10B 13 Nov. 02:22 ..
-rwxr-xr-x  1 root  wheel    88B 13 Nov. 01:58 mc.sh
/home/Minecraft/Minecraft_VM.sh
#!/bin/bash
 
VM_GAST="Minecraft"
HDD="linux.img"
CDROM="ubuntu-20.04-legacy-server-amd64.iso"
CPU="2"
RAM="16G"
NETZWK="tap0"
 
#==============================================================================#
 
cd $(dirname ${0}) || exit 123
 
ps alxwww | fgrep -v grep | fgrep grub-bhyve | fgrep Minecraft && killall grub-bhyve
sleep 0.5
ps alxwww | fgrep -v grep | fgrep grub-bhyve | fgrep Minecraft && killall grub-bhyve
sleep 0.5
 
grub-bhyve -m device.map -r hd0,msdos1 -M ${RAM} ${VM_GAST}
bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,${NETZWK} -s 3:0,virtio-blk,./${HDD} -l com1,stdio -c ${CPU} -m ${RAM} ${VM_GAST}
 
bhyvectl --destroy --vm=${VM_GAST}
ls -lha /dev/vmm/
 
#==============================================================================#
/home/Minecraft/bin/mc.sh
#!/bin/bash
 
screen -S Minecraft /home/Minecraft/Minecraft_VM.sh
> echo "fritz           ALL=NOPASSWD:/home/Minecraft/bin/mc.sh" > /usr/local/etc/sudoers.d/minecraft

starten:

[fritz@server ~]$ sudo /home/Minecraft/bin/mc.sh

Kontrolle:

[fritz@server ~]$ sudo /home/Minecraft/bin/mc.sh
[fritz@server ~]$ ls -lha /dev/vmm/
total 2
dr-xr-xr-x   2 root  wheel   512B 13 Nov. 09:22 .
dr-xr-xr-x  36 root  wheel   512B  3 Nov. 11:01 ..
crw-------   1 root  wheel   0x9b 13 Nov. 09:22 Minecraft

[root@server ~]# screen -ls
There are screens on:
        3793.Minecraft  (Detached)
1 Socket in /tmp/screens/S-root.

"fritz" verbindet sich über das Netzwerk mit der VM:

[fritz@server ~]$ ssh root@192.168.1.250

"root" öffnet den Screen, in dem die VM läuft (Konsolenzugang):

[root@server ~]# screen -x Minecraft

stoppen:

[fritz@server ~]$ ssh root@192.168.1.250 halt -p

Minecraft in der VM installieren

soweit ist jetzt alles vorbereitet, jetzt kann Minecraft installiert werden ⇒ So erstellen Sie einen Minecraft-Server unter Ubuntu 20.04

Den gewünschten Minecraft-Server kann man beispielsweise von hier (die neueste von spigot) oder hier (die stabilste von spigot) runterladen.

in der VM müssen folgende Kommandos ausgeführt werden:

root@minecraft:~# apt update
root@minecraft:~# apt full-upgrade
root@minecraft:~# apt install openjdk-8-jre-headless screen vim mc net-tools
root@minecraft:~# mkdir Minecraft_Server
root@minecraft:~# cd Minecraft_Server
root@minecraft:~/Minecraft_Server# wget https://cdn.getbukkit.org/spigot/spigot-1.16.1.jar -O spigot-1.16.1.jar
root@minecraft:~/Minecraft_Server# java -Xmx3G -Xms3G -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M -jar spigot-1.16.1.jar nogui
root@minecraft:~/Minecraft_Server# echo "eula=true" >> eula.txt
root@minecraft:~/Minecraft_Server# cp server.properties server.properties_original
root@minecraft:~/Minecraft_Server# cat server.properties_original | sed "s/server-ip=.*/server-ip=$(hostname -i)/" > server.properties

Skripte zum starten des Minecraft-Servers

Das Ubuntu-Linux 20.04 wurde in der VM bei der Installation mit dem Hostnamen "minecraft", dem Benutzer "mc" und der IP "192.168.1.250" konfiguriert. Der Hostname und die IP wurden auch im DNS eingetragen.

Die VM sollte derart vorbereitet sein, dass "mc" sich passwortlos per ssh root@192.168.1.250 einloggen kann.

  • dazu muss eine statische Netzwerkkonfiguration im VM-OS konfiguriert sein
  • weiterhin muss der Benutzer "mc" einen SSH-Schlüssel besitzen
  • und der öffentliche Teil von "mc" seinem SSH-Schlüssel muss beim Benutzer "root" in der VM hinterlegt werden ⇒ Schlüsselpaar generieren

Dann ist das stoppen der VM viel einfacher.

root@minecraft:~# ls -lh /root/
drwxr-xr-x 2 root root 4.0K Nov 13 13:33 bin
drwx------ 7 root root 4.0K Nov 13 14:16 Minecraft_Server
-rw-r--r-- 1 root root    0 Nov 13 11:13 systemctl
root@minecraft:~# ls -lh /root/bin/
-rwxr-xr-x 1 root root 620 Nov 13 13:33 mc.sh
-rwxr-xr-x 1 root root 206 Nov 13 10:59 Start.sh
/root/bin/mc.sh
#!/usr/bin/env bash
#
 
SERVER_JAR="spigot-1.16.1.jar"
SPEICHER="3G"
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
 
echo java -Xmx3G -Xms3G -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M -jar spigot-1.16.1.jar nogui
cd /root/Minecraft_Server/ && java -Xmx${SPEICHER} -Xms${SPEICHER} -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M -jar ${SERVER_JAR} nogui
 
#read PAUSE
/root/bin/Start.sh
#!/usr/bin/env bash
#
 
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
 
cd /root/Minecraft_Server/ || exit 123
screen -S Minecraft /root/bin/mc.sh

Start-Prozedur des Minecraft-Servers

einloggen in die VM:

[fritz@server ~]$ ssh root@192.168.1.250

Minecraft-Servers starten:

root@minecraft:~# /root/bin/Start.sh

aus dem Screen raus gehen:

[Strg]+[a],[d]

Kontrolle:

screen -ls

Stop-Prozedur des Minecraft-Servers

Entweder hat man die Konsole vom Start des Minecraft-Servers noch offen, dann kann man dort einfach "stop" eingeben.

… oder man muss sich wieder in die VM einloggen:

[fritz@server ~]$ ssh root@192.168.1.250

root@minecraft:~# screen -ls
There is a screen on:
        1653.Minecraft  (11/13/2020 01:33:14 PM)        (Attached)
1 Socket in /run/screen/S-root.

root@minecraft:~# screen -x Minecraft
> stop

NIC Passthrough - eine Netzwerkkarte alleine nur für die VM

> pciconf -v -l | fgrep -A1 -B3 network
em1@pci0:0:31:6:        class=0x020000 rev=0x00 hdr=0x00 vendor=0x8086 device=0x0d4d subvendor=0x1849 subdevice=0x0d4d
   vendor     = 'Intel Corporation'
   device     = 'Ethernet Connection (11) I219-V'
   class      = network
   subclass   = ethernet

Ethernet Connection: em1@pci0:0:31:6 → 0/31/6

das hier funktioniert bei mir nicht:

> echo 'pptdevs="0/31/6"' >> /boot/loader.conf
> reboot
> devctl set driver -f pci0:0:31:6 ppt
> pciconf -lv | fgrep -A1 -B3 network
ppt0@pci0:0:31:6:       class=0x020000 rev=0x00 hdr=0x00 vendor=0x8086 device=0x0d4d subvendor=0x1849 subdevice=0x0d4d
    vendor     = 'Intel Corporation'
    device     = 'Ethernet Connection (11) I219-V'
    class      = network
    subclass   = ethernet

… PCI passthrough requires direct memory allocation, hence the -S flags.
bhyve PCI pass-through to Linux guest

> grub-bhyve -m device.map -r hd0,msdos1 -S -M 4G Linux
> bhyve -A -H -P -S -s 0:0,hostbridge -s 1:0,lpc -s 2:0,passthru,0/31/6 -s 3:0,virtio-blk,./linux.img -l com1,stdio -c 1 -m 4G Linux
> bhyvectl --destroy --vm=Linux
> ls -lha /dev/vmm
total 1
dr-xr-xr-x   2 root  wheel   512B Mar 16 02:23 .
dr-xr-xr-x  21 root  wheel   512B Mar 16 03:12 ..
crw-------   1 root  wheel   0xae Mar 16 02:23 Linux

Wenn jetzt kein Ping durchgeht, dann hat man sicherlich vergessen, ein Eth-Kabel anzuschließen. :-)

/home/http/wiki/data/attic/freebsd/bhyve.1620160951.txt · Zuletzt geändert: von manfred