2025-04-08 14:28:15 +02:00
> [!CAUTION]
> Heads up: As of April 8, 2025, this repo is no longer maintained. After discussion in issue [#544](https://github.com/churchers/vm-bhyve/issues/544), the project has found a new home under the FreeBSD organization:
>
> 👉 https://github.com/freebsd/vm-bhyve
>
> If you’ re looking to use, follow, or contribute to vm-bhyve, head over to the new repo!
2015-08-10 09:18:46 +01:00
## vm-bhyve
2015-06-24 09:58:30 +01:00
2015-08-10 09:18:46 +01:00
Management system for FreeBSD bhyve virtual machines
2015-08-10 09:19:21 +01:00
2015-08-10 09:18:46 +01:00
Some of the main features include:
2015-06-24 09:58:30 +01:00
2017-04-18 13:47:25 +01:00
* Windows/UEFI support
2015-08-10 09:18:46 +01:00
* Simple commands to create/start/stop bhyve instances
* Simple configuration file format
2018-06-22 08:02:54 +00:00
* Virtual switches supporting vlans & automatic device creation
2015-08-10 09:18:46 +01:00
* ZFS support
2021-12-31 18:00:09 -05:00
* FreeBSD/MidnightBSD/NetBSD/OpenBSD/Linux guest support
2015-08-10 09:18:46 +01:00
* Automatic assignment of console devices to access guest console
2015-08-10 09:30:03 +01:00
* Integration with rc.d startup/shutdown
2015-08-10 09:18:46 +01:00
* Guest reboot handling
2015-10-14 13:27:51 +01:00
* Designed with multiple compute nodes + shared storage in mind (NFS/iSCSI/etc)
2018-06-22 08:02:54 +00:00
* Multiple datastores
2018-07-25 16:30:57 +01:00
* VNC graphics & tmux support (1.1+ only. See wiki for instructions)
* Dependency free**
** Some additional packages may be required in certain circumstances -
2018-07-26 13:23:12 +01:00
* `sysutils/grub2-bhyve` is required to run Linux or any other guests that need a Grub bootloader.
2018-07-25 16:30:57 +01:00
* `sysutils/bhyve-firmware` is required to run UEFI guests
* `sysutils/tmux` is needed to use tmux console access instead of cu/nmdm
2015-06-24 09:58:30 +01:00
2016-04-20 13:55:38 +01:00
##### See the GitHub wiki for more information and examples.
2016-04-11 11:17:26 +01:00
2016-07-16 19:14:48 +01:00
For most users, I recommend using the version in ports (1.1+).
Main development happens in the master branch on GitHub and it may contain broken or incomplete features.
2016-04-19 12:17:51 +01:00
2016-04-08 14:17:01 +01:00
## Quick-Start
A simple overview of the commands needed to install vm-bhyve and start a freebsd guest.
See the sections below for more in-depth details.
1. pkg install vm-bhyve
2. zfs create pool/vm
2018-04-30 00:29:17 +02:00
3. sysrc vm_enable="YES"
4. sysrc vm_dir="zfs:pool/vm"
2016-04-08 14:17:01 +01:00
5. vm init
6. cp /usr/local/share/examples/vm-bhyve/* /mountpoint/for/pool/vm/.templates/
7. vm switch create public
8. vm switch add public em0
2025-01-12 19:36:46 +01:00
9. vm iso https://download.freebsd.org/ftp/releases/ISO-IMAGES/14.2/FreeBSD-14.2-RELEASE-amd64-bootonly.iso
2016-04-08 14:17:01 +01:00
10. vm create myguest
2025-01-12 19:36:46 +01:00
11. vm install [-f] myguest FreeBSD-14.2-RELEASE-amd64-bootonly.iso
2016-04-08 14:17:01 +01:00
12. vm console myguest
- [ ] Line 1
Install vm-bhvye
- [ ] Line 2
Create a dataset for your virtual machines.
2016-04-08 14:18:20 +01:00
If you're not using ZFS, just create a normal directory.
2016-04-08 14:17:01 +01:00
- [ ] Lines 3-4
2016-04-08 14:18:20 +01:00
Enable vm-bhyve in /etc/rc.conf and set the dataset to use.
If not using ZFS, just set `$vm_dir="/my/vm/folder"` .
2016-04-08 14:17:01 +01:00
- [ ] Line 5
2016-04-08 14:18:20 +01:00
Run the `vm init` command to create the required directories under $vm_dir and load kernel modules.
2016-04-08 14:17:01 +01:00
- [ ] Line 6
2016-04-08 14:18:20 +01:00
Install the sample templates that come with vm-bhyve.
2016-04-08 14:17:01 +01:00
- [ ] Lines 7-8
2016-04-08 14:18:20 +01:00
Create a virtual switch called 'public' and attach your network interface to it.
Replace `em0` with whatever interface connects your machine to the network.
2016-04-08 14:17:01 +01:00
- [ ] Line 9
2016-04-08 14:18:20 +01:00
Download a copy of FreeBSD from the ftp site.
2016-04-08 14:17:01 +01:00
- [ ] Lines 10-12
Create a new guest using the `default.conf` template, run the installer and
then connect to its console. At this point proceed through the installation
2016-04-09 11:43:29 +01:00
as normal. By specifying the `-f` option before the install command, the guest
2016-04-09 11:46:55 +01:00
will run directly on your terminal so the `console` command is not required. (Bear
in mind that you won't get back to your terminal until the guest is fully shutdown)
2016-04-08 14:17:01 +01:00
2015-08-10 09:18:46 +01:00
## Install
2015-06-30 08:37:37 +01:00
2018-04-30 00:29:17 +02:00
Download the latest release from GitHub, or install `sysutils/vm-bhyve`
2015-06-30 08:37:37 +01:00
2015-08-10 09:18:46 +01:00
To install, just run the following command inside the vm-bhyve source directory
2015-07-11 11:54:22 +01:00
2015-08-10 09:18:46 +01:00
# make install
2015-06-24 09:58:30 +01:00
2015-08-10 09:30:03 +01:00
If you want to run guests other than FreeBSD, you will need the grub2-bhyve package;
# pkg install grub2-bhyve
2015-08-10 09:18:46 +01:00
## Initial configuration
2015-07-11 11:54:22 +01:00
2015-08-10 09:30:03 +01:00
First of all, you will need a directory to store all your virtual machines and vm-bhyve configuration.
2015-08-10 09:18:46 +01:00
If you are not using ZFS, just create a normal directory:
2015-06-24 12:20:49 +01:00
2015-08-10 09:18:46 +01:00
# mkdir /somefolder/vm
2015-06-24 09:58:30 +01:00
2015-08-10 09:18:46 +01:00
If you are using ZFS, create a dataset to hold vm-bhyve data
# zfs create pool/vm
Now update /etc/rc.conf to enable vm-bhyve, and tell it where your directory is
2015-06-24 09:58:30 +01:00
vm_enable="YES"
2015-08-10 09:18:46 +01:00
vm_dir="/somefolder/vm"
Or with ZFS:
2015-08-06 19:31:08 +01:00
2015-08-10 09:18:46 +01:00
vm_enable="YES"
vm_dir="zfs:pool/vm"
2015-08-06 19:31:08 +01:00
2015-08-10 09:18:46 +01:00
This directory will be referred to as $vm_dir in the rest of this readme.
2015-08-07 11:03:26 +01:00
2015-08-10 09:30:03 +01:00
Now run the following command to create the directories used to store vm-bhvye configuration and
load any necessary kernel modules. This needs to be run once after each host reboot, which is
normally handled by the rc.d script
2015-06-24 10:06:54 +01:00
2015-06-24 09:58:30 +01:00
# vm init
2015-08-10 09:18:46 +01:00
## Virtual machine templates
When creating a virtual machine, you use a template which defines how much memory to give the guest,
2015-08-10 09:30:03 +01:00
how many cpu cores, and networking/disk configuration. The templates are all stored inside $vm_dir/.templates.
2015-08-10 09:18:46 +01:00
To install the sample templates, run the following command:
# cp /usr/local/share/examples/vm-bhyve/* /my/vm/path/.templates/
If you look inside the template files with a text editor, you will see they are very simple. You
2015-10-14 13:27:51 +01:00
can create as many templates as you like. For example you could have web-server.conf, containing the setting
2015-08-10 09:30:03 +01:00
for your web servers, or freebsd-large.conf for large FreeBSD guests, and so on. This is the contents of
the default template:
guest="freebsd"
2016-04-07 17:58:23 +01:00
loader="bhyveload"
2015-08-10 09:30:03 +01:00
cpu=1
memory=256M
disk0_type="virtio-blk"
disk0_name="disk0.img"
network0_type="virtio-net"
network0_switch="public"
2015-08-10 09:18:46 +01:00
You will notice that each template is set to create one network interface. You can easily add more network
2015-08-10 09:30:03 +01:00
interfaces by duplicating the two network configuration options and incrementing the number. In general you
will not want to change the type from 'virtio-net', but you will notice the first interface is set to connect
to a switch called 'public'. See the next section for details on how to configure virtual switches.
2015-08-10 09:18:46 +01:00
2015-11-09 13:39:32 +00:00
I recommend reading the man page or `sample-templates/config.sample` for a full list of supported template
options and a description of their purpose. Almost all bhyve functionality is supported and a large variety
of network/storage configurations can be achieved.
2015-08-10 09:18:46 +01:00
## Virtual Switches
2015-06-24 09:58:30 +01:00
2015-08-10 09:18:46 +01:00
When a guest is started, each network interface is automatically connected to the virtual switch specified
in the configuration file. By default all the sample templates connect to a switch called 'public', although
you can use any name. The following section shows how to create a switch called 'public', and configure various
settings:
2015-06-24 09:58:30 +01:00
# vm switch create public
2015-08-10 09:18:46 +01:00
If you just want to bridge guests to your physical network, add the appropriate real interface to the switch.
2015-08-10 09:30:03 +01:00
Obviously you will need to replace em0 here with the correct interface name on your system:
2015-08-10 09:18:46 +01:00
2015-06-24 09:58:30 +01:00
# vm switch add public em0
2015-08-10 09:18:46 +01:00
If you want guest traffic to be on a specific VLAN when leaving the host, specify a vlan number. To turn
off vlans, just set the vlan number to 0:
2015-06-24 09:58:30 +01:00
# vm switch vlan public 10
2015-08-10 09:18:46 +01:00
# vm switch vlan public 0
You can view current switch configuration using the list command:
2015-06-24 09:58:30 +01:00
# vm switch list
2015-08-07 16:52:07 +01:00
2015-08-10 09:18:46 +01:00
## Creating virtual machines
2015-08-07 16:52:07 +01:00
2015-08-10 09:18:46 +01:00
Use one of the following command to create a new virtual machine:
2015-08-07 16:52:07 +01:00
2015-08-10 09:18:46 +01:00
# vm create testvm
# vm create -t templatename -s 50G testvm
2015-08-07 16:52:07 +01:00
2015-08-10 09:18:46 +01:00
The first example uses the default.conf template, and will create a 20GB disk image. The second
example specifies the templatename.conf template, and tells vm-bhyve to create a 50GB disk.
2015-08-08 12:21:01 +01:00
2015-08-10 09:18:46 +01:00
You will need an ISO to install the guest with, so download one using the iso command:
2015-08-07 16:52:07 +01:00
2025-01-12 19:36:46 +01:00
# vm iso https://download.freebsd.org/ftp/releases/ISO-IMAGES/14.2/FreeBSD-14.2-RELEASE-amd64-disc1.iso
2015-08-07 16:52:07 +01:00
2015-08-10 09:18:46 +01:00
To start a guest install, run the following command. vm-bhyve will run the machine in the background,
so use the console command to connect to it and finish installation.
2015-06-24 09:58:30 +01:00
2025-01-12 19:36:46 +01:00
# vm install testvm FreeBSD-14.2-RELEASE-amd64-disc1.iso
2015-08-10 09:18:46 +01:00
# vm console testvm
2015-06-24 09:58:30 +01:00
2016-04-09 11:32:06 +01:00
You can also specify the foreground option to run the guest directly on your terminal:
2025-01-12 19:36:46 +01:00
# vm install -f testvm FreeBSD-14.2-RELEASE-amd64-disc1.iso
2016-04-09 11:32:06 +01:00
2015-08-10 09:18:46 +01:00
Once installation has finished, you can reboot the guest from inside the console and it will boot up into
2015-08-10 09:30:03 +01:00
the new OS (assuming installation was successful). Further reboots will work as expected and
2015-08-10 09:18:46 +01:00
the guest can be shutdown in the normal way. As the console uses the cu command, type ~+Ctrl-D to exit
back to your host.
2015-06-24 09:58:30 +01:00
2015-08-10 09:18:46 +01:00
The following commands start and stop virtual machines:
2015-06-24 09:58:30 +01:00
2015-08-10 09:18:46 +01:00
# vm start testvm
# vm stop testvm
2015-06-24 10:21:48 +01:00
2015-08-10 09:18:46 +01:00
The basic configuration of each machine and state can be viewed using the list command:
2015-06-24 09:58:30 +01:00
2015-08-10 09:18:46 +01:00
# vm list
2016-04-07 17:52:43 +01:00
NAME GUEST LOADER CPU MEMORY AUTOSTART STATE
alpine linux default 1 512M No Stopped
c7 linux default 1 512M Yes [2] Stopped
centos linux default 1 512M No Stopped
debian linux default 1 512M No Stopped
fbsd freebsd default 1 256M No Stopped
netbsd generic grub 1 256M No Stopped
openbsd generic grub 1 256M No Stopped
pf freebsd default 1 256M Yes [1] Stopped
ubuntu linux default 1 512M No Stopped
wintest windows default 2 2G No Running (2796)
2015-06-24 09:58:30 +01:00
2015-08-10 09:18:46 +01:00
All running machines can be stopped using the stopall command
2015-06-24 09:58:30 +01:00
2015-08-10 09:18:46 +01:00
# vm stopall
2015-06-24 09:58:30 +01:00
2015-08-10 09:18:46 +01:00
On host boot, vm-bhyve will use the 'vm startall' command to start all machines. You can
control which guests start automatically using the following variables in /etc/rc.conf:
2015-06-24 09:58:30 +01:00
2015-08-10 09:18:46 +01:00
vm_list="vm1 vm2"
vm_delay="5"
2015-06-24 09:58:30 +01:00
2015-08-10 09:18:46 +01:00
The first defines the list of machines to start on boot, and the order to start them. The second
is the number of seconds to wait between starting each one. 5 seconds is the recommended setting,
although a longer delay is useful if you have disk intensive guests and don't want them all booting
at the same time.
2015-06-24 09:58:30 +01:00
2017-09-10 12:23:38 +02:00
There's also a command which opens a guest's configuration file in your default text editor, allowing
2015-08-10 09:18:46 +01:00
you to easily make changes to the configuration. Please note that changes only take effect after
a full shutdown and restart of the guest
2015-06-24 09:58:30 +01:00
2015-08-10 09:18:46 +01:00
# vm configure testvm
2015-08-10 09:30:03 +01:00
See the man page for a full description of all available commands.
# man vm
2018-11-16 14:51:08 +01:00
## Using cloud images
You can use cloud images to create virtual machines. The `vm img` command will download the image to datastore and
uncompress it if needed (.xz, .tar.gz, and .gz files are supported). The image should be in RAW or QCOW2 format.
2022-12-19 08:52:32 +01:00
To use this feature you'll need install qemu-tools package:
2018-12-05 00:30:41 +01:00
2022-12-19 08:52:32 +01:00
# pkg install qemu-tools
2018-11-16 14:51:08 +01:00
To launch FreeBSD using official cloud image:
2025-01-12 19:36:46 +01:00
# vm img https://download.freebsd.org/ftp/releases/VM-IMAGES/14.2-RELEASE/amd64/Latest/FreeBSD-14.2-RELEASE-amd64.raw.xz
# vm create -t freebsd-zvol -i FreeBSD-14.2-RELEASE-amd64.raw freebsd-cloud
2018-11-16 14:51:08 +01:00
# vm start freebsd-cloud
To list downloaded images:
# vm img
DATASTORE FILENAME
default CentOS-7-x86_64-GenericCloud-20180930_02.raw
default debian-9-openstack-amd64.qcow2
default Fedora-AtomicHost-28-1.1.x86_64.raw
2025-01-12 19:36:46 +01:00
default FreeBSD-14.2-RELEASE-amd64.raw
2018-11-16 14:51:08 +01:00
default xenial-server-cloudimg-amd64-uefi1.img
2019-01-28 18:21:22 +01:00
2025-02-12 23:41:52 +09:00
## Using cloud-init
2019-01-28 18:21:22 +01:00
vm-bhyve has basic support for providing cloud-init configuration to the guest. You can enable it with `-C` option
2025-02-12 23:41:52 +09:00
to `vm create` command. You can also pass public SSH key to be injected into the guest with option `-k <file>` .
The public key file can contain multiple public SSH keys, one per line, in the `authorized_keys` format.
2019-01-28 18:21:22 +01:00
Example:
# vm create -t linux -i xenial-server-cloudimg-amd64-uefi1.img -C -k ~/.ssh/id_rsa.pub cloud-init-ubuntu
# vm start cloud-init-ubuntu
Starting cloud-init-ubuntu
* found guest in /zroot/vm/cloud-init-ubuntu
* booting...
# ssh ubuntu@192 .168.0.91
The authenticity of host '192.168.0.91 (192.168.0.91)' can't be established.
ECDSA key fingerprint is SHA256:6s9uReyhsIXRv0dVRcBCKMHtY0kDYRV7zbM7ot6u604.
No matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.91' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-141-generic x86_64)
2025-02-12 23:41:52 +09:00
2016-03-27 14:30:54 +10:00
## Adding custom disks
2016-03-28 12:37:52 +10:00
Scenario: If you have a vm on one zpool and would like to add a new virtual disk to it that resides on a different zpool.
2016-03-27 14:30:54 +10:00
2016-03-28 12:37:52 +10:00
Manually create a sparse-zvol (in this case 50G in size).
2016-03-27 14:30:54 +10:00
2016-03-28 12:37:52 +10:00
# zfs create -sV 50G -o volmode=dev "zpool2/vm/yourvm/disk1"
2016-03-27 14:30:54 +10:00
2016-03-28 12:37:52 +10:00
Add it to your vm config file.
2016-04-05 16:15:30 +01:00
Please note, for Windows guests the type will need to be `ahci-hd` , as it does not have virtio-blk drivers.
2016-03-28 12:37:52 +10:00
# vm configure yourvm
disk1_name="/dev/zvol/zpool2/vm/yourvm/disk1"
2016-03-27 14:30:54 +10:00
disk1_type="virtio-blk"
disk1_dev="custom"
2016-03-28 12:37:52 +10:00
2016-03-27 14:30:54 +10:00
Restart your vm.
2015-10-09 15:42:11 +01:00
## Windows Support
2018-10-08 11:13:32 +01:00
Please see the Windows section in the [Wiki ](https://github.com/churchers/vm-bhyve/wiki/Running-Windows )
2015-10-15 12:19:05 +01:00
## Autocomplete
2015-10-23 11:45:23 +01:00
If you are using the default csh/tcsh shell built into FreeBSD, running the following command should allow
2015-10-22 12:45:13 +01:00
autocomplete to work for all the currently supported functions. This is especially useful for viewing
2017-09-10 12:23:38 +02:00
and completing guest & ISO file names. Please note that there's three occurrences of '/path/to/vm' which
2015-10-22 12:45:13 +01:00
need to be changed to the directory containing your virtual machines.
2015-10-15 12:19:05 +01:00
2015-10-23 11:45:23 +01:00
To make the autocomplete features available permanently, add the following to your `$HOME/.cshrc` file. Then either
logout/login, or run `source ~/.cshrc` to cause the `.cshrc` file to be reloaded.
2015-10-15 12:19:05 +01:00
complete vm \
2015-10-22 12:37:33 +01:00
'p@1 @(list create install start stop console configure reset poweroff destroy clone snapshot rollback add switch iso)@' \
2015-10-15 12:19:05 +01:00
'n@create@n @' \
'n@list@n @' \
'n@iso@n @' \
'n@switch @(list create add remove destroy vlan nat)@' \
2015-10-15 12:28:40 +01:00
'N@switch @`sysrc -inqf /path/to/vm/.config/switch switch_list` @' \
2015-10-22 12:37:33 +01:00
'N@install @`ls -1 /path/to/vm/.iso` @' \
2015-10-15 12:19:05 +01:00
'N@nat @(off on)@' \
2015-10-15 12:28:40 +01:00
'p@2 @`ls -1 /path/to/vm | grep -v "^\." | grep -v "^images"` @'