Virtualization with bhyve
NOTE: the author/maintainer of the tutorial(s) is no longer with the show, so the information below may be outdated or incorrect.
Virtualization has been a hot topic for a while now, and there are lots of options for it. On FreeBSD, there's the often-copied jail feature. For a lot of use cases, that's ideal. There's no overhead, they're very secure and they offer supreme flexibility. However, sometimes people need to use other operating systems. You could use a userland application like VirtualBox, but performance leaves something to be desired. There are times when performance needs to be at the top of the list. For those times, you'll need something else.
You'll need bhyve.
Short for the BSD Hypervisor, bhyve is a great virtualization technology in the vein of Xen or KVM, but done BSD style and without legacy support. It's a type 2 hypervisor that lets you run other operating systems under FreeBSD. It was officially released in FreeBSD 10.0. So enough talking, let's get it set up. Keep in mind that bhyve requires an Intel CPU with VT-x and Extended Page Table support.
Start off by creating a disk image to use for the VM. We'll use a 10GB file.
# truncate -s 10g bhyve1.img
Load the bhyve kernel module.
# kldload vmm
Create a bridge and your tap network interface.
# ifconfig bridge0 create # ifconfig tap0 create # sysctl net.link.tap.up_on_open=1
Add your LAN interface and the tap interface to the bridge. The NIC is called igb0 in this case.
# ifconfig bridge0 addm igb0 addm tap0 # ifconfig bridge0 up
Download a copy of FreeBSD to install.
# fetch ftp://ftp.freebsd.org/pub/FreeBSD/ISO-IMAGES-amd64/10.0/FreeBSD-10.0-RC5-amd64-bootonly.iso
Copy the template bhyve script. (Official Instructions)
# cp /usr/share/examples/bhyve/vmrun.sh bhyve1.sh # chmod +x bhyve1.sh
Configure the number of CPUs, amount of ram, name of disk image.
# vi bhyve1.sh
Start bhyve in installation mode.
# ./bhyve1.sh -i -I FreeBSD-10.0-RC5-amd64-bootonly.iso fbsd10
Do an install as usual, but at the end, choose to enter a shell on the installed system. Because bhyve does not emulate a graphics card, only a serial console, we need to configure the system to boot with the serial console.
# vi /etc/ttys
Change this line:
console none unknown off secure
To the following:
console "/usr/libexec/getty std.9600" xterm on secure
Now, restart the vm, and choose reboot from the beastie menu to exit.
Rebooting exits bhyve, so lets start it again without the install disk.
# ./bhyve1.sh fbsd10
You now have a working FreeBSD in bhyve.
Select reboot, or hit ESC and type quit, from the beastie menu to exit. The vmrun script tries to keep your vm running so restarts it when it crashes/exits.
# ifconfig tap1 create # ifconfig bridge0 addm tap1
Download this working OpenBSD image:
# fetch http://people.freebsd.org/~grehan/flashimg.amd64-20131014.bz2 # bunzip2 flashimg.amd64-20131014.bz2
Create a grub device map, obsd.map, containing:
(hd0) ./obsd.img Booting the OpenBSD image: grub-bhyve -m obsd.map -r hd0 -M 512 obsd
This will start grub, enter the following:
kopenbsd -h com0 (hd0,openbsd1)/bsd boot
# bhyve -c 2 -m 512M -A -H -P -s 0:0,amd_hostbridge -s \ 1:0,lpc -s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,obsd.img -l com1,stdio -W obsd
The image may fail to boot because it was shutdown improperly, restarting it should resolve this. The root password is: test123
Clean up the VM:
# bhyvectl --destroy --vm=obsd
This tutorial is ongoing and will be updated at a later time to include autostarting.