# Creation

Select **Create VM** from the Virtual Machines page to open the creation wizard. It creates the VM definition, its initial storage when requested, and any selected network or PCI assignments in one operation.

:::note
The node must have the Virtualization service enabled before the **Create VM** action is available. Enable it from [System Services](/guides/node/settings/system/services/). If you have just enabled or disabled the service, restart the node before creating or running VMs.
:::

Before starting, make sure the destination node has a suitable ZFS pool. A switch is optional, but a cloud-init guest usually needs one to reach its network services on first boot.

## Basic

Choose where the VM belongs and give it an identity that is easy to recognize later.

| Field | Purpose |
| --- | --- |
| **Node** | The node that will own the VM. This appears when creating from a cluster view. Changing the node clears node-specific selections such as pools, switches, passthrough devices, and CPU pins. |
| **VM Name** | A human-readable, valid VM name. |
| **VM ID** | A numeric guest identifier from `1` to `9999`. Sylve suggests the next available value and verifies that it does not conflict with a VM or jail anywhere in the cluster. |
| **Description** | Optional context for operators, such as the guest's role, owner, or intended workload. |

<img
  src={basic.src}
  alt="Create VM wizard on the Basic tab with a selected node, VM name, identifier, and description"
/>

## Storage

Storage is the VM's primary boot disk. Select a pool, its size, and the device model presented to the guest. The wizard also lets you attach one installation image.

| Type | Use it when | Result |
| --- | --- | --- |
| **ZFS Volume** | You want a ZFS-managed virtual disk. This is the normal choice for Sylve-managed VM storage. | Creates a ZFS zvol in the selected pool. |
| **Raw Disk** | You specifically need a file-backed disk image. | Creates a raw disk image in the selected pool. |
| **No Storage** | The VM will boot from a later-attached disk, network source, or another device. | Creates no primary disk. |

The minimum initial disk size is 128 MiB. Sylve checks that the selected pool exists, is usable, and has enough free space before creating the VM. If the **Storage Pool** list is empty, [create or import a ZFS pool](/guides/node/storage/zfs/pools/) on the selected node first.

For **Emulation Type**, choose the guest-visible disk controller:

| Emulation | Guidance |
| --- | --- |
| **NVMe** | A good default for modern guests with NVMe support. |
| **VirtIO** | A paravirtualized disk controller for guests with VirtIO drivers. |
| **AHCI-HD** | A compatibility-oriented SATA controller for guests that need it. |

Under **Installation Media**, select an available download or explicitly choose **None**. Regular ISO and supported disk-image downloads are available for ordinary installs. If the list does not contain the image you need, add it through [Downloader](/guides/node/utilities/downloader/), then return to this wizard. When cloud-init is enabled in the Advanced tab, this list is limited to downloads marked as cloud-init images.

:::caution
Cloud-init requires a primary disk and a cloud-init image. A normal installer ISO cannot provide the cloud-init datasource expected by the guest.
:::

<img
  src={storage.src}
  alt="Create VM wizard on the Storage tab with a ZFS volume, selected pool, NVMe disk emulation, and installation media"
/>

## Network

Attach the VM to a **Standard** or **Manual** switch so it can communicate on that network. A Standard Switch is a Sylve-managed FreeBSD bridge, normally connected to a physical interface; a Manual Switch represents a bridge you manage yourself. Leave the switch set to **None** when the VM should initially have no virtual NIC.

| Field | Purpose |
| --- | --- |
| **Switch** | The existing Standard or Manual switch connected to this NIC. |
| **Emulation Type** | **VirtIO** for guests with VirtIO network drivers, or **E1000** for broader out-of-the-box compatibility. |
| **MAC Address** | An unused managed MAC object to assign to the NIC. Leave it unselected for Sylve to generate and attach a unique managed MAC address. |

The selected MAC address cannot already belong to another network interface. Select a reusable managed MAC only when you deliberately need that address on this VM. If the **Switch** list is empty, create a [Standard Switch](/guides/node/network/switches/standard/) or [Manual Switch](/guides/node/network/switches/manual/) first. To pre-create a managed MAC address, use [Network Objects](/guides/node/network/objects/).

<img
  src={network.src}
  alt="Create VM wizard on the Network tab with a selected Standard Switch, VirtIO emulation, and managed MAC-address selector"
/>

## Hardware

Set the CPU topology and memory allocation for the guest. Each CPU field must be at least one, so one socket, one core, and one thread creates a single vCPU.

:::tip[Think in sockets × cores × threads per core]
The **Threads** value is the number of threads for each core, not the VM's total thread count. For a 16-vCPU guest with one thread per core, use `1 × 16 × 1`: one socket, 16 cores, and one thread per core. Do not use `1 × 16 × 16`, which presents 256 vCPUs because all three values are multiplied.
:::

| Field | Purpose |
| --- | --- |
| **CPU Sockets, Cores, and Threads** | Defines the topology reported to the guest. Their product is the VM's vCPU count. |
| **CPU Selector** | Optionally pins guest vCPUs to specific host CPU threads. |
| **Memory Size** | Guest RAM allocation. The minimum is 128 MiB. Leave sufficient memory for FreeBSD, ZFS, and other workloads on the node. |
| **PCI Passthrough** | Assigns prepared PCI devices to the VM. Only devices prepared in the node's PCI Passthrough settings appear here. |

CPU pinning is optional. Sylve rejects duplicate selections, pins outside the VM's configured vCPU count, pins beyond the host's logical CPUs, and pins already reserved by another VM. Use it when you need predictable CPU placement, not as a requirement for normal VMs.

PCI devices may be selected by more than one VM definition, but only one running VM can use a device at a time. If the PCI list is empty, [prepare the device for PCI passthrough](/guides/node/settings/pci-passthrough/) and restart the node before relying on it for a guest.

<img
  src={hardware.src}
  alt="Create VM wizard on the Hardware tab with CPU topology, memory allocation, and an available PCI passthrough device"
/>

<img
  src={cpuPinning.src}
  alt="CPU Selector showing host CPU threads selected for VM pinning"
/>

## Advanced

The Advanced tab controls the VM console, boot firmware, startup behavior, and optional guest integrations.

| Setting | Purpose |
| --- | --- |
| **Enable VNC** | Enables the graphical VNC console. Set its resolution, bind IP, port, and password here. The password generator creates a strong value that you can replace. |
| **VNC Wait** | Makes the VM wait for a VNC framebuffer connection during startup. |
| **Serial Console** | Provides a serial console for guests configured to use one. |
| **Boot ROM** | Firmware choices follow the selected node's architecture: **UEFI (Default)** on `amd64`, **U-Boot (Default)** on `arm64`, or **None** when the guest does not need Sylve-managed firmware. The wizard waits until it can determine the node architecture before enabling creation. |
| **Clock Offset** | Presents the guest RTC as **UTC** or **Local Time**. Choose the convention expected by the guest operating system. |
| **Start On Boot** | Starts the VM automatically when its node starts. |
| **Startup/Shutdown Order** | Sets the relative order used for managed startup and shutdown. |
| **TPM Emulation** | Adds an emulated TPM for guests that require it. |
| **Ignore UMSRs** | Instructs Bhyve to ignore unimplemented model-specific-register accesses. Use this only for a guest that needs it, since it can conceal a compatibility issue. |
| **QEMU GA** | Enables the QEMU Guest Agent connection for compatible guests, allowing Sylve to obtain guest details such as operating-system and network information. |
| **Bhyve Options** | Adds extra Bhyve arguments, one per line. Use only options you understand and have tested for the guest. |

<img
  src={advancedConsole.src}
  alt="Create VM wizard on an AMD64 node showing VNC, UEFI firmware, clock, and startup settings"
/>

### Cloud-init

Enable **Cloud-Init** to initialize a compatible cloud image without performing a manual installer workflow. The wizard requires both **User Data** and **Meta Data**. **Network Config** is optional.

You can type the YAML directly or select an existing [Cloud-Init template](/guides/node/utilities/cloud-init-templates/) to populate all three fields. Return to the Storage tab afterwards and choose the cloud-init image that the guest will boot from. If no suitable image is available, use [Downloader](/guides/node/utilities/downloader/) to add one marked as a cloud-init image.

Cloud-init is useful for creating repeatable guests, such as an application node with a known user, SSH keys, packages, and first-boot configuration.

<img
  src={cloudInit.src}
  alt="Cloud-Init enabled in the VM creation wizard with a selected template and populated user, metadata, and network configuration"
/>

### Finish creation

Review the information in each tab, then select **Create**. Sylve validates the VM identity, pool capacity, selected network and MAC address, CPU placement, VNC settings, cloud-init data, and passthrough mappings before making changes.

After creation, open the VM from the sidebar to review its configuration and start it when you are ready.