Featured image of post Proxmox VE VM Management: From Creation to Optimization Featured image of post Proxmox VE VM Management: From Creation to Optimization

Proxmox VE VM Management: From Creation to Optimization

Complete guide to virtual machine management on Proxmox VE. Learn VM creation, VirtIO drivers, Qemu Guest Agent, cloud-init templates, import/export, and performance tuning.

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:

ComponentRecommendedAlternative
BIOSSeaBIOS (default)OVMF (UEFI)
Machine typeq35i440fx
SCSI ControllerVirtIO SCSI singleLSI 53C895A
Qemu AgentEnabled (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 TypePerformanceFeature SupportUse Case
VirtIOBestTRIM, discard, async IOLinux guests (default choice)
SATAGoodWide OS supportOlder OS, compatibility
IDEPoorMaximum compatibilityLegacy 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.