Introduction

Creating a virtual machine in Proxmox VE is straightforward, but the choices you make during setup significantly impact performance and functionality. This guide walks through creating an optimized Ubuntu Server VM with best-practice configurations for production or homelab use.

What you’ll learn:

  • Upload an Ubuntu Server ISO to Proxmox storage
  • Create a VM with optimal hardware settings
  • Configure storage, networking, and system options
  • Enable QEMU Guest Agent for better VM management
  • Apply performance tuning for maximum efficiency

This guide is ideal for:

  • Setting up development/test environments
  • Creating production servers
  • Building homelab infrastructure
  • Preparing VMs for Docker or Kubernetes

Prerequisites

Before creating a VM, ensure you have:

  • Proxmox VE installed and accessible (tested with 6.x, 7.x, 8.x)
  • Administrative access to the Proxmox web interface
  • Ubuntu Server ISO downloaded (22.04 LTS or 24.04 LTS recommended)
  • Sufficient storage on Proxmox host (minimum 32GB for VM, 50GB+ recommended)
  • Network connectivity configured on Proxmox host

Recommended Resources:

  • CPU: 2+ cores
  • RAM: 2GB minimum (4GB recommended for comfort)
  • Disk: 32GB minimum (50GB+ for production workloads)

Part 1: Upload Ubuntu Server ISO

Before creating a VM, you need to upload the Ubuntu Server ISO to Proxmox storage.

Step 1: Access Proxmox Web Interface

  1. Open your browser and navigate to:

    https://your-proxmox-ip:8006
    

    Example: https://192.168.1.50:8006

  2. Log in with your Proxmox credentials

    • Username: root (or your configured admin user)
    • Realm: PAM or Proxmox VE authentication server

Step 2: Select Storage for ISO

  1. Expand your node in the left sidebar (e.g., pve)

  2. Click on your storage where ISOs are kept

    • Usually named local or local-lvm
    • For ISOs, select a storage type that supports “ISO images”
  1. Click on “ISO Images” in the storage menu

Step 3: Upload the ISO

You have two options for getting the ISO into Proxmox:

Option A: Upload from Local Computer

  1. Click the “Upload” button

  2. Click “Select File” and choose your downloaded Ubuntu Server ISO

    • File name example: ubuntu-22.04.3-live-server-amd64.iso
  3. Click “Upload”

  4. Wait for upload to complete

    • Progress bar will show upload status
    • Large files (1GB+) may take several minutes

Expected result:

Task OK
TASK OK

Option B: Download from URL

  1. Click “Download from URL”

  2. Enter the Ubuntu ISO URL:

    https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso
    
  3. Click “Query URL” to verify the download

  4. Click “Download”

  5. Monitor progress in the task log

Advantages of this method:

  • No need to download ISO to your computer first
  • Faster for remote Proxmox installations
  • Saves bandwidth if Proxmox has faster internet

Part 2: Create the Virtual Machine

Now that the ISO is uploaded, let’s create the VM.

Step 1: Start VM Creation Wizard

  1. Click “Create VM” button in the top-right corner of Proxmox interface

The VM creation wizard will appear with several configuration tabs.

Step 2: General Settings

Tab 1: General

  • Node: pve (or your node name - pre-selected, usually can’t change)
  • VM ID: 100 (auto-assigned, can customize)
    • Sequential IDs (100, 101, 102) are recommended for organization
    • Template VMs often use ranges like 9000-9999
  • Name: ubuntu-server (or descriptive name like web-server-01, docker-host)
  • Resource Pool: Optional (useful for organizing many VMs)

Naming best practices:

  • Use descriptive names: web-server-prod, db-server-dev
  • Include environment: app-server-staging
  • Add numbers for multiples: worker-node-01, worker-node-02

Click “Next” to proceed.

Step 3: OS Configuration

Tab 2: OS

  • Use CD/DVD disc image file (iso): Selected
  • Storage: local (wherever you uploaded the ISO)
  • ISO image: Select ubuntu-22.04.3-live-server-amd64.iso from dropdown
  • Type: Linux
  • Version: 6.x - 2.6 Kernel (works for all modern Ubuntu versions)

Advanced options (expand “Advanced” checkbox at bottom):

  • Machine: q35 (recommended for modern VMs, supports PCIe devices)
    • Alternative: i440fx (older, more compatible but fewer features)
  • BIOS: OVMF (UEFI) (modern, faster boot, required for some features)
    • Alternative: SeaBIOS (legacy BIOS, use for older OSes)
  • Add EFI Disk: Yes (required when using UEFI)
  • EFI Storage: local-lvm (where to store EFI boot data)
  • Pre-Enroll keys: No (keep unchecked for Linux VMs)

⚠️ Important: UEFI/BIOS choice cannot be changed after VM creation without recreating the VM.

Click “Next”.

Step 4: System Configuration

Tab 3: System

  • Graphic card: Default (VGA)
    • Alternative: VirtIO-GPU for better performance if using desktop environment
  • Machine: q35 (from previous step, shown here for confirmation)
  • BIOS: OVMF (UEFI) (from previous step)
  • SCSI Controller: VirtIO SCSI single (recommended for best performance)
    • Provides better I/O performance than IDE
    • Required for advanced features like discard/TRIM
  • Qemu Agent: ☑ Checked/Enabled (CRITICAL - allows Proxmox to query VM info)
    • Enables IP address display in Proxmox GUI
    • Required for proper shutdown and snapshot operations
    • Improves time synchronization

Advanced options:

  • Add TPM: Unchecked (not needed for basic Ubuntu Server)
  • TPM Storage: N/A

Click “Next”.

Step 5: Disk Configuration

Tab 4: Disks

  • Bus/Device: SCSI (matches SCSI controller from system tab)
    • SCSI provides better performance and scalability than IDE or SATA
  • Storage: local-lvm (your main storage - adjust based on your setup)
  • Disk size (GiB): 32 (minimum for Ubuntu Server)
    • Recommended sizes:
      • Minimal server: 32GB
      • Docker host: 50-100GB
      • Database server: 100GB+
      • Development server: 50GB
  • Format: QEMU image format (qcow2) (default, cannot change after creation)
    • Note: Format choice is permanent - choose wisely!
    • qcow2: Thin provisioning, snapshots supported
    • raw: Slightly better performance, no snapshots, uses full space immediately

Advanced options (expand “Advanced”):

  • Cache: Write back (unsafe) (best performance for most workloads)
    • Write back: Fastest, small risk of data loss on power failure
    • No cache: Safest but slower
    • Write through: Balanced option
  • Discard: ☑ Enabled (recommended if Proxmox host uses SSD)
    • Allows TRIM operations to free up space
    • Improves SSD performance and longevity
  • SSD emulation: ☑ Enabled (if your storage is SSD)
    • Makes VM aware it’s on SSD storage
  • IO thread: ☑ Enabled (improves performance on multi-core systems)
    • Offloads disk I/O to dedicated threads
  • Read-only: ☐ Unchecked
  • Backup: ☑ Enabled (include this disk in backups)
  • Skip replication: ☐ Unchecked
  • Asyncio: io_uring (best performance on modern kernels)

Click “Next”.

Step 6: CPU Configuration

Tab 5: CPU

  • Sockets: 1 (number of physical CPU sockets to emulate)
    • Most VMs use 1 socket
    • Multiple sockets only needed for NUMA workloads
  • Cores: 2 (number of cores per socket)
    • Recommended:
      • Minimal server: 1-2 cores
      • Docker/container host: 2-4 cores
      • Database server: 4-8 cores
      • Development: 2-4 cores
  • Type: host (exposes all host CPU features to VM)
    • Best performance: host
    • Better migration compatibility: kvm64 or x86-64-v2-AES
  • CPU Units: 1024 (default weight for CPU time allocation)
    • Higher values = more priority
    • Useful when multiple VMs compete for CPU

Advanced options:

  • Enable NUMA: ☐ Unchecked (not needed for typical VMs)
  • Extra CPU Flags: Leave empty (unless you know specific flags are needed)
  • CPU limit: Leave unchecked (no artificial CPU throttling)

⚠️ Warning: Setting Type: host means VM cannot migrate to Proxmox nodes with different CPU models. Use kvm64 if you need live migration flexibility.

Click “Next”.

Step 7: Memory Configuration

Tab 6: Memory

  • Memory (MiB): 2048 (2GB - minimum for Ubuntu Server)
    • Recommended:
      • Minimal server: 2GB (2048 MiB)
      • Docker/container host: 4GB (4096 MiB)
      • Database server: 8GB+ (8192+ MiB)
      • Development: 4GB (4096 MiB)

Advanced options (Ballooning):

  • Minimum memory (MiB): 2048 (same as max for fixed allocation)
    • Leave at same value as “Memory” to disable ballooning
    • Set lower to enable memory ballooning (dynamic allocation)
  • Ballooning Device: ☑ Enabled (allows dynamic memory adjustment)
    • Useful for overcommitting memory across multiple VMs
    • Requires balloon driver in guest OS (included in modern Linux kernels)

Ballooning example for advanced use:

  • Memory (MiB): 4096 (maximum memory)
  • Minimum memory (MiB): 2048 (minimum memory)
  • Result: VM can use between 2-4GB, Proxmox adjusts based on host pressure

For most users, set both values the same to disable ballooning (simpler, more predictable).

Click “Next”.

Step 8: Network Configuration

Tab 7: Network

  • Bridge: vmbr0 (your Proxmox network bridge)
    • Usually vmbr0 is the default bridge connected to your LAN
    • Check Proxmox network settings if unsure
  • Model: VirtIO (paravirtualized) (recommended for best performance)
    • VirtIO is fastest network model for Linux VMs
    • Alternative: Intel E1000 (better compatibility, slower)
  • MAC address: Auto-generated (leave default)
  • VLAN Tag: Leave empty (unless you’re using VLANs)
  • Firewall: ☑ Enabled (recommended for security)
    • Enables Proxmox firewall for this VM
    • Configure firewall rules in VM → Firewall section later
  • Multiqueue: 2 (should match CPU cores for best performance)
    • Allows parallel network packet processing
    • Set to number of CPU cores (we set 2 cores above)

Advanced options:

  • Rate limit (MB/s): Leave empty (no bandwidth limit)
  • Disconnect: ☐ Unchecked (network is connected on boot)

Click “Next”.

Step 9: Confirmation

Tab 8: Confirm

Review all settings before creating the VM:

General:
  Node:     pve
  VM ID:    100
  Name:     ubuntu-server

OS:
  ISO:      ubuntu-22.04.3-live-server-amd64.iso
  Type:     Linux
  Version:  6.x - 2.6 Kernel
  Machine:  q35
  BIOS:     OVMF (UEFI)

System:
  SCSI Controller: VirtIO SCSI single
  Qemu Agent:      Enabled

Disks:
  scsi0:    local-lvm:32,iothread=1,discard=on,cache=writeback

CPU:
  Sockets:  1
  Cores:    2
  Type:     host

Memory:
  Memory:   2048 MiB

Network:
  net0:     virtio,bridge=vmbr0,firewall=1

Important checkboxes at bottom:

  • Start after created (recommended - starts VM immediately)

Click “Finish” to create the VM.


Part 3: Install Ubuntu Server

After clicking “Finish,” the VM will be created and started automatically (if you checked “Start after created”).

Step 1: Access VM Console

  1. Click on the new VM (100 (ubuntu-server)) in the left sidebar

  2. Click on “Console” tab

The Ubuntu Server installation process will begin automatically.

Step 2: Ubuntu Installation Process

Follow the Ubuntu Server installation wizard:

  1. Language: Select your preferred language (usually English)

  2. Keyboard: Select your keyboard layout

  3. Installation type: Select “Ubuntu Server” (not minimal)

  4. Network: Keep default settings (DHCP)

    • You’ll configure static IP later if needed
  5. Proxy: Leave blank unless you use a proxy

  6. Mirror: Keep default Ubuntu archive mirror

  7. Storage: Use entire disk (default)

    • LVM setup: Optional (recommended for flexibility)
    • Disk encryption: Optional (adds overhead)
  8. Profile setup:

    • Your name: Admin (or your name)
    • Server name: ubuntu-server (should match VM name)
    • Username: admin (or your preferred username)
    • Password: Choose a strong password
  9. SSH Setup:

    • Install OpenSSH server (HIGHLY RECOMMENDED)
    • Allows SSH access after installation completes
    • Import SSH keys from GitHub/Launchpad: Optional
  10. Featured Server Snaps:

    • DO NOT install snaps during installation
    • Snaps can be installed later if needed
    • Keeping installation minimal is recommended
  11. Installation begins

    • Wait for installation to complete (5-15 minutes)
    • Progress bar shows package installation
  12. Installation complete

    • Press Enter to reboot
    • VM will reboot into the new Ubuntu Server installation

Part 4: Post-Installation Configuration

After Ubuntu Server installation completes and the VM reboots, perform these essential configurations.

Step 1: Enable QEMU Guest Agent in VM

The QEMU Guest Agent allows Proxmox to properly manage the VM (get IP address, clean shutdown, etc.).

In Proxmox Web Interface:

  1. Click on your VM in the sidebar

  2. Click “Options” tab

  3. Find “QEMU Guest Agent” in the list

  4. Double-click “QEMU Guest Agent” to edit

  5. Set “Use QEMU Guest Agent” to Yes

  6. Click “OK”

In the Ubuntu VM:

Log into the VM console and install the guest agent:

# Update package list
sudo apt update

# Install QEMU guest agent
sudo apt install -y qemu-guest-agent

# Start the service
sudo systemctl start qemu-guest-agent

# Enable to start on boot
sudo systemctl enable qemu-guest-agent

# Verify it's running
sudo systemctl status qemu-guest-agent

Expected output:

● qemu-guest-agent.service - QEMU Guest Agent
     Loaded: loaded (/lib/systemd/system/qemu-guest-agent.service; enabled)
     Active: active (running) since Mon 2024-12-05 10:30:00 UTC

Reboot the VM for changes to take full effect:

sudo reboot

After reboot, the VM’s IP address will appear in the Proxmox web interface summary.

Step 2: Enable TRIM/Discard (SSD Optimization)

If your Proxmox host uses SSD storage, enable TRIM to maintain performance:

# Enable fstrim timer (automatic TRIM)
sudo systemctl enable fstrim.timer

# Start the timer
sudo systemctl start fstrim.timer

# Verify it's enabled
sudo systemctl status fstrim.timer

Expected output:

● fstrim.timer - Discard unused blocks once a week
     Loaded: loaded (/lib/systemd/system/fstrim.timer; enabled)
     Active: active (waiting)

This runs TRIM automatically once a week, keeping your SSD performing optimally.

Step 3: Update System Packages

# Update package lists
sudo apt update

# Upgrade all packages
sudo apt upgrade -y

# Remove unnecessary packages
sudo apt autoremove -y

# Reboot if kernel was updated
sudo reboot

Part 5: Performance Tuning (Optional)

For production workloads or maximum performance, consider these optimizations:

Enable Hugepages (Large Memory Pages)

Edit VM configuration in Proxmox shell:

# On Proxmox host, edit VM config
qm set 100 --hugepages 1024

# Or enable in Proxmox GUI:
# VM → Hardware → Memory → Edit → Hugepages: 1024

Enable CPU Pinning (Dedicated Cores)

For performance-critical VMs, pin specific CPU cores:

# Pin VM to cores 2-3
qm set 100 --cores 2 --cpulimit 2 --affinity 2,3

Optimize Network Performance

# On Proxmox host
qm set 100 --net0 virtio,bridge=vmbr0,firewall=1,queues=2,mtu=9000

# MTU 9000 enables jumbo frames (if your network supports it)
# queues=2 matches our 2-core CPU

Troubleshooting

VM Won’t Boot / Black Screen

Cause: UEFI/BIOS misconfiguration or missing EFI disk

Solution:

  1. Stop the VM
  2. Check VM → Hardware → EFI Disk exists
  3. If missing, you’ll need to recreate the VM with “Add EFI Disk” enabled

QEMU Guest Agent Not Showing IP

Cause: Agent not installed or not running in guest

Solution:

# In VM console
sudo apt install qemu-guest-agent
sudo systemctl enable --now qemu-guest-agent
sudo reboot

Poor Disk Performance

Cause: Suboptimal disk settings

Solution:

  1. VM → Hardware → Hard Disk → Edit
  2. Enable IO thread
  3. Set Cache to “Write back”
  4. Enable Discard (if on SSD)

Network Not Working

Cause: Wrong network model or bridge

Solution:

  1. Verify bridge exists: Proxmox → System → Network → vmbr0
  2. Change network model to VirtIO: VM → Hardware → Network Device → Edit → Model: VirtIO

Next Steps

Now that your Ubuntu Server VM is running:

  1. Configure SSH access (see related post: “How to Set Up SSH on Ubuntu Server”)
  2. Set static IP address (see related post: “How to Configure Static IP with Netplan”)
  3. Install Docker if needed (see related post: “How to Install Docker on Ubuntu”)
  4. Create a template from this VM for rapid deployment (see related post: “How to Create a VM Template in Proxmox”)

  • How to Set Up SSH on Ubuntu Server
  • How to Install Docker on Ubuntu Server
  • How to Configure Static IP on Ubuntu with Netplan
  • How to Create a VM Template in Proxmox

Last updated: November 2025