The problem: one machine, many things to try
You have an old PC or mini server and want to run several things on it at once:
- One VM running Ubuntu to test backend project A
- Another VM running Debian for project B
- A VM with k3s to learn Kubernetes
- A VM running Pi-hole as a local DNS server
Running all of this on a single OS means constant conflicts: port clashes, incompatible package versions, installing one thing breaking another. Tearing it all down and starting over wastes hours.
Proxmox solves this by giving each project a completely isolated environment. Experiment, break things, delete, clone from scratch — none of it touches any other machine.
What Proxmox VE is, briefly
Proxmox Virtual Environment (PVE) is an open-source virtualization platform that installs directly on bare metal and is managed through a web UI. It runs two types of virtual environments:
- VMs (KVM): full virtual machines, run any OS, completely isolated
- LXC containers: lighter than VMs, share the host kernel, faster to start
This guide focuses on VMs because they're the best fit for "one isolated environment per project."
Installing Proxmox on a machine
Minimum requirements
- 64-bit CPU with VT-x (Intel) or AMD-V support
- 4GB RAM (8GB+ recommended in practice to run several VMs at once)
- 32GB+ storage
- Note: Proxmox installs on bare metal and takes over the entire machine — it's not installed inside Windows or Linux
Download the ISO and create a boot USB
Download the ISO from proxmox.com/downloads, choose Proxmox VE ISO Installer, latest version.
Create the boot USB:
# Linux
sudo dd if=proxmox-ve_*.iso of=/dev/sdX bs=4M status=progress
# or use Balena Etcher on Windows/macOS
Installation
Boot from USB — the process is similar to installing Ubuntu Server:
- Choose the disk to install Proxmox on
- Set timezone and keyboard layout
- Enter email and set the root password
- Configure networking: set a static IP for the Proxmox host (e.g.,
192.168.1.10/24) - Installation completes, machine reboots
After rebooting, access the web UI at:
https://192.168.1.10:8006
Log in with root and the password you set. The browser will warn about a self-signed SSL certificate — skip and continue.
Creating the first VM
Upload an ISO to Proxmox
In the web UI: local (default storage) → ISO Images → Upload → select Ubuntu/Debian ISO.
Or download directly by URL:
local → ISO Images → Download from URL
Paste a direct link to an Ubuntu/Debian minimal ISO and Proxmox will download it.
Create a VM
Click Create VM in the top right:
| Tab | Important settings |
|---|---|
| General | Name the VM, choose a VM ID (auto-increments) |
| OS | Select the ISO, type: Linux |
| System | Keep default q35, BIOS SeaBIOS or OVMF for UEFI |
| Disks | Choose local-lvm storage, set size, enable Discard for SSDs |
| CPU | Number of cores, type host to expose full host CPU features |
| Memory | RAM allocation for this VM |
| Network | Bridge vmbr0 (LAN), model VirtIO |
Once created, select the VM → Start → Console to install the OS normally.
Templates and cloning — Proxmox's biggest advantage
Creating a VM from scratch takes 10–15 minutes every time. Proxmox's template + clone workflow lets you spin up a new VM in seconds.
Creating a template
- Set up a clean Ubuntu VM with your standard packages installed (git, curl, docker...)
- Inside the VM, reset the machine ID to prevent cloned VMs from sharing it:
sudo cloud-init clean
# or if not using cloud-init:
sudo truncate -s 0 /etc/machine-id
sudo rm /var/lib/dbus/machine-id
sudo ln -s /etc/machine-id /var/lib/dbus/machine-id
- Shut down the VM
- In the Proxmox UI, right-click the VM → Convert to Template
The VM becomes a template (icon changes) and can no longer be started directly.
Cloning a VM from a template
Right-click the template → Clone:
- Full Clone — creates a completely independent copy, no dependency on the template
- Linked Clone — lighter, shares disk storage with the template via snapshots (saves space but depends on the template remaining intact)
For typical homelab use, Full Clone is simpler. Clone → Start → SSH in and you have a clean environment immediately.
Managing storage
Default storage types
After installing Proxmox, there are two storage locations by default:
- local: for ISOs, backups, templates — directory format
- local-lvm: for VM disks — LVM thin pool format, better performance
Adding a second drive
If you have an additional HDD or SSD to use for VMs:
# List available drives
lsblk
# Partition the new drive (be careful to select the correct one)
fdisk /dev/sdb
# Create a new partition, type Linux
# Set up LVM
pvcreate /dev/sdb1
vgcreate data-vg /dev/sdb1
lvcreate -L 200G -T data-vg/data-pool # 200GB thin pool
Then in the Proxmox UI: Datacenter → Storage → Add → LVM-Thin, select the VG and pool just created.
Adding a disk to a running VM
Select the VM → Hardware → Add → Hard Disk → choose storage and size → Add.
Inside the VM, the new disk appears as /dev/vdb (unpartitioned). Format and mount normally:
sudo fdisk /dev/vdb
sudo mkfs.ext4 /dev/vdb1
sudo mount /dev/vdb1 /data
Resizing a VM disk
In the Proxmox UI: select the VM → Hardware → select the disk → Resize Disk → enter additional GB.
Then inside the VM, resize the partition and filesystem:
# For an ext4 disk
sudo growpart /dev/vda 1
sudo resize2fs /dev/vda1
# For LVM inside the VM
sudo pvresize /dev/vda3
sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
Snapshots — checkpoint before risky experiments
Proxmox lets you snapshot a VM at any point, even while it's running.
Select the VM → Snapshots → Take Snapshot:
- Give it a descriptive name:
before-install-k8s,clean-state - Check Include RAM to snapshot memory state too (VM resumes exactly where it left off when restored)
If something you install breaks the VM, select the old snapshot → Rollback to return to the previous state.
Networking in Proxmox
Default bridge vmbr0
All VMs connected through vmbr0 join the same LAN as the host. VMs can get IPs via DHCP from the router or use static IPs normally.
Creating an internal network between VMs
To let VMs communicate with each other without exposing them to the LAN:
In the Proxmox host → System → Network → Create → Linux Bridge:
Name: vmbr1
IP: 10.10.10.1/24 # Proxmox host's IP on this bridge
Comment: internal lab network
When creating a VM, add a second network card connected to vmbr1. VMs on vmbr1 can talk to each other over the 10.10.10.x range.
Useful tips
Set static IPs via DHCP reservation Rather than configuring static IPs inside each VM, set DHCP reservations on the router by MAC address. Easier to manage — changing an IP means changing it in one place.
Use SSH keys instead of passwords
In the template, enable SSH and add your public key to ~/.ssh/authorized_keys. Every cloned VM is immediately accessible over SSH without a password.
Dark mode for the web UI Proxmox 8.x includes dark mode. Go to Preferences (avatar, top right) → Color Theme → Dark.
View real-time resource usage The Summary tab for each VM shows live CPU, RAM, and disk I/O. Useful for spotting which VM is consuming the most resources.
Common errors
Black screen in console after boot
Usually the VM is booting but not outputting to the serial console. Try pressing Enter once in the console window. If still black, check that the VM has an ISO attached and the boot order is correct (Options → Boot Order).
VM created but can't get an IP
Check the VM's network card is using vmbr0. If using the LAN's DHCP, the router needs to see the VM. Ping from the host to verify:
ping 192.168.1.xxx
Proxmox shows subscription error during updates
Proxmox has an enterprise (paid) edition and a community one. To update without a subscription, swap the repo:
# Disable enterprise repo
echo "# deb https://enterprise.proxmox.com/debian/pve bookworm pve-enterprise" \
> /etc/apt/sources.list.d/pve-enterprise.list
# Add no-subscription repo
echo "deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription" \
> /etc/apt/sources.list.d/pve-no-subscription.list
apt update && apt dist-upgrade
Cloned VMs have duplicate hostname and IP
Caused by not resetting the machine ID before converting the template. For already-cloned VMs, fix each one:
sudo hostnamectl set-hostname new-name
# update /etc/hosts to match
sudo truncate -s 0 /etc/machine-id
sudo systemd-machine-id-setup
When not to use Proxmox
- Machine only has 4GB RAM: Proxmox host uses ~1GB, leaving only 3GB for VMs — very tight
- Only need a single test environment: WSL2 on Windows or a single VirtualBox VM is enough
- Already on Kubernetes: k3s/k8s handles isolation on its own; you don't need a VM layer unless you need multi-node on one machine
- CPU doesn't support VT-x/AMD-V: KVM VMs won't run (LXC containers still will)