.Dd November 16, 2016 .Dt VM-BHYVE 8 .Os .Sh NAME .Nm vm .Nd "utility to manage bhyve virtual machines" .Sh SYNOPSIS .Nm .Cm version .Nm .Cm init .Pp .Nm .Cm get .Ar all .Op Ar setting .Op Ar ... .Nm .Cm set .Ar setting=value .Op Ar ... .Pp .Nm .Cm switch list .Nm .Cm switch info .Op Ar name .Op Ar ... .Nm .Cm switch create .Op Fl t Ar type .Op Fl i Ar interface .Op Fl n Ar vlan-id .Op Fl b Ar bridge .Op Fl m Ar mtu .Op Fl a Ar address .Op Fl p .Ar name .Nm .Cm switch vlan .Ar name vlan-id .Nm .Cm switch nat .Ar name on|off .Nm .Cm switch address .Ar name a.b.c.d/xx|none .Nm .Cm switch private .Ar name on|off .Nm .Cm switch add .Ar name interface .Nm .Cm switch remove .Ar name interface .Nm .Cm switch destroy .Ar name .Pp .Nm .Cm datastore list .Nm .Cm datastore add .Ar name spec .Nm .Cm datastore remove .Ar name .Nm .Cm datastore iso .Ar name path .Pp .Nm .Cm create .Op Fl d Ar datastore .Op Fl t Ar template .Op Fl s Ar size .Ar name .Nm .Cm .Cm destroy .Op Fl f .Ar name .Nm .Cm list .Nm .Cm info .Op Ar name .Op Ar ... .Nm .Cm install .Op Fl fi .Ar name iso .Nm .Cm start .Op Fl fi .Ar name .Ar ... .Nm .Cm stop .Ar name .Ar ... .Nm .Cm restart .Ar name .Nm .Cm console .Ar name .Op Ar com1|com2 .Nm .Cm rename .Ar name .Ar new-name .Nm .Cm add .Op Fl d Ar device .Op Fl t Ar type .Op Fl s Ar size|switch .Ar name .Nm .Cm reset .Op Fl f .Ar name .Nm .Cm poweroff .Op Fl f .Ar name .Nm .Cm startall .Nm .Cm stopall .Op Fl f .Nm .Cm configure .Ar name .Nm .Cm passthru .Nm .Cm clone .Ar name[@snapshot] .Ar new-name .Nm .Cm snapshot .Op Fl f .Ar name|name@snapshot .Nm .Cm rollback .Op Fl r .Ar name@snapshot .Nm .Cm migrate .Op Fl s12t .Op Fl r Ar name .Op Fl i Ar snapshot .Op Fl d Ar datastore .Ar guest host .Pp .Nm .Cm iso .Op Ar -d datastore .Op Ar url .Pp .Nm .Cm image list .Nm .Cm image create .Op Fl d Ar description .Op Fl u .Ar name .Nm .Cm image provision .Op Fl d Ar datastore .Ar uuid .Ar new-name .Nm .Cm image destroy .Ar uuid .\" ============ DESCRIPTION ============= .Sh DESCRIPTION The .Nm utility is used to provide simplified management of .Xr bhyve 8 virtual machines, including networking and console access. .Pp Networking is handled by creating one or more virtual switches. Each switch has a simple name which is referenced in the virtual machine configuration file. The .Nm utility automatically creates a .Xr bridge 4 device for each virtual switch and assigns virtual machine .Xr tap 4 interfaces dynamically. .Pp All configuration for virtual machines is stored in a simple rc style configuration file. When virtual machines are first created, the configuration file is copied from a template which can be specified by the user. Multiple templates can be created providing an easy way to provision guests with specific configurations. .Pp .Nm gracefully handles reboot and shutdown commands from inside the guests, whilst providing full management of the virtual machine from the host system. .\" ============ BASIC SETUP ============ .Sh BASIC SETUP Once .Nm is installed, create the directory which will store your virtual machine configuration and data. This directory will be referred to as .Pa $vm_dir throughput this man page. .Pp Add the following into .Pa /etc/rc.conf .Bd -literal -offset indent vm_enable="YES" vm_dir="/your/vm/path" vm_list="" vm_delay="5" .Ed .Pp The first and second lines are required to enable the .Nm utility. Please see the .Cm startall command description for more information on the third and fourth settings. .Pp Now run the .Nm vm .Cm init command to finish initialisation. This will create subdirectories inside .Pa $vm_dir to hold configuration and templates. It will also load any required kernel modules. This command needs to be run on each boot, which is normally handled by the rc.d script. .Pp Sample templates are installed to .Pa /usr/local/share/examples/vm-bhyve/ . You can make use of these by copying them into your .Pa $vm_dir/.templates/ directory. You can create and edit the templates as required. It is recommended to keep a template called .Pa default.conf , as this will be used when no template is manually specified. .\" ============ ZFS ============= .Sh ZFS If you are using a ZFS dataset to store your virtual machines, and want a new child dataset created for each one, specify the dataset to use in .Pa /etc/rc.conf as follows: .Bd -literal -offset indent vm_dir="zfs:pool/dataset" .Ed .Pp In contrast to earlier versions, if .Pa $vm_dir is a normal path, a standard subdirectory will be created for each virtual machine, regardless of the file system type. However, .Nm is now able to handle situations where the dataset mountpoint does not match the dataset name. .\" ============ QUICKSTART ============= .Sh QUICKSTART Create a virtual switch called .Sy public (which is the switch name specified in the default templates) and attach it to a real interface. Use your own interface in place of .Sy em0 as required. .Bd -literal -offset ident # vm switch create public # vm switch add public em0 .Ed .Pp Download an ISO file to use for installation: .Bd -literal -offset ident # vm iso ftp://ftp.freebsd.org/pub/FreeBSD/releases/ISO-IMAGES/10.1/FreeBSD-10.1-RELEASE-amd64-disc1.iso .Ed .Pp Create a new guest using the default template and disk size, then start the installation. The .Ar install subcommand will immediately return you to your shell. Once started, use the .Ar console command to connect to the guest and complete the installation. .Bd -literal -offset ident # vm create my-guest # vm install my-guest FreeBSD-10.1-RELEASE-amd64-disc1.iso # vm console my-guest .Ed .Pp Please note that Linux guests currently require the .Sy sysutils/grub2-bhyve package to be installed. This is used in place of .Xr bhyveload 8 to load the guest kernel into memory. .\" ============== WINDOWS =============== .Sh WINDOWS SUPPORT Windows guests are supported on versions of .Fx that have UEFI support in .Xr bhyve 8 . As of April 2016, UEFI support should be available in .Fx 10.3-RELEASE and .Fx 11-CURRENT . .Pp You will also need a copy of the UEFI firmware. This can either be installed using the .Pa sysutils/uefi-edk2-bhyve port, or you can manually download a copy (see URL below) to .Pa $vm_dir/.config/BHYVE_UEFI.fd and configure a guest to use it by setting .Sy loader="uefi-custom" . .Pp If you are running .Fx 10 , there is no VGA console in .Xr bhyve 8 , and so an unattended installation ISO is required which allows Windows to install and boot without any user interaction. Instructions for creating a suitable ISO can be found at the URL below. .Pp On .Fx 11 , VGA access can be enabled by setting the .Sy graphics="yes" option in the guest configuration file. Once the guest has started, vnc IP & port details can be seen in .Sy vm list output. See the configuration format documentation below for more detailed information on configuring graphics. If network drivers are required, I recommend re-running the .Sy vm install command once the guest has been installed, but providing an ISO of the virtio-net drivers instead. .Pp Once the installation ISO is ready, has been placed in the .Pa $vm_dir/.iso directory, and you have the UEFI firmware, installation can be performed as normal. .Bd -literal -offset indent # vm create -t windows -s 30G winguest # vm install winguest win_repack.iso .Ed .Pp Windows installation has been tested with 2012r2 and takes around 20-25 minutes. During install, the guest will reboot twice (three runs in total). You can see the guest reboot by watching the log file .Pa $vm_dir/guestname/vm-bhyve.log . The third run should boot fully into Windows. The .Sy virtio network adapter will request an IP address using DHCP. Connect to the guest console and press .Sy i to see the IP address that has been assigned. The default unattended installation files should make RDP available, using Administrator and Test123 as the default login details. .Pp A pre-compiled copy of the UEFI firmware (BHYVE_UEFI_20160526.fd), as well as instructions for creating an unattended installation ISO can currently be obtained from .Lk https://people.freebsd.org/~grehan/bhyve_uefi/ .\" ============ SUBCOMMANDS ============= .Sh SUBCOMMANDS .Bl -tag -width indent .It Cm version Show the version number of vm-bhyve installed. .It Cm init .br This should be run once after each host reboot before running any other .Nm commands. The main function of the .Cm init command is as follows: .Pp o Load all necessary kernel modules if not already loaded .br o Set tap devices to come up automatically when opened .br o Create any configured virtual switches .It Cm get Ar all|setting Get a global configuration setting. These are settings that affect the functionality of vm-bhyve, such as configuring the type of serial console to use. The keyword .Sy all can be used to retrieve all user configurable settings, or you can specify one or more settings by name, separated by a space. .It Cm set Ar setting=value Sets the value of a global configuration setting. Multiple settings can be changed at the same time by seperating the .Sy setting=value pairs with a space. .Pp These settings are stored in .Pa $vm_dir/.config/system.conf .It Cm switch list List virtual switches. This reads all configured virtual switches from the .Pa $vm_dir/.config/switch file and displays them. If the virtual switches are loaded, it also tries to display the .Xr bridge 4 interface that has been assigned to each one. .It Cm switch info Op Ar name Op Ar ... This command shows detailed information about the specified virtual switch(es). If no switch names are provided, information is output for all configured switches. Information displayed includes the following: .Pp o Basic switch settings .br o Overall bytes sent and received via this switch .br o Physical ports connected .br o Virtual ports, including the associated virtual machine .It Xo .Cm switch create .Op Fl t Ar type .Op Fl i Ar interface .Op Fl n Ar vlan-id .Op Fl b Ar bridge .Op Fl m Ar mtu .Op Fl a Ar address .Op Fl p .Ar name .Xc Create a new virtual switch. The name must be supplied and may only contain letters, numbers and dashes. However, it may not contain a dash at the beginning or end. Note that the maximum length of a switch name is also limited to 12 characters, due to the way we use this as the interface name. .Pp There are currently 4 types of virtual switch that can be created. These are .Sy standard , .Sy manual , .Sy netgraph , .Sy vale and .Sy vxlan . The default type is .Sy standard , which creates a basic .Xr bridge 4 interface and bridges clients to it. .Sy manual allows you to attach guests to a bridge that you have created and configured manually. .Sy netgraph switches use the netgraph ng_bridg esystem to create a virtual switch connecting guests. .Sy vale switches use the netmap VALE system to create a virtual switch connecting guests. .Sy vxlan allows you to create virtual LANs (similar to a VLAN) which tunnel L2 guest traffic over L3. .Bl -tag -width 12n .It Fl t Ar type The type of virtual switch to create. The available types are listed above. This defaults to .Sy standard if not specified. .It Fl i Ar interface For .Sy standard and .Sy vxlan switches you can attach a physical interface at creation time. This option is required for vxlan switches. .It Fl n Ar vlan-id Allows you to specify a VLAN ID for .Sy standard and .Sy vxlan switches. This option is required for vxlan switches. .It Fl b Ar bridge If creating a manual switch using an existing bridge on your system, this option allows you to specify the name of the bridge interface you would like to use. This option is required for manual switches. .It Fl m Ar mtu Specify an mtu to use for the bridge interface. .It Fl a Ar address This allows you to specify an IP address that is assigned to the bridge interface. This should be specified in .Sy a.b.c.d/prefix-len CIDR notation. .It Fl p Use this option to create a private switch. If this is enabled, no traffic will be allowed between guests on the same switch, however then will all be able to communicate with any physical interfaces added to the switch. .El .It Cm switch vlan Ar name Ar vlan-id Assign a VLAN number to a virtual switch. The VLAN number must be between 0-4094. .Pp When adding an interface to a VLAN enabled virtual switch, a new .Xr vlan 4 interface is created. This interface has the relevant parent interface and VLAN tag configured. This vlan interface is then added to the virtual switch. As such, all traffic between guests on the same switch is untagged and travels freely. However, all traffic exiting via physical interfaces is tagged. .Pp If the virtual switch already has physical interfaces assigned, they are all removed from the bridge, reconfigured, then re-added. .Pp To remove the VLAN configuration from a virtual switch, specify a .Ar vlan-id of 0. .It Cm switch address Ar name Ar a.b.c.d/xx|none Configure an IP address for the specified virtual switch. The address should be specified in CIDR notation. To remove an address, specify .Pa none in place of the address. .Pp If NAT funtionality is required, please configure an address on the switch to become the gateway address for guests. Source NAT rules can then be created using your choice of firewall or NAT daemon. If DHCP is desired, we recommend using a manual switch and configuring this by hand. .It Cm switch private Ar name Ar on|off Enable of disable private mode for a virtual switch. In private mode, guests will only be able to communicate with the physical interface(s), not with each other. .Pp Please note that changing this setting does not affect guests that are already running, but will be applied to any guests started from cold-boot thereafter. .It Cm switch add Ar name Ar interface Add the specified interface to the named virtual switch. .Pp The interface will immediately be added to the relevant bridge if possible, and stored in the persistent switch configuration file. If a .Ar vlan-id is specified on the virtual switch, this will cause a new .Xr vlan 4 interface to be created. .It Cm switch remove Ar name Ar interface Removes the specified interface from the named virtual switch and updates the persistent configuration file. .It Cm switch destroy Ar name Completely remove the named virtual switch and all configuration. The associated .Xr bridge 4 interface will be removed, as well as any .Xr vlan 4 interfaces if they are not in use by other virtual switches. .It Cm datastore list List the configured datastores. Normally .Sy vm-bhyve will store all guests under the directory specified in .Pa /etc/rc.conf . This is the .Sy default datastore. Additional datastores can be added, providing the ability to store guests in multiple locations on your system. .It Cm datastore add Ar name spec Add a new datastore to the system. The datastore name can only contain letters, numbers and _. characters. The .Pa spec should use the same format as .Sy $vm_dir . A standard directory can be specified by just providing the path, whereas a ZFS storage location should be specified in .Sy zfs:pool/dataset format. .Pp Please note that the directory or dataset should already exist. We do not try to create it. .It Cm datastore remove Ar name Remove the specified datastore from the list. This does not destroy the directory or dataset, leaving all files intact. .It Cm datastore iso Ar name path Adds a new datastore location for storing iso files. Guests cannot be created in an iso store, but this provides an easy way to configure vm-bhyve to look in any arbitrary location on your system (or mounted network share) where you may want to store iso images. .It Xo .Cm create .Op Fl d Ar datastore .Op Fl t Ar template .Op Fl s Ar size .Ar name .Xc Create a new virtual machine. .Pp Unless specified, the .Pa default.conf template will be used and a 20GB virtual disk image is created. This command will create the virtual machine directory .Pa $vm_dir/$name , and create the configuration file and empty disk image within. .Bl -tag -width 12n .It Fl d Ar datastore Specify the datastore to create this virtual machine under. If not specified, the .Sy default dataset will be used, which is the location specified in .Pa /etc/rc.conf . .It Fl t Ar template Specifies the template to use from within the .Pa $vm_dir/.templates directory. The .Sy .conf suffix should not be included. .It Fl s Ar size The size of disk image to create in bytes. Unless specified, the guest image will be a sparse file 20GB in size. .El .It Cm destroy Ar name Removes the specified virtual machine from the system, deleting all associated disk images & configuration. .It Cm list .br List all the virtual machines in the .Pa $vm_dir directory. This will show the basic configuration for each virtual machine, and whether they are currently running. .It Cm info Op Ar name Op Ar ... Shows detailed information about the specified virtual machine(s). If no names are given, information for all virtual machines is displayed. .Pp This output includes detailed information about network and disk devices, including the space usage for all virtual disks (excluding custom disk devices). If the guest is running, the output also shows the amount of host memory currently in use, and additional network details including bytes sent/received for each virtual interface. .It Xo .Cm install .Op Fl fi .Ar name Ar iso .Xc Start a guest installation for the named virtual machine, using the specified ISO file or install disk image. The .Ar iso argument should be the filename of an ISO or image file already downloaded into the .Pa $vm_dir/.iso directory (or any media datastore), a full path, or a file in the current directory. ISO files in the default .iso store can be downloaded using the .Ar iso subcommand described below. .Pp By default the installation is started in the background. Use the .Ar console command to connect and begin the installation. .Pp After installation, the guest can be rebooted and will restart using its own disk image to boot. At this point the installation ISO file is still attached, allowing you to use the CD/DVD image for any post installation tasks. The ISO file will remain attached after each reboot until the guest is fully stopped. .Pp If the .Ar -f option is specified, the guest will be started in the foreground on stdio. The .Ar -i option starts the guest in interactive mode. This requires tmux, and the global .Sy console setting must be set likewise. In interactive mode the guest is started on a foreground tmux session, but this can be detached using the standard tmux commands. .It Xo .Cm start .Op Fl fi .Ar name Ar ... .Xc Start the named virtual machine(s). The guests will boot and run completely in the background. Use the .Ar console subcommand to connect to it if required. .Pp For each network adapter specified in the guest configuration, a .Xr tap 4 interface will be created. If possible, the tap interface will be attached the relevant .Xr bridge 4 interface, based on the virtual switch specified in the guest configuration. .Pp If the .Ar -f option is specified, the guest will be started in the foreground on stdio. The .Ar -i option starts the guest in interactive mode. This requires tmux, and the global .Sy console setting must be set likewise. In interactive mode the guest is started on a foreground tmux session, but this can be detached using the standard tmux commands. .It Cm stop Ar name Ar ... Stop a named virtual machine. All .Xr tap 4 and .Xr nmdm 4 devices will be automatically cleaned up once the guest has exited. .Pp If a guest is stuck in the bootloader stage, you are given the option to forcibly stop it. .Pp Multiple guests can be specified to this command at the same time. Each one will be sent a poweroff event. .It Cm restart Ar name Attempt to restart the specified guest. This causes a shutdown event to be sent to the guest, however, vm-bhyve will restart the guest rather than stopping completely. .Pp A benfit of using this function is that vm-bhyve will not destroy and recreate network devices like it would when using .Sy stop/start . Note that guest configuration is not re-loaded, so all guest settings will be as they were when the guest was originally started. .It Cm console Ar name Op Ar com1|com2 Connect to the console of the named virtual machine. Without network access, this is the primary way of connecting to the guest once it is running. .Pp By default this will connect to the first com port specified in the client configuration, which is usually com1. Alternatively you can specify the com port to connect to. .Pp This looks for the .Xr nmdm 4 device associated with the virtual machine, and connects to it with .Xr cu 1 . Use ~+Ctrl-D to exit the console and return to the host. .It Cm rename Ar name Ar new-name Renames the specified virtual machine. The guest must be stopped to use this function. .It Xo .Cm add .Op Fl d Ar device .Op Fl t Ar type .Op Fl s Ar size|switch .Ar name .Xc Add a new network or disk device to the named virtual machine. The options depend on the type of device that is being added: .Bl -tag -width 15n .It Fl d Ar device The type of device to add. Currently this can either be .Pa disk or .Pa network .It Fl t Ar type For disk devices, this specifies the type of disk device to create. Valid options for this are .Pa zvol , .Pa sparse-zvol and .Pa file . If not specified, this defaults to .Pa file . .It Fl s Ar size|switch For disk devices, this is used to specify the size of the disk image to create. For network devices, use this option to specify the virtual switch to connect the network interface to. .El .Pp For both types of device, the emulation type will be chosen automatically based on the emulation used for the existing guest devices. .It Xo .Cm reset .Op Fl f .Ar name .Xc Forcefully reset the named virtual machine. This can cause corruption to the guest file system just as with real hardware and should only be used if necessary. .It Xo .Cm poweroff .Op Fl f .Ar name .Xc Forcefully power off the named virtual machine. As with .Ar reset above, this does not inform the guest to shutdown gracefully and should only be used if the guest can not be shut down using normal methods. .It Cm startall Start all virtual machines configured for auto-start. This is the command used by the rc.d scripts to start all machines on boot. .Pp The list of virtual machines should be specified using the .Pa $vm_list variable in .Pa /etc/rc.conf . This allows you to use shared storage for virtual machine data, whilst making sure that the correct guests are started automatically on each host. (Or to just make sure your required guests start on boot whilst leaving test/un-needed guests alone) .Pp The delay between starting guests can be set using the .Pa $vm_delay variable, which defaults to 5 seconds. Too small a delay can cause problems, as each guest doesn't have enough time to claim a null modem device before the next guest starts. Increasing this value can be useful if you have disk-intensive guests and want to give each guest a chance to fully boot before the next starts. .It Cm stopall Stop all running virtual machines. This sends a stop command to all .Xr bhyve 8 instances, regardless of whether they were starting using .Nm or not. .It Cm configure Ar name The .Cm configure command simply opens the virtual machine configuration file in your default editor, allowing you to easily make changes. Please note, changes do not take effect until the virtual machine is fully shutdown and restarted. .It Cm passthru The .Cm passthru command lists all PCI devices in the system, the device ID required for bhyve, and whether the device is currently ready to be used by a guest. In order to make a device ready, it needs to be reserved on boot by adding the device ID to the .Sy pptdevs variable in .Pa /boot/loader.conf . .Pp Once a device is ready, it can be assigned to a guest by adding .Sy passthruX="{ID}" to the guest's configuration file. .Sy X should be an integer starting at 0 for the first passthrough device. .Pp More details can be found in the bhyve wiki. .It Cm clone Ar name[@snapshot] Ar new-name Create a clone of the virtual machine .Pa name , as long as it is currently powered off. The new machine will be called .Pa new-name , and will be ready to boot with a newly assigned UUID and empty log file. .Pp If no snapshot name is given, a new snapshot will be taken of the guest and any descendant datasets or ZVOLs. If you wish to use an existing snapshot as the source for the clone, please make sure the snapshot exists for the guest and any child ZVOLs, otherwise the clone will fail. .Pp Please note that this function requires ZFS. .It Xo .Cm snapshot .Op Fl f .Ar name|name@snapshot .Xc Create a snapshot of the names virtual machine. This command is only supported with ZFS and will take a snapshot of the guest dataset and any descendant ZVOL devices. .Pp The guest and snapshot name can be specified in the normal .Pa name@snapshot way familiar to ZFS users. If no snapshot name is given, the snapshot is based on the current timestamp in .Pa Y-m-d-H:M:S format. .Pp By default the guest must be stopped to use this command, although you can force a snapshot of a running guest by using the .Fl f option. .It Xo .Cm rollback .Op Fl r .Ar name@snapshot .Xc Rollback the guest to the specified snapshot. This will roll back the guest dataset and all descendant ZVOL devices. .Pp Normally, ZFS will only allow you to roll back to the most recent snapshot. If the snapshot given is not the most recent, ZFS will produce a warning detailing that you need to use the .Fl r option to remove the more recent snapshots. It will also produce a list of the snapshots that will be destroyed if you use this option. The .Fl r option can be passed directly into .Nm .Cm rollback .Pp The guest must always be stopped to use this command. .It Xo .Cm migrate .Op Fl s12t .Op Fl r Ar name .Op Fl i Ar snapshot .Op Fl d Ar datastore .Ar guest host .Xc The migrate command allows transferring a guest from one host to another. Note that currently this involves shutting down the guest, and optionally restarting it once migration is complete. .Pp The migration process uses ssh, and works best if key-based ssh is enabled between your hosts without the requirement of a password. Transfer is still possible using a password, but you will be prompted for this several times during the transfer process. .Pp Firstly a full snapshot of the guest is sent while the guest is still running. Optionally, an intermediate incremental snapshot can then be sent to bring the remote guest up to date if it is expected that the full send may take a long time, or that a large amount of data may change during this time. Once the remote end is reasonably up to date, the guest is powered off so a final incremental snapshot can be sent. .Bl -tag -width 12n .It Fl r Ar name Allows the remote guest to be given a different name to the source. .It Fl d Ar datastore Specify the datastore to store the guest on the destination host. .It Fl s Start the guest on the remote host once migration is complete. .It Fl 1 Run only the first stage of migration. This will take a full snapshot of the local guest and send it to the destination host. .It Fl 2 Run only the second stage. This will second an incremental snapshot and then complete the migration. This requires the .Fl i parameter to specify the source snapshot. .It Fl t Triple snapshot mode. This will send both a full snapshot, and one incremental, before shutting the guest down and doing a final incremental send. This may be useful for large or busy guests where there could be a large number of chages during the initial full send. The idea is that the first incremental send will bring the remote guest nearly up to date, sending changes that have occured during the lengthy inital full send. This should reduce the size of the final incremental send, minimising the amount of time the guest is powered off. .It Fl x Destroy the local guest once the migration is complete. .It Fl i Ar snapshot When running the second stage of migration, this parameter is used to specify the name of the snapshot to base the incremental send on. This snapshot must exist on both hosts. .El .It Xo .Cm iso .Op Ar -d datastore .Op Ar url .Xc List all the ISO files currently stored in the .Pa $vm_dir/.iso directory. This is often useful during guest installation, allowing you to copy and paste the ISO filename. .Pp If a .Sy url is specified, instead of listing ISO files, it attempts to download the given file using .Xr fetch 1 to the default datastore. The target datasource can be changed by specifying .Sy -d datastore with .Sy url . .It Cm image list List available images. Any virtual machine can be packaged into an image, which can then be used to create additional machines. All images have a globally unique ID (UUID) which is used to identify them. The list command shows the UUID, the original machine name, the date it was created and a short description of the image. .Pp Please note that these commands rely on using ZFS features to package/unpackage the images, and as such are only available when using a ZFS dataset as the storage location. .It Xo .Cm image create .Op Fl d Ar description .Op Fl u .Ar name .Xc Create a new image from the named virtual machine. This will create a compressed copy of the original guest dataset, which is stored in the .Pa $vm_dir/images directory. It also creates a .Pa UUID.manifest file which contains details about the image. .Pp Once complete, it will display the UUID which has been assigned to this image. .Pp If you do not want the image to be compressed, specify the .Sy -u option. .It Xo .Cm image provision .Op Fl d Ar datastore .Ar uuid Ar new-name .Xc Create a new virtual machine, named .Pa new-name , from the specified image UUID. This will be created on the .Sy default datastore unless specified otherwise. .It Cm image destroy Ar uuid Destroy the specified image. .El .\" ============ GLOBAL CONFIGURATION =========== .Sh GLOBAL CONFIGURATION These configuration options are stored in .Pa $vm_dir/.config/system.conf , and affect the global functionality of vm-bhyve. These settings can be changed by either editing the configuration file manually, or using the .Sy vm set and .Sy vm get commands. .Bl -tag -width 17n .It console Set the type of console to use, which defaults to .Sy nmdm . If you have the tmux port installed and would prefer to use that for guest console access, you can set this option to .Sy tmux . .El .\" ============ CONFIGURATION FORMAT =========== .Sh GUEST CONFIGURATION FORMAT Each virtual machine has a configuration file that specifies the hardware configuration. This uses a similar format to the .Sy rc files, making them easy to edit by hand. The settings for each guest are stored in .Pa $vm_dir/$vm_name/$vm_name.conf . An overview of the available configuration options is listed below. .Bl -tag -width 17n .It loader This option sets the loader to use for a guest and must be specified. The valid options are .Sy bhyveload , .Sy grub , .Sy uefi , .Sy uefi-csm , or .Sy uefi-custom . .It uefi_vars Setting this option to a true value allows the persistent storage of UEFI variables. This may be required for some guests that install boot firmware to a non-standard location and rely on UEFI variables to locate it. The version of .Sy uefi-firmware installed must provide the template data file, and support also needs to be present in .Sy bhyve .It bhyveload_loader This option allows a custom path to be used for the loader inside the guest. Passed to .Sy bhyveload using the .Sy -l argument. .It bhyveload_args This option allows extra arguments to be given for the loader inside the guest. Appended verbatim to the .Sy bhyveload command line. .It loader_timeout By default the .Sy bhyveload and .Sy grub loaders will wait for 3 seconds before booting the default option. If access to the grub console is needed, this can be increased to give more time to connect to the console. If access to the grub console is not required, it can also be reduced to speed up overall boot. .It cpu_sockets Specify the number of CPU sockets that should be exposed to the guest. The product of .Sy sockets * cores * threads should equal the number of cpus that has been configured. The ability to control CPU topology on a per-guest basis requires .Fx 12 or newer. On older systems, there are .Sy vmm sysctl variables available to configure these settings globally. .It cpu_cores The number of cores to create per CPU socket. .It cpu_threads The number of threads to create per CPU core. .It memory The amount of memory to assign to the guest. This can be specified in megabytes or gigabytes using the .Sy M and .Sy G suffixes. .It wired_memory Set this to yes in order to have the requested amount of memory wired to the guest. .It hostbridge This option allows you to specify the type of hostbridge used for the guest hardware. Normally you can leave this as default, which is to use a standard bhyve hostbridge. .Pp There are two other options. .Sy amd , which is almost identical to the standard hostbridge, but advertises itself with a vendor ID of AMD. There are also some special cases where you may require no hostbridge at all, which can be achieved using the .Sy none value. .It comports This option allows you to specify which com ports to create for the guest. The default is to create a single .Sy com1 port. Valid values for this are .Sy com1 and .Sy com2 . You can also connect two com ports by specifying both, separated by a space. .It utctime As of version 1.2, vm-bhyve defaults to .Sy yes for this option. This causes bhyve to try and set the guests RTC clock to UTC rather than the host's time. I consider this more consistent, and should produce the correct time in the guest as long as the timezone is correctly set. Additionally, some guests actually expect a UTC realtime clock. .Pp If you require bhyve to use the host's time, as it would by default, explicitly set this to .Sy no . .It debug If this is set to .Sy yes , all output from the .Xr bhyve 8 process will be written to .Sy ${vm_dir}/guest/bhyve.log . This is useful for debugging purposes as it allows you to see any error messages that are being produced by .Xr bhyve 8 itself. .It network0_type The emulation to use for the first network adapter. This option can be unspecified if no guest networking is required. The recommended value for this is .Sy virtio-net . Additional network interfaces can be configured by adding additional .Sy networkX_type and .Sy networkX_switch values, replacing .Sy X with the next available integer. .It network0_switch The virtual switch to connect interface .Sy 0 to. This should correspond to a virtual switch created using the .Pa vm switch create subcommand. If the virtual switch is not found, an interface will still be assigned, but not connected to any bridge. .Pp Note that this field is no longer strictly required. If you are using a custom device for the networking that is already configured, you may not need the interface connected to a virtual switch. See the .Sy network0_device configuration option. .It network0_device Normally vm-bhyve will create a .Xr tap 4 device at run-time for each virtual network interface. This may be an issue in more advanced configurations where you want to pre-configure the networking manually in a way unsupported by vm-bhyve. This option allows you to instruct vm-bhyve to use an existing network device for this virtual interface, rather than creating one dynamically. .It network0_mac This option allows you to specify a mac address to use for this interface. If not provided, .Xr bhyve 8 will generate a mac address. .It network0_span Set this option to .Sy yes to instruct vm-bhyve to add the virtual network interface to the switch as a span port on the bridge. The default is to add the port to the switch as an ordinary bridge member. .It disk0_type The emulation type for the first virtual disk. At least one virtual disk is required. Valid options for this are currently .Sy virtio-blk , .Sy ahci-hd , .Sy ahci-cd , and .Sy nvme . Additional disks can be added by adding additional .Sy diskX_type and .Sy diskX_name values, replacing .Sy X with the next available integer. .It disk0_name The filename for the first virtual disk. The first disk is created automatically when provisioning a new virtual machine. If additional disks are added manually, the image will need to be created, usually done using the .Xr truncate 1 or .Xr zfs 8 commands. Alternatively, you can use the .Pa vm add command, which will create the disk image for you. .Pp Normally disk images or zvols are stored directly inside the guest. To use a disk image that is stored anywhere else, you can specify the full path in this option, and configure the device as .Sy custom . .Pp To use an established iscsi device, specify a target 'session[/lun]' (default /0) which matches a unique session from the .Pf ' Xr iscsictl 8 -L' command output, and configure the device as .Sy iscsi . .It disk0_dev The type of device to use for the disk. If not specified, this will default to .Sy file , and a sparse file, located in the guest directory, will be used as the disk image. Other options include: .Sy zvol or .Sy sparse-zvol (which will use a ZVOL as the disk image, created directly under the guest dataset), .Sy custom , and .Sy iscsi . .Pp When using .Sy custom , the .Pa diskX_name parameter must be set to the full path to the image file or device. .Pp Already attached iscsi devices can have their device nodes dynamically detected and used by setting this option to .Sy iscsi and .Pa diskX_name as described above. .It disk0_opts Any additional options to use for this disk device. Multiple options can be specified, separated by a comma. Please see the .Xr bhyve 8 man page for more details on supported options. .It disk0_size This setting can be specified in templates to set the size of this disk. When creating a guest, .Nm will default to creating a 20G image for each disk, unless an alternative size is specified using this option. The size of the first disk can be overridden using the .Sy -s command line option. .Pp NOTE: This setting is only supported in templates. It has no function in real guest configuration, and is not copied over when a new machine is provisioned. .It ahci_device_limit By default, all AHCI devices are added on their own controller in a unique slot/function. In .Fx 12 it is possible to put up to 32 devices on one controller. This setting allows you to control the number of devices (ahci-hd/ahci-cd) that vm-bhyve will put on a single controller. The default is .Sy 1 and allowed values are .Sy 2-32 . .It uuid This option allows you to specify a fixed UUID for the guests SMBIOS. Normally, the UUID is generated by .Xr bhyve 8 based on the hostname and guest name. Because this may change if guests are moved between systems, the .Pa vm create command automatically assigns a UUID to all newly created guests. .It ignore_bad_msr Set to .Sy true|on|yes|1 to configure .Xr bhyve 8 to ignore accesses to unimplemented model specific registers. This is commonly required on AMD processors, although is enabled by default for UEFI guests. .It bhyve_options Specify any additional command line arguments to pass to the bhyve command. This allows the use of options such as cpu pinning or debug that are not exposed by .Sy vm-bhyve . .It grub_installX This option allows you to specify grub commands needed to boot the install media for this guest. .Sy X should be an integer starting at 0, with additional grub commands using the next numbers in sequence. .Pp If no install commands are specified, .Sy grub-bhyve will be run on the guests console, so you can use the standard .Pa vm console command to access the bootloader if needed. .It grub_run_partition Specify the partition that grub should look in for the grub configuration files. By default, vm-bhyve will specify partition 1, which is correct in most standard cases. .It grub_runX The option allows you to specify the grub commands needed to boot the guest from disk. .Sy X should be an integer starting at 0, with additional grub commands using the next numbers in sequence. .Pp If no boot commands are specified, .Sy grub-bhyve will be run on the guests console, so you can use the standard .Pa vm console command to access the bootloader if needed. .Pp The sample templates contain examples of how the grub configuration variables can be used. .It grub_run_dir By default .Sy grub-bhyve will look in the directory .Sy /boot/grub for the grub configuration file. This option allows you to specify an alternate path to use when starting a guest. .It grub_run_file Allows you to specify the grub configuration file that .Sy grub-bhyve will look for inside the guest, rather than the default of .Sy grub.cfg . .It passthruX Specify a device to pass through to the guest. You will need to reserve the device first so that is it claimed by the ppt driver on boot. .Pp Once the device is successfully reserved, you can add it to the guest by adding .Sy passthruX="1/2/3" to the guest configuration file, where .Sy X is an integer starting at 0, and .Sy 1/2/3 is the Base/Slot/Function of the device. If you are passing through multiple functions on the same device, make sure they are specified together in the configuration file in the same sequence as the original device. .Pp Please see .Lk https://wiki.freebsd.org/bhyve/pci_passthru for more details on how this works. .It virt_random Set this option to .Sy yes if you want to create a .Sy virtio-rnd device for this guest. .It graphics If set to yes, a frame buffer is added to the guest. This provides a graphical console that is accessible using VNC. By default the console is 800x600, and will listen on .Sy 0.0.0.0:5900 . If port 5900 is not available, the next available port will be used. The active address and port can be viewed in .Sy vm list and .Sy vm info output. .It graphics_port This option allows you to specific a fixed port that the VNC service should listen on. Please remember that all guests should ideally use a unique port to avoid any problems. .It graphics_listen By default the graphical VNC console will listen on .Sy 0.0.0.0 , so is accessible by connecting to any IP address assigned to the bhyve host. Use this option to specify a specific IP address that the VNC service should bind to. .It graphics_res Specify the resolution of the graphical console in .Pa WxH format. Please note that only a certain range of resolutions are currently supported. Please set .Pa config.sample for a full up-to-date list. .It graphics_wait Set this to .Sy yes in order to make guest boot wait for the VNC console to be opened. This can help when installing operating systems that require immediate keyboard input (such as a timed 'enter setup' screen). Set to .Sy no in order to completely disable this function. .Pp The default is .Sy auto , in which case the console will wait if the guest is started in install mode. Note that after the first boot, the system will boot immediately as normal. To force the console to wait on each boot, the .Sy yes setting should be used. .It graphics_vga This configures how the graphics card is exposed to the guest. Valid options are .Sy io (default), .Sy on or .Sy off . Please see the .Xr bhyve 8 man page for more details on this option. .It xhci_mouse Set this option to .Sy yes in order to provide an XHCI mouse device to the guest. This tracks much better than the default PS2 mouse in VNC settings, although this mouse may not supported by older guests. .It sound Set this option to .Sy yes in order to provide HD Audio Emulation to the guest. Please see .Sy bhyve(8) for details. .It sound_play Set this to the desired audio output device of the host to the guest. Defaults to .Sy '/dev/dsp0' .It sound_rec Set this to the desired audio input device of the host to the guest. If empty no audio input device is configured. Defaults to .Sy '' (empty) .It virt_consoleX Allows the creation of up to 16 virtio-console devices in the guest. The value to this option can be .Sy yes|on|1 to create a numbered port. This is the only method supported by some guests. .Pp If any other value is provided, this will be used as the name of the port. The name .Sy org.freenas.bhyve-agent can be useful, as it ties in with utilities written for the FreeNAS bhyve-agent interface. .It zfs_dataset_opts This allows you to specify one or more ZFS properties to set on the dataset when a guest is created. Because properties are assigned as the dataset is created, this option is most useful when specified inside a template. As a guest is created, all properties listed in this option will be applied to the guest dataset. .Pp Multiple properties can be specified, separated by a space. Please note that spaces are not currently supported in the property values. .It zfs_zvol_opts Allows you to specify ZFS properties that should be assigned to any ZVOLs that are created for a guest. As with .Pa zfs_dataset_opts , this makes most sense when entered into a template, as the properties can be assigned while a guest is being created. Some ZVOL options, such as .Pa volblocksize can only be set at creation time. .Pp Multiple properties can be specified, separated by a space. For example, the following will configure the ZVOL block size to 128k, and turn compression off. .Pp zfs_zvol_opts="volblocksize=128k compress=off" .It prestart Allows you to specify a script or executable that will run before the guest starts, including on reboot. This is provided the guest name, and ZFS dataset (if applicable) as arguments. We also change directory to the guest path before running the script. .Pp This can be specified as a full path, or just a script filename. In the latter case we look in the guest directory for the script. .Pp Note that although the guest is technically stopped when this process runs, calls to .Nm will still consider the guest locked. .It priority Allows a priority to be set for a guest by using the .Xr nice 8 facility. The default value is 0, and has a range from -20, which is the highest priority, to 20. A priority of 20 will cause the guest to only run when the host system is idle. .It limit_pcpu Limit the bhyve process to the specified cpu percentage. .Pp Please note this, as with all .Sy limit settings, requires .Xr rctl 8 to be enabled in your kernel. .It limit_rbps Limit guest disk read throughput to the specified bits per second. .It limit_wbps Limit guest disk write throughput to the specified bits per second. .It limit_riops Limit guest disk read iops to the specified number of operations per second. .It limit_wiops Limit guest disk write iops to the specified number of operations per second. .El .\" ============ SEE ALSO ============= .Sh SEE ALSO .Xr cu 1 , .Xr fetch 1 , .Xr tmux 1 , .Xr truncate 1 , .Xr bridge 4 , .Xr nmdm 4 , .Xr tap 4 , .Xr vlan 4 , .Xr bhyve 8 , .Xr bhyveload 8 , .Xr rctl 8 , .Xr zfs 8 .\" ============ BUGS ============= .Sh KNOWN BUGS If a guest is renamed, and then cloned using a snapshot taken before the rename, vm-bhyve is unable to find the guest configuration file. This is because the configuration file in the snapshot still refers to the old guest name. In this circumstance, vm-bhyve will output an error during cloning detailing that the configuration file in the new guest will need to be renamed and updated manually. .Pp On some systems it has been observed that bridging can cause interfaces to go down for up to 10 seconds, which is enough to stall ssh sessions. This is noticable when the first guest is started or when the last guest is stopped. Once there are at least 2 interfaces bridged (one real interface and a tap interface), further guests can be started/stopped without issue. .Pp Please report all bugs/issues/feature requests to the GitHub project at .Lk https://github.com/churchers/vm-bhyve .\" ============ AUTHOR ============= .Sh AUTHORS .An Matt Churchyard Aq Mt churchers@gmail.com