Skip to main content
vee
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

vee create

Create a new VM from a template.

vee create <name> [flags]

Flags

FlagDescription
--templateVM template to use (default: ubuntu-server)
--memoryRAM, e.g. 4G (default: template-specific)
--cpusNumber of vCPUs (default: template-specific)
--diskAttach an additional blank disk of this size alongside the OS disk, e.g. 40G. On the macos template it sets the size of the guest’s own disk instead.
--distroLinux distro for templates that support it
--emulateRun a guest whose image does not support this host’s CPU architecture under TCG emulation — x86_64-only images (arch, bazzite, truenas, alpine, omarchy) on Apple Silicon. Functional but slower than native; needs the matching system qemu (brew install qemu)
--data-diskExtra raw disk in path:label format (repeatable)
--nvme-devPass an NVMe device through directly (passthrough template)
--ipswmacos template: restore image — latest, an https URL, or a local .ipsw
--macosvm-dirmacos template: import an existing macosvm bundle instead of restoring
--skip-first-bootmacos template: skip offline provisioning (guest boots into Setup Assistant)
--ovmf-varsCustom OVMF_VARS.fd for UEFI
--gpu-pciGPU PCI address for passthrough, e.g. 08:00.0
--nic-modeNetworking mode: user or bridge
--virtiofs-dirHost directory to share into the VM (Linux hosts only)
--nestedExpose nested virtualization (EL2) so the guest can run KVM — arm64 QEMU guests only; under HVF needs QEMU ≥ 11.1 plus an M3+ Mac on macOS 15+

Extra disks

--disk <size> attaches one additional qcow2 disk to the guest, created under ~/.vee/vms/<name>/storage/. It is blank: the guest sees an unpartitioned block device (typically /dev/vdb) and you partition, format and mount it yourself. The OS disk keeps the first slot, so boot order is unaffected.

To grow the OS disk instead of adding a second one, set default_disk_size in ~/.vee/config.yaml before creating the VM.

--data-disk is a different thing: it passes an existing host block device through to the guest, rather than creating a new image.

Examples

# Default Ubuntu 24.04 server
vee create myvm

# Developer VM with Docker
vee create dev --template devbox

# Developer VM with a second, blank 60G disk to format in the guest
vee create dev --template devbox --disk 60G

# TrueNAS with data drives
vee create mynas --template truenas \
  --data-disk /dev/disk/by-id/ata-ST22000NM000C_ZXA0S3H6:EXOS22TB-A \
  --data-disk /dev/disk/by-id/ata-ST22000NM000C_ZXA0WD9J:EXOS22TB-B

# GPU passthrough booting from existing NVMe
vee create linux-gaming --template passthrough \
  --nvme-dev /dev/disk/by-id/nvme-... \
  --ovmf-vars /path/to/OVMF_VARS.fd \
  --gpu-pci 08:00.0