Summary

Proxmox is what you use when you want a proper hypervisor and don’t want to pay VMware prices. It combines KVM full virtualization with LXC containers under one web interface, and the fact that it’s free (with optional enterprise support) makes it the obvious choice for homelab setups. You get snapshots, clustering, live migration, and ZFS storage out of the box — no license negotiations required.

Key concepts

  • KVM (Kernel-based Virtual Machine): Full virtualization for running complete operating systems
  • LXC (Linux Containers): Lightweight OS-level virtualization for Linux systems
  • ZFS/LVM storage: Advanced storage management with snapshots and replication
  • High Availability (HA): Automatic VM failover in cluster configurations
  • Backup and restore: Built-in backup solutions with Proxmox Backup Server
  • Clustering: Multiple Proxmox nodes working as a single system

Details

Installation and initial setup

System requirements:

  • 64-bit CPU with virtualization extensions (Intel VT-x or AMD-V)
  • Minimum 2GB RAM (8GB+ recommended)
  • Storage for host OS and VM/container data
  • Network interface(s)

Installation:

# Download ISO from proxmox.com/downloads
# Boot from ISO and follow installer
# Access web interface: https://proxmox-ip:8006

Post-installation:

# Update system
apt update && apt full-upgrade
 
# Remove enterprise repository (if not subscribed)
rm /etc/apt/sources.list.d/pve-enterprise.list
 
# Add no-subscription repository
echo "deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list
 
# Update again
apt update

Web interface management

Access points:

  • Web UI: https://proxmox-ip:8006
  • Default credentials: root with installation password
  • Shell access via web terminal or SSH

Navigation:

  • Datacenter → Cluster-wide settings and overview
  • Node → Individual server management
  • VM/CT → Virtual machine or container management

Virtual machine management

Creating VMs via CLI:

# Create VM
qm create 100 --name ubuntu-vm --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0
 
# Import disk image
qm importdisk 100 ubuntu-22.04.qcow2 local-lvm
 
# Attach disk to VM
qm set 100 --scsi0 local-lvm:vm-100-disk-0
 
# Set boot order
qm set 100 --boot order=scsi0
 
# Start VM
qm start 100
 
# Stop VM
qm stop 100
 
# List all VMs
qm list
 
# Show VM config
qm config 100
 
# Delete VM
qm destroy 100

VM operations:

# Clone VM
qm clone 100 101 --name cloned-vm
 
# Create snapshot
qm snapshot 100 pre-update
 
# Rollback snapshot
qm rollback 100 pre-update
 
# Delete snapshot
qm delsnapshot 100 pre-update
 
# Migrate VM to another node
qm migrate 100 node2
 
# Resize disk
qm resize 100 scsi0 +10G

Container (LXC) management

Creating containers:

# Download container template
pveam update
pveam available
pveam download local ubuntu-22.04-standard_22.04-1_amd64.tar.zst
 
# Create container
pct create 200 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst \
  --hostname web-server \
  --memory 1024 \
  --cores 2 \
  --net0 name=eth0,bridge=vmbr0,ip=dhcp
 
# Start container
pct start 200
 
# Enter container
pct enter 200
 
# List containers
pct list
 
# Stop container
pct stop 200
 
# Delete container
pct destroy 200

Container operations:

# Create snapshot
pct snapshot 200 backup-point
 
# Restore snapshot
pct rollback 200 backup-point
 
# Clone container
pct clone 200 201 --hostname cloned-container
 
# Resize container disk
pct resize 200 rootfs +5G
 
# Execute command in container
pct exec 200 -- apt update

Storage management

Storage types:

  • Directory: Simple directory-based storage
  • LVM: Logical Volume Manager
  • LVM-thin: Thin provisioned LVM
  • ZFS: Advanced filesystem with snapshots and compression
  • NFS: Network File System
  • CIFS/SMB: Windows file shares
  • iSCSI: Block-level storage over network

Storage commands:

# List storage
pvesm status
 
# Add NFS storage
pvesm add nfs nfs-storage --server 192.168.1.10 --export /mnt/nfs
 
# Add directory storage
pvesm add dir backup-storage --path /mnt/backups
 
# Scan storage
pvesm scan nfs 192.168.1.10
 
# Remove storage
pvesm remove storage-name

ZFS management:

# Create ZFS pool
zpool create tank /dev/sdb
 
# List pools
zpool list
 
# Check pool status
zpool status
 
# Create dataset
zfs create tank/vms
 
# Enable compression
zfs set compression=lz4 tank/vms
 
# Create snapshot
zfs snapshot tank/vms@backup1
 
# List snapshots
zfs list -t snapshot

Networking

Network configuration:

# Edit network config
nano /etc/network/interfaces
 
# Apply network changes
ifreload -a
 
# View network config
cat /etc/network/interfaces

Bridge configuration example:

auto vmbr0
iface vmbr0 inet static
    address 192.168.1.10/24
    gateway 192.168.1.1
    bridge-ports enp1s0
    bridge-stp off
    bridge-fd 0

# VLAN-aware bridge
auto vmbr1
iface vmbr1 inet manual
    bridge-ports enp2s0
    bridge-stp off
    bridge-fd 0
    bridge-vlan-aware yes
    bridge-vids 2-4094

Firewall management:

# Enable firewall
pvesh set /cluster/firewall/options --enable 1
 
# Configure via web UI: Datacenter → Firewall
# Or edit files: /etc/pve/firewall/

Backup and restore

Backup commands:

# Backup VM
vzdump 100 --compress zstd --mode snapshot --storage backup-storage
 
# Backup all VMs
vzdump --all --compress zstd --mode snapshot --storage backup-storage
 
# List backups
ls -lh /var/lib/vz/dump/
 
# Restore from backup
qmrestore /var/lib/vz/dump/vzdump-qemu-100-*.vma.zst 100
 
# Delete old backups (keep last 3)
vzdump 100 --remove 1 --maxfiles 3

Backup modes:

  • snapshot: Live backup using VM snapshots (best for most cases)
  • suspend: Suspend VM, backup, resume
  • stop: Stop VM, backup, restart

Clustering

Create cluster:

# On first node
pvecm create cluster-name
 
# Get join information
pvecm status
 
# On additional nodes
pvecm add 192.168.1.10
 
# View cluster status
pvecm nodes
pvecm status
 
# Remove node from cluster
pvecm delnode node-name

Cluster features:

  • Shared configuration across nodes
  • Live migration of VMs between nodes
  • High availability (automatic failover)
  • Distributed storage with Ceph

High Availability (HA)

Enable HA:

# Add VM to HA group (via web UI or CLI)
ha-manager add vm:100
 
# Set HA parameters
ha-manager set vm:100 --state started --group ha-group1
 
# View HA status
ha-manager status
 
# Remove from HA
ha-manager remove vm:100

Command-line tools reference

System:

pveversion                        # Show Proxmox version
pvesh                            # Proxmox VE Shell (API access)
journalctl -u pve*               # View Proxmox logs
systemctl status pve*            # Check Proxmox services

Monitoring:

pvesh get /nodes/nodename/status  # Node status
pvesh get /cluster/resources      # Cluster resources
top                               # System resources
htop                              # Interactive process viewer

Examples

Quick VM deployment:

# Download cloud image
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
 
# Create VM
qm create 100 --name ubuntu-cloud --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0
 
# Import and attach disk
qm importdisk 100 jammy-server-cloudimg-amd64.img local-lvm
qm set 100 --scsi0 local-lvm:vm-100-disk-0 --boot order=scsi0
 
# Add cloud-init
qm set 100 --ide2 local-lvm:cloudinit
qm set 100 --serial0 socket --vga serial0
qm set 100 --ipconfig0 ip=dhcp
 
# Start VM
qm start 100

Automated backup script:

#!/bin/bash
# Backup all VMs with zstd compression
vzdump --all --compress zstd --mode snapshot --storage backup-storage --remove 1 --maxfiles 7

VM template creation:

# Create and configure VM
qm create 9000 --name template --memory 2048 --cores 2
 
# Convert to template
qm template 9000
 
# Clone from template
qm clone 9000 100 --name new-vm --full

Bulk container creation:

#!/bin/bash
for i in {1..5}; do
  pct create $((200+i)) local:vztmpl/ubuntu-22.04-standard.tar.zst \
    --hostname web-$i \
    --memory 1024 \
    --cores 1 \
    --net0 name=eth0,bridge=vmbr0,ip=dhcp
  pct start $((200+i))
done

LXC containers are often overlooked in favor of VMs, but for lightweight Linux services they’re significantly more efficient — worth using whenever you don’t need full OS isolation.

Resources