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
- Download Proxmox VE ISO from proxmox.com/downloads
- Flash to USB with Etcher or Rufus
- Boot from USB (press F12/Del for boot menu)
- Install:
- Select target disk
- Set country, timezone, keyboard
- Set root password and email
- Configure network (static IP recommended)
- 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
- Click Create VM (top right)
- General: Name your VM, choose node
- OS: Upload ISO or select from storage
- System: Default (BIOS for Linux, OVMF/UEFI for Windows 11)
- Disks: Set disk size (32GB+ for Linux, 64GB+ for Windows)
- CPU: Set cores (2-4 for most)
- Memory: Set RAM (2GB+ for Linux, 4GB+ for Windows)
- Network: Select bridge (vmbr0)
- 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
- Click Create CT (top right)
- Template: Download a template first (Datacenter → Storage → CT Templates → Templates button)
- Choose Ubuntu, Debian, Alpine, etc.
- Set hostname, password, resources
- 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
- Complete Self-Hosting Guide — server basics
- Docker Cheat Sheet — containers inside Proxmox VMs
- WireGuard Setup — VPN for remote access
- Server Hardening Guide — secure your Proxmox host
- UFW Cheat Sheet — firewall for VMs
- How to Mount a Drive — storage management
- How to Set Up a Static IP — networking