---
title: "Create a VM"
description: "Step-by-step VM create in the Metalhost dashboard: region, CPU or GPU, size, OS image, login users, public IPv4, billing modes."
url: "https://metalhost.net/docs/dashboard/guides/vms-create"
---

# Create a VM

Every VM is provisioned from one form — *Compute → Create VM*. It reads top to bottom: **name → region → compute → operating system → access → billing**, with an *advanced* section for cloud-init, extra disks, and labels. A live quote tracks every change.

## Region

Pick a datacenter — compute is DC-local. Each region card shows its live free-vCPU headroom; today that's `us-dal-1` (Dallas).

## Compute: CPU or GPU

A top-level **CPU ⇄ GPU** toggle swaps the hardware grid:

- **CPU** — choose a CPU class: **Intel Cascade Lake** or **AMD Milan**. Each card shows live availability.
- **GPU** — choose a GPU model (**NVIDIA RTX 4090** today, with more models on the way) for whole-card PCIe passthrough — a dedicated physical GPU, not a time-sliced fraction. Picking a GPU also pins the CPU pool it lives on.

Below the hardware grid, sliders dial **cores**, **memory**, **boot disk** (and **GPU count** in GPU mode). The sliders are **capacity-aware**: their max is the largest VM the most-free node can actually schedule, so you can't size something that won't place.

Sizing rules the form enforces (the server enforces them too):

- CPU VMs cap at **4 GiB RAM per vCPU** — want more RAM, add cores.
- GPU VMs start at **4 vCPU / 8 GiB**; the GPU's CPU + RAM are dedicated, not oversubscribed.

### Example shapes

| Shape | Config | $/mo (no IPv4) | $/hr |
| --- | --- | --- | --- |
| tiny | 1 vCPU · 1 GB · 10 GB NVMe | $4.25 | $0.0058 |
| medium | 2 vCPU · 8 GB · 80 GB NVMe | $19 | $0.026 |
| large | 4 vCPU · 16 GB · 160 GB NVMe | $38 | $0.0521 |
| + GPU | any shape ≥ 4 vCPU / 8 GB + 1× RTX 4090 | +$370/mo | +$0.51/hr |

Live per-unit rates (Intel Cascade Lake baseline):

- vCPU — **$2.50/mo** on Cascade Lake, **$3.00/mo** on AMD Milan
- RAM — **$1.25/mo** per GiB
- NVMe boot disk — **$0.05/mo** per GiB
- RTX 4090 GPU — **$0.51/GPU-hour** (≈$370/mo) per card, on top of the vCPU + RAM you configure
- Public IPv4 — **$2.00/mo** per address (optional)

The right-rail quote runs on every change and shows the live per-second / monthly / monthly-prepaid cost.

## Operating system

Pick a curated image — Ubuntu 24.04 / 22.04, Debian 12, Fedora — resolved server-side and served from the in-region image mirror at LAN speed. The advanced section also accepts a **custom image URL** (any HTTPS-reachable raw / qcow2 cloud image) or an existing **disk** to reuse as boot (see [VM lifecycle](https://metalhost.net/docs/dashboard/guides/vms-lifecycle.md)).

## Access: users & SSH keys

Add one or more **login users**. Each user has:

- a **username** (defaults to the image's distro user, e.g. `ubuntu`),
- an optional **password** — sent over TLS and hashed server-side (`$6$` SHA-512) into cloud-init; never stored in plaintext,
- passwordless **sudo** (on by default), and
- any of your registered **SSH keys** (set up under *Developers → SSH keys*).

Password auth (`ssh_pwauth`) is enabled only when a user has a password, so the SSH-key-only default posture is unchanged. Toggle **public IPv4** here for inbound from the open internet (IPv6 is always-on).

> **full control with cloud-init**
>
> The advanced section takes raw `#cloud-config` user-data. When you provide it, it *owns* user creation — the users editor above is ignored and your YAML is the source of truth.

## Billing modes

Pick at create time. Switch hourly ↔ monthly later; mid-term changes prorate. Auto-renew only matters for monthly modes.

| Mode | Term | Discount | When to use |
| --- | --- | --- | --- |
| Hourly (default) | per-second | — | Short-lived VMs, CI, autoscaling. |
| Monthly · 1 mo | 30 d prepaid | 0% | Flat monthly bill without a long commit. |
| Monthly · 3 mo | 3 mo prepaid | 5% | Quarter-long workloads. |
| Monthly · 6 mo | 6 mo prepaid | 8% | Half-year commitments. |
| Monthly · 12 mo | 12 mo prepaid | 12% | Annual reservations on stable shapes. |

Monthly prepayment debits the wallet immediately. If the wallet can't cover the term, the create fails — top up first.

## Networking

Every VM joins your project's private [VPC](https://metalhost.net/docs/dashboard/guides/networks.md) and, by default, also gets a public NIC. The first VM in a project lazily provisions the VPC — that's why your first *Create VM* in a fresh project takes a few extra seconds.

- **Public IPv6** — always-on and free; every VM gets a routable v6 address unless you mark it private-only.
- **Public IPv4** — optional, $2/mo, opt-in at create time (you can't attach one post-create).
- **Private only** — opt out of the public NIC entirely for an air-gapped VM. No public IPv4 or IPv6; reachable only inside the project. Outbound NAT still works.
- **Security groups** — optionally attach [security groups](https://metalhost.net/docs/dashboard/guides/security-groups.md) to lock down which project VMs can reach this one. None attached = talks freely within the project.

> **default inbound posture**
>
> The public NIC is default-deny. One rule is seeded so you can get in — **SSH (TCP/22)**, open to both IPv4 and IPv6. Everything else inbound is denied; open more ports under *VM → Firewall*.

## Create & track

Hit **Create VM**. A confirmation appears and you're taken to your VM list, where the new row shows `PROVISIONING` → `STARTING` → `RUNNING`. Typical end-to-end is ~90 seconds — longer the first time in a project (network bring-up) or for large custom images. If provisioning fails, the resource is rolled back and any prepaid wallet debit is refunded; the operation card explains why.

## What's next

- [VM lifecycle](https://metalhost.net/docs/dashboard/guides/vms-lifecycle.md) — start, stop, restart, resize, console, snapshot, clone.
- [SSH keys](https://metalhost.net/docs/dashboard/guides/ssh-keys.md) — register reusable keys per project.
- [Firewall rules](https://metalhost.net/docs/dashboard/guides/firewall.md) — open ports beyond the default SSH rule.
- [Public IPv4](https://metalhost.net/docs/dashboard/guides/public-ipv4.md) — pricing, default-deny posture.
