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)
- Download from: https://ubuntu.com/download/server
- 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
Open your browser and navigate to:
https://your-proxmox-ip:8006Example:
https://192.168.1.50:8006Log in with your Proxmox credentials
- Username:
root(or your configured admin user) - Realm:
PAMorProxmox VE authentication server
- Username:
Step 2: Select Storage for ISO
Expand your node in the left sidebar (e.g.,
pve)Click on your storage where ISOs are kept
- Usually named
localorlocal-lvm - For ISOs, select a storage type that supports “ISO images”
- Usually named
- 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
Click the “Upload” button
Click “Select File” and choose your downloaded Ubuntu Server ISO
- File name example:
ubuntu-22.04.3-live-server-amd64.iso
- File name example:
Click “Upload”
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
Click “Download from URL”
Enter the Ubuntu ISO URL:
https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.isoClick “Query URL” to verify the download
Click “Download”
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
- 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 likeweb-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.isofrom 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)
- Alternative:
- BIOS:
OVMF (UEFI)(modern, faster boot, required for some features)- Alternative:
SeaBIOS(legacy BIOS, use for older OSes)
- Alternative:
- 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-GPUfor better performance if using desktop environment
- Alternative:
- 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
- Recommended sizes:
- 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
- Recommended:
- Type:
host(exposes all host CPU features to VM)- Best performance:
host - Better migration compatibility:
kvm64orx86-64-v2-AES
- Best performance:
- 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)
- Recommended:
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
vmbr0is the default bridge connected to your LAN - Check Proxmox network settings if unsure
- Usually
- 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
Click on the new VM (
100 (ubuntu-server)) in the left sidebarClick on “Console” tab
The Ubuntu Server installation process will begin automatically.
Step 2: Ubuntu Installation Process
Follow the Ubuntu Server installation wizard:
Language: Select your preferred language (usually English)
Keyboard: Select your keyboard layout
Installation type: Select “Ubuntu Server” (not minimal)
Network: Keep default settings (DHCP)
- You’ll configure static IP later if needed
Proxy: Leave blank unless you use a proxy
Mirror: Keep default Ubuntu archive mirror
Storage: Use entire disk (default)
- LVM setup: Optional (recommended for flexibility)
- Disk encryption: Optional (adds overhead)
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
- Your name:
SSH Setup:
- ☑ Install OpenSSH server (HIGHLY RECOMMENDED)
- Allows SSH access after installation completes
- Import SSH keys from GitHub/Launchpad: Optional
Featured Server Snaps:
- ☐ DO NOT install snaps during installation
- Snaps can be installed later if needed
- Keeping installation minimal is recommended
Installation begins
- Wait for installation to complete (5-15 minutes)
- Progress bar shows package installation
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:
Click on your VM in the sidebar
Click “Options” tab
Find “QEMU Guest Agent” in the list
Double-click “QEMU Guest Agent” to edit
Set “Use QEMU Guest Agent” to Yes
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:
- Stop the VM
- Check VM → Hardware → EFI Disk exists
- 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:
- VM → Hardware → Hard Disk → Edit
- Enable IO thread
- Set Cache to “Write back”
- Enable Discard (if on SSD)
Network Not Working
Cause: Wrong network model or bridge
Solution:
- Verify bridge exists: Proxmox → System → Network →
vmbr0 - Change network model to VirtIO: VM → Hardware → Network Device → Edit → Model: VirtIO
Next Steps
Now that your Ubuntu Server VM is running:
- Configure SSH access (see related post: “How to Set Up SSH on Ubuntu Server”)
- Set static IP address (see related post: “How to Configure Static IP with Netplan”)
- Install Docker if needed (see related post: “How to Install Docker on Ubuntu”)
- Create a template from this VM for rapid deployment (see related post: “How to Create a VM Template in Proxmox”)
Related Guides
- 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