Proxmox Setup Guide: Virtualization Server from Scratch

7 min read
Intermediate Proxmox Virtualization Homelab Self-Hosting Guide

Quick Answer: Download Proxmox VE ISO from proxmox.com, flash to USB, boot and install. Access web UI at https://your-ip:8006. Create VMs and containers from the browser. Free to use (enterprise repo requires subscription, but community repo works fine).


What Is Proxmox?

Proxmox VE (Virtual Environment) is a free, open-source server virtualization platform. It runs directly on bare metal and lets you create:

  • VMs (Virtual Machines) — full operating systems with their own kernel (Windows, Linux, BSD)
  • LXC Containers — lightweight Linux containers (share the host kernel, less overhead)

Think of it as your own mini cloud provider at home.

Feature Proxmox VE VMware ESXi Hyper-V
Price Free (community) Paid (free tier limited) Windows Server license
Web UI Yes Yes Limited
Containers (LXC) Yes No No
VM Live Migration Yes Yes Yes
ZFS Support Built-in No No
Backup Built-in Paid add-on Third-party
Clustering Yes (free) Paid Paid

Install Proxmox

Requirements

Component Minimum Recommended
CPU 64-bit with VT-x/VT-d Modern Intel/AMD with many cores
RAM 4 GB 32 GB+ (each VM needs its own)
Storage 32 GB SSD for OS, additional drives for VMs
Network 1 NIC 2+ NICs (management + VM traffic)

Installation Steps

  1. Download Proxmox VE ISO from proxmox.com/downloads
  2. Flash to USB with Etcher or Rufus
  3. Boot from USB (press F12/Del for boot menu)
  4. Install:
  • Select target disk
  • Set country, timezone, keyboard
  • Set root password and email
  • Configure network (static IP recommended)
  1. Reboot and remove USB

Access Web UI

Open a browser: https://YOUR_IP:8006

Login: root / your password


Post-Install Setup

Fix the Subscription Nag

Proxmox shows a "No valid subscription" popup. To use the free community repo:

# SSH into Proxmox
ssh root@YOUR_IP

# Disable enterprise repo (requires paid subscription)
sed -i 's/^deb/#deb/' /etc/apt/sources.list.d/pve-enterprise.list

# Add community (free) repo
echo "deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list

# Update
apt update && apt full-upgrade -y

Remove Subscription Popup (Optional)

# This removes the nag popup from the web UI
sed -Ezi.bak "s/(Ext\.Msg\.show\(\{.*?title: gettext\('No valid sub)/void\(\{ \/\/\1/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
systemctl restart pveproxy

> **Note:** This change is overwritten by Proxmox updates. Re-apply after each `apt upgrade` that updates the widget toolkit.

Create a Virtual Machine

Via Web UI

  1. Click Create VM (top right)
  2. General: Name your VM, choose node
  3. OS: Upload ISO or select from storage
  4. System: Default (BIOS for Linux, OVMF/UEFI for Windows 11)
  5. Disks: Set disk size (32GB+ for Linux, 64GB+ for Windows)
  6. CPU: Set cores (2-4 for most)
  7. Memory: Set RAM (2GB+ for Linux, 4GB+ for Windows)
  8. Network: Select bridge (vmbr0)
  9. Confirm and start

Via Command Line

# Create a VM (ID 100)
qm create 100 --name my-vm --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0

# Import a cloud image disk
qm importdisk 100 ubuntu-cloud.img local-lvm

# Set boot disk
qm set 100 --scsi0 local-lvm:vm-100-disk-0 --boot c --bootdisk scsi0

# Start VM
qm start 100

# Stop VM
qm stop 100

# List VMs
qm list

Download Cloud Images (Quick VMs)

# Download Ubuntu cloud image
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img

# Create VM with cloud-init
qm create 100 --name ubuntu --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0
qm importdisk 100 jammy-server-cloudimg-amd64.img local-lvm
qm set 100 --scsi0 local-lvm:vm-100-disk-0
qm set 100 --ide2 local-lvm:cloudinit
qm set 100 --boot c --bootdisk scsi0
qm set 100 --serial0 socket --vga serial0

# Set cloud-init parameters
qm set 100 --ciuser sam --cipassword yourpassword --ipconfig0 ip=dhcp
qm start 100

Create an LXC Container

LXC containers are lighter than VMs — they share the host kernel and start in seconds.

Via Web UI

  1. Click Create CT (top right)
  2. Template: Download a template first (Datacenter → Storage → CT Templates → Templates button)
  3. Choose Ubuntu, Debian, Alpine, etc.
  4. Set hostname, password, resources
  5. Start

Via Command Line

# Download template
pveam update
pveam available | grep ubuntu
pveam download local:vztmpl ubuntu-22.04-standard_22.04-1_amd64.tar.zst

# Create container (ID 200)
pct create 200 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst \
  --hostname my-container \
  --memory 1024 \
  --cores 2 \
  --net0 name=eth0,bridge=vmbr0,ip=dhcp \
  --storage local-lvm \
  --rootfs local-lvm:8 \
  --password yourpassword

# Start
pct start 200

# Enter container shell
pct enter 200

# List containers
pct list

VM vs LXC Container

VM LXC Container
OS Support Any (Windows, Linux, BSD) Linux only
Isolation Full (own kernel) Shared kernel
Resource Usage Higher Much lower
Boot Time 30-60 seconds 1-2 seconds
Use For Windows, custom kernels, full isolation Web servers, Docker, services

Storage

Storage Types

Type Best For Speed
local ISOs, templates, backups Varies
local-lvm VM disks, CT rootfs Fast
ZFS Data integrity, snapshots Fast
NFS Shared storage, backups Network speed
Ceph Distributed (multi-node) Fast

Add Storage

# Add NFS storage
pvesm add nfs backup-nfs --server 192.168.1.10 --export /backups --content backup

# Add directory
pvesm add dir extra-storage --path /mnt/extra --content images,vztmpl,iso

# List storage
pvesm status

ZFS (Recommended for Data Integrity)

# Create ZFS pool (mirror = RAID1)
zpool create tank mirror /dev/sdb /dev/sdc

# Add as Proxmox storage
pvesm add zfspool tank-storage --pool tank --content images,rootdir

Networking

Default Setup

Proxmox creates vmbr0 — a Linux bridge connected to your physical NIC. All VMs/CTs connect to this bridge.

VLAN Setup

# Create VLAN-aware bridge (in /etc/network/interfaces)
auto vmbr0
iface vmbr0 inet static
    address 192.168.1.100/24
    gateway 192.168.1.1
    bridge-ports eno1
    bridge-stp off
    bridge-fd 0
    bridge-vlan-aware yes
    bridge-vids 2-4094

Then assign VLANs to VMs in their network settings.


Backups

Schedule Backups (Web UI)

Datacenter → Backup → Add:

  • Node: All or specific
  • Storage: Backup location
  • Schedule: Daily, weekly
  • Mode: Snapshot (no downtime) or Stop

Manual Backup

# Backup VM 100
vzdump 100 --storage local --mode snapshot --compress zstd

# Backup all VMs
vzdump --all --storage local --mode snapshot

# Restore
qmrestore /var/lib/vz/dump/vzdump-qemu-100-*.vma.zst 100

GPU Passthrough

Pass a physical GPU to a VM (for gaming, AI/ML, Plex transcoding):

# Enable IOMMU (add to /etc/default/grub)
# Intel:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
# AMD:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"

update-grub

# Load VFIO modules
echo "vfio" >> /etc/modules
echo "vfio_iommu_type1" >> /etc/modules
echo "vfio_pci" >> /etc/modules

# Blacklist host GPU driver
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf

update-initramfs -u
reboot

# Find GPU PCI ID
lspci -nn | grep -i nvidia
# Example output: 01:00.0 VGA ... [10de:2484]

# Bind to VFIO
echo "options vfio-pci ids=10de:2484,10de:228b" > /etc/modprobe.d/vfio.conf
update-initramfs -u
reboot

Then add the PCI device to your VM in the web UI: VM → Hardware → Add → PCI Device.


Useful Commands

# System status
pveversion                    # Proxmox version
pvesh get /cluster/resources  # All resources
pvesh get /nodes              # Node info

# VM management
qm list                      # List VMs
qm start 100                 # Start VM
qm stop 100                  # Stop VM
qm shutdown 100              # Graceful shutdown
qm reset 100                 # Force reset
qm destroy 100               # Delete VM

# Container management
pct list                      # List containers
pct start 200                 # Start
pct stop 200                  # Stop
pct enter 200                 # Shell into container
pct destroy 200               # Delete

# Storage
pvesm status                  # Storage status
df -h                         # Disk usage
zpool status                  # ZFS status (if using ZFS)

Troubleshooting

Problem Fix
Can't access web UI Check IP, try https://ip:8006, accept SSL warning
VM won't start Check RAM/disk allocation. Look at journalctl -u pve*
No internet in VM Check bridge config. Verify vmbr0 is connected to physical NIC
Slow VM performance Enable VirtIO drivers (especially for Windows). Use SSD storage
GPU passthrough fails Check IOMMU is enabled: `dmesg \ grep -i iommu`. Verify VFIO binding
Container can't resolve DNS Add nameserver 1.1.1.1 to container's /etc/resolv.conf
"No valid subscription" Use community repo (see Post-Install Setup)

Related Guides