Virtualization is the heart of a modern homelab. It allows you to run dozens of services on a single physical machine, turning one server into an entire infrastructure. Proxmox Virtual Environment (PVE) is the industry-standard, open-source platform for this, combining KVM-based virtual machines with lightweight LXC containers.
This guide covers the journey from bare metal to a fully functional virtualization host with working networking, storage, and firewall configuration.
Why Proxmox?
Proxmox is built on Debian, which means it is incredibly stable. It offers: - Unified Management: One dashboard for VMs, containers, backups, and storage. - KVM & LXC: Choose full virtualization (VMs) for OS independence or containerization (LXC) for extreme performance. - Built-in Backups: Snapshot and backup scheduling without third-party tools. - High Availability: Easily expand to a cluster as your lab grows. - ZFS Support: Integrated ZFS for data integrity, compression, and snapshots.
Prerequisites
Before starting, ensure you have: 1. Hardware: A PC or server with at least 8GB of RAM and an Intel/AMD CPU supporting virtualization (VT-x or AMD-V). 2. Connectivity: Ethernet cable connected to your main switch. 3. USB Drive: At least 8GB to flash the Proxmox ISO.
Step 1: Preparing the ISO
Download the latest Proxmox VE ISO from the official download page. Use dd on Linux or a graphical tool like BalenaEtcher on Windows/macOS to write the ISO to your USB drive:
# Linux: Find your USB device first
lsblk
# Write the ISO (replace /dev/sdX with your USB device)
sudo dd if=proxmox-ve_*.iso of=/dev/sdX bs=4M status=progress
sync
Step 2: The Installation Process
- Boot: Insert the USB into the target machine and boot from it via BIOS/UEFI.
- Select “Install Proxmox VE” from the boot menu.
- Target Disk: Choose the disk for Proxmox. Warning: This wipes all data on the target disk.
- Location & Time: Set your timezone and keyboard layout.
- Admin Password: Set a strong
rootpassword (use a password manager). - Email: Enter a valid email for system notifications.
- Management Network: Configure your primary interface:
- Hostname: Use
pve01.yourdomain.local(FQDN format required) - IP Address: Choose a static IP within your LAN range (e.g.,
192.168.1.10/24) - Gateway: Your router’s IP (e.g.,
192.168.1.1) - DNS:
1.1.1.1, 8.8.8.8
Once installed, the system will reboot. Access the management UI at https://<YOUR_IP>:8006. Accept the self-signed certificate warning — you can replace it with a Let’s Encrypt certificate later.
Step 3: Initial Post-Install Tweaks
3.1 Configure Repositories
Proxmox includes enterprise repos by default. For homelab use, switch to the no-subscription repository:
# Comment out enterprise repo
sed -i 's/^deb/# deb/' /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
# Update
apt update && apt dist-upgrade -y
3.2 Configure Storage
By default, Proxmox uses LVM-thin. For a homelab, ZFS is strongly recommended for data integrity, compression, and snapshots:
# Check available disks
lsblk
# Create a ZFS pool with a single disk (replace /dev/sda with your data disk)
zpool create -f -o ashift=12 tank /dev/sda
# Enable compression
zfs set compression=lz4 tank
# Create a dataset for VM storage
zfs create -o mountpoint=/tank/vm tank/vm
Then in the Proxmox Web UI: Datacenter → Storage → Add → ZFS and point it to your pool.
3.3 Network Bridge Configuration
Proxmox uses a Linux bridge (vmbr0) for VM networking. Verify your bridge configuration:
cat /etc/network/interfaces
A typical config looks like:
auto lo
iface lo inet loopback
auto enp1s0
iface enp1s0 inet manual
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
3.4 Firewall Basics
Enable the Proxmox firewall at the datacenter level:
# Enable firewall on the node
pve-firewall start
systemctl enable pve-firewall
# Check rules
pve-firewall status
In the Web UI: Datacenter → Firewall → Options → Enable: Yes. Whitelist your management IP under Datacenter → Firewall → Rules.
3.5 Remove the Subscription Nag
# Hide the subscription popup in the UI
sed -i "s/data.status !== 'Active'/false/g" /usr/share/pve-manager/js/pvemanagerlib.js
systemctl restart pveproxy
Step 4: Creating Your First Container
Before building VMs, LXC containers are lighter and ideal for Docker hosts:
# Download a Debian 12 template
pveam update
pveam download local debian-12-standard_12.7-1_amd64.tar.zst
# Create a container (CT 100, 2 cores, 4GB RAM, 20GB disk)
pct create 100 local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst \
--hostname docker-host \
--storage local-lvm \
--memory 4096 \
--cores 2 \
--net0 name=eth0,bridge=vmbr0,ip=dhcp \
--rootfs local-lvm:20 \
--password your-secure-password
# Start the container
pct start 100
# Attach to its shell
pct enter 100
Step 5: Enabling Nested Virtualization
To run Docker inside an LXC container (or VMs inside a VM), enable nesting:
# For a specific container
echo "features: nesting=1" >> /etc/pve/lxc/100.conf
# Or via command line
pct set 100 --features nesting=1
# Restart the container
pct restart 100
Troubleshooting
Web UI not loading
Check that pveproxy is running: systemctl status pveproxy. Restart with systemctl restart pveproxy.
VMs fail to start with “KVM acceleration not available”
Ensure virtualization is enabled in BIOS. Check with:
egrep -c '(vmx|svm)' /proc/cpuinfo
If it returns 0, reboot into BIOS and enable Intel VT-x or AMD SVM.
No network in container
Ensure the bridge is configured correctly and STP is disabled:
bridge link show
brctl show vmbr0
Conclusion
You now have a fully functional Proxmox node with ZFS storage, firewall protection, and a running LXC container. The next logical steps are: 1. Deploy Docker inside your LXC container 2. Set up a reverse proxy (like Nginx Proxy Manager) 3. Configure automated backups to a Proxmox Backup Server
Remember: always set up automated backups for your VMs in Datacenter → Backup before running production workloads.