Creating a VM Step by Step
Proxmox VE provides a guided wizard for VM creation accessible from the web UI at Create VM or via the qm CLI tool. The wizard walks through eight configuration pages.
General
Set a unique VM ID (an integer, typically starting at 100) and a descriptive name. The name does not affect guest networking — it is purely for identification. Optionally, select a resource pool to organize related VMs.
OS
Choose the ISO image from your local storage or an uploaded file. If no ISO is available, upload one via the web UI under local (pve) → ISO Images → Upload. For Linux guests, the installer detects the OS type automatically. For Windows, explicitly select Microsoft Windows as the guest OS to enable optimal defaults.
System
Select the Graphics card and SCSI Controller. For modern guests, use:
| Component | Recommended | Alternative |
|---|---|---|
| BIOS | SeaBIOS (default) | OVMF (UEFI) |
| Machine type | q35 | i440fx |
| SCSI Controller | VirtIO SCSI single | LSI 53C895A |
| Qemu Agent | Enabled (checked) | Disabled |
SeaBIOS vs OVMF/UEFI: SeaBIOS is a legacy BIOS that works with almost all operating systems. OVMF provides UEFI support, required for Secure Boot and booting from NVMe drives in some configurations. If you need UEFI, switch to OVMF and add an EFI disk. Many modern Linux distributions (Ubuntu 22.04+, RHEL 9+) install faster under UEFI.
Tick Qemu Agent to enable communication between the host and guest for graceful shutdowns, snapshot quiescing, and IP address reporting.
Disks
The disk configuration is critical for performance. Proxmox supports three bus types:
| Bus Type | Performance | Feature Support | Use Case |
|---|---|---|---|
| VirtIO | Best | TRIM, discard, async IO | Linux guests (default choice) |
| SATA | Good | Wide OS support | Older OS, compatibility |
| IDE | Poor | Maximum compatibility | Legacy OS (Windows XP, etc.) |
Set the cache mode to Write back (no cache) for production workloads. Enable Discard to allow the guest to reclaim unused space on thin-provisioned storage. The SSD emulation flag tells the guest OS to treat the disk as an SSD, which can improve I/O scheduling.
CPU
Specify the number of sockets and cores. Proxmox presents the total vCPUs as sockets * cores. For most workloads, set sockets to 1 and allocate cores. Set the type to host to expose the host CPU feature set — this maximizes performance but prevents live migration to dissimilar hardware. Use kvm64 or qemu64 for migration compatibility.
Enable NUMA when the guest has more vCPUs than a single physical NUMA node. Proxmox will automatically pin memory to the correct node.
Memory
Allocate memory in MiB or GiB. Enable Ballooning to allow the host to reclaim unused memory from the guest. The minimum balloon size prevents over-reclamation that could cause swapping inside the guest. For latency-sensitive workloads (databases, real-time systems), disable ballooning.
Network
Select VirtIO (paravirtualized) as the network model. VirtIO delivers near-native throughput with low CPU overhead. Intel E1000 and Realtek RTL8139 emulated NICs are available for compatibility but perform significantly worse.
Set a static MAC address or leave it auto-generated. Assign the VM to a bridge (typically vmbr0). For multi-tenant environments, create separate bridges with different VLAN tags.
Confirm
Review the summary and check Start after created if you want the VM to boot immediately. Click Finish.
VirtIO Drivers for Windows
Windows does not ship with VirtIO drivers. Download the official VirtIO driver ISO from the Fedora project and attach it as a second CD-ROM drive to the VM.
wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
mount -o loop virtio-win.iso /mnt
cp /mnt /var/lib/vz/template/iso/
During Windows installation, load the VirtIO drivers manually when the disk selection screen appears. Browse the CD-ROM for the correct driver directory matching your OS architecture (w10/amd64 for 64-bit Windows 10/11). Without these drivers, Windows cannot see the VirtIO disk or network adapter.
After installation, install the virtio-win-guest-tools package inside Windows for ballooning, memory balloon, and viosock support.
Qemu Guest Agent
The Qemu Guest Agent (QEMU-GA) runs inside the VM and provides a communication channel to the host. Install it in the guest OS after the first boot.
Linux
# Debian / Ubuntu
apt install qemu-guest-agent
# RHEL / Rocky / Alma
dnf install qemu-guest-agent
# Enable and start
systemctl enable --now qemu-guest-agent
Windows
The agent is included in the virtio-win-guest-tools installer. Alternatively, download the MSI separately and install it. After installation, the QEMU Guest Agent service should appear and start automatically.
Verify the agent is running from the Proxmox host:
qm agent <VMID> ping
If the agent responds, the host can issue commands like:
qm agent <VMID> shutdown
qm agent <VMID> get-time
qm agent <VMID> network-get-interfaces
The agent also enables freeze/thaw for consistent filesystem snapshots and reports the guest IP address in the web UI summary panel.
Cloud-Init Templates for Automated Deployment
Cloud-init is the industry standard for initializing cloud instances. Proxmox supports it natively, allowing you to create a template VM and clone it with custom networking, SSH keys, and user data.
Create a cloud-init compatible VM:
# Create VM with cloud-init image
qm create 9000 --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0
qm importdisk 9000 jammy-server-cloudimg-amd64.img local-lvm
qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9000-disk-0
qm set 9000 --ide2 local-lvm:cloudinit
qm set 9000 --boot c --bootdisk scsi0
qm set 9000 --serial0 socket --vga serial0
qm set 9000 --agent 1
qm template 9000
Then clone the template for a new VM:
qm clone 9000 100 --name web-server --full
# Set cloud-init values
qm set 100 --sshkeys ~/.ssh/id_rsa.pub
qm set 100 --ipconfig0 ip=192.168.1.50/24,gw=192.168.1.1
qm set 100 --ciuser ubuntu
qm start 100
The web UI provides the same cloud-init fields under the Cloud-Init tab. This approach eliminates repetitive manual setup and ensures all VMs follow a consistent configuration baseline.
Importing and Exporting VMs
OVF Import
Proxmox can import OVF/OVA files created by VMware, VirtualBox, or other hypervisors. Use the qm importovf command:
qm importovf 200 vmware-export.ovf local-lvm
If the OVF references a disk not stored alongside it, download the VMDK separately and use:
qm importdisk 200 disk.vmdk local-lvm
Export to OVF
To migrate a Proxmox VM to another platform, export it:
qm template 100 # VM must be stopped
There is no native qm exportovf — use qemu-img to convert the disk image and build the OVF descriptor manually or use community tools like ovftool.
Disk Image Conversion
Convert between formats using qemu-img:
qemu-img convert -f qcow2 -O vmdk vm-100-disk-0.qcow2 vm-100-disk-0.vmdk
Supported formats include qcow2, raw, vmdk, vdi, vhdx, and qed.
Performance Tuning
CPU Pinning and NUMA
CPU pinning binds virtual CPUs to specific physical cores, preventing context-switching overhead. Use this for latency-critical workloads.
qm set <VMID> --cpulist 0-3,8-11 --numa 0
NUMA (Non-Uniform Memory Access) awareness tells the guest about the host NUMA topology. Enable it whenever the VM has more than 4 vCPUs or when running memory-intensive applications.
Ballooning Memory
Memory ballooning allows the host to reclaim unused memory from guests. The virtio-balloon driver negotiates memory pressure between host and guest. Monitor balloon usage:
# In guest
cat /sys/devices/system/memory/memory*/state
# On host
qm balloon <VMID> <memory-in-MB>
Disable ballooning for databases, Java applications, and real-time workloads.
PCIe and GPU Passthrough
Passing a physical device directly to a VM requires IOMMU support. Enable it in the kernel:
# /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
# For AMD
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on"
Update grub and reboot:
update-grub
reboot
Then add the device to the VM:
qm set <VMID> --hostpci0 01:00.0,pcie=1
GPU passthrough is popular for gaming VMs or GPU-accelerated compute workloads. Ensure the GPU is in its own IOMMU group by checking with lspci -v.
Metrics and Monitoring
Proxmox provides built-in monitoring through the Proxmox VE Metrics stack. View per-VM CPU, memory, network, and disk I/O graphs from the web UI. For external monitoring, integrate with:
- Zabbix: Official Proxmox template available
- Prometheus: Use the Proxmox VE Exporter
- Netdata: Install inside guests for granular metrics
- SNMP: Proxmox supports SNMP v2c and v3
Configure notification targets under Datacenter → Notifications for events such as guest shutdown, backup failure, or HA fence.
