Proxmox VE is an open source virtualization platform that runs KVM virtual machines and LXC containers and manages them from a web interface. Proxmox provides its own ISO installer, but on a dedicated server it is often easier to install Debian first and add Proxmox VE on top. In this tutorial you will turn a Debian 12 Bookworm server into a Proxmox VE 8 host, configure a network bridge for your virtual machines and add the server's LVM volume group as VM storage.
NoteProxmox VE 8 is based on Debian 12. Proxmox VE 9 is based on Debian 13 Trixie and follows the same procedure with
trixierepositories. Check the Proxmox VE roadmap for the support dates of each release before building a new host.
Prerequisites
To follow this tutorial you need:
- A dedicated server with a 64-bit (x86_64) CPU that supports hardware virtualization (Intel VT-x or AMD-V), freshly installed with Debian 12 Bookworm. On a CubePath dedicated server you can install Debian 12 from the control panel using the automatic OS installation.
- SSH access as
root. Proxmox VE is administered asroot, so every command in this guide is run asroot. - Access to the server's remote console (IPMI/KVM). You will change the network configuration, and a mistake there can cut your SSH session.
- The server's public IP address, netmask and gateway, and the name of its main network interface.
Confirm that the CPU exposes virtualization extensions. The command must print a number greater than zero:
grep -Ec '(vmx|svm)' /proc/cpuinfo
Step 1 - Making the hostname resolve to the public IP
Proxmox VE requires the server's hostname to resolve to its public IP address, not to a loopback address such as 127.0.1.1. Check the current hostname:
hostname
Open /etc/hosts:
nano /etc/hosts
Make sure it contains a line with your server's public IP, the fully qualified name and the short hostname. Replace your_server_ip, pve1.example.com and pve1 with your own values, and remove or comment out any 127.0.1.1 line that points to the same hostname:
127.0.0.1 localhost
your_server_ip pve1.example.com pve1
Verify that the hostname now resolves to the public IP:
hostname --ip-address
your_server_ip
Step 2 - Adding the Proxmox VE repository
Proxmox publishes a free pve-no-subscription repository for hosts without a paid subscription. First download the Proxmox release key into /etc/apt/keyrings:
mkdir -p /etc/apt/keyrings
wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/keyrings/proxmox-release-bookworm.gpg
Check the key's checksum and compare it with the value published in the "Install Proxmox VE on Debian 12 Bookworm" page of the Proxmox wiki:
sha512sum /etc/apt/keyrings/proxmox-release-bookworm.gpg
7da6fe34168adc6e479327ba517796d4702fa2f8b4f0a9833f5ea6e6b48f6507a6da403a274fe201595edc86a84463d50383d07f64bdde2e3658108db7d6dc87 /etc/apt/keyrings/proxmox-release-bookworm.gpg
Add the repository, signed by that key:
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/proxmox-release-bookworm.gpg] http://download.proxmox.com/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list
Refresh the package index and upgrade the base system:
apt update && apt full-upgrade
The apt update output must include lines for download.proxmox.com without errors.
Step 3 - Installing the Proxmox kernel
Proxmox VE ships its own kernel with the patches and modules it needs. Install it and reboot into it:
apt install proxmox-default-kernel
systemctl reboot
When the server is back, reconnect over SSH and confirm that the running kernel ends in -pve:
uname -r
6.8.12-4-pve
The exact version number will differ; the -pve suffix is what matters.
Step 4 - Installing the Proxmox VE packages
Install the Proxmox VE meta package together with Postfix (used to send system notifications), open-iscsi and chrony for time synchronization:
apt install proxmox-ve postfix open-iscsi chrony
During the installation Postfix asks for a configuration type. If you do not run a mail server, choose Local only and keep the proposed system mail name. You can configure a relay later.
Once the installation finishes, remove the stock Debian kernel so that future kernel updates do not replace the Proxmox one, and regenerate the GRUB menu:
apt remove linux-image-amd64 'linux-image-6.1*'
update-grub
The Proxmox wiki also recommends removing os-prober, which can otherwise add the disks of your virtual machines to the boot menu:
apt remove os-prober
Check the installed version:
pveversion
pve-manager/8.4.1/2a5fa54a8503f96d (running kernel: 6.8.12-4-pve)
The web interface is served by the pveproxy service on port 8006. Confirm it is running:
systemctl status pveproxy --no-pager
The output should show active (running).
Step 5 - Creating the vmbr0 bridge
Virtual machines connect to the network through a Linux bridge. The standard layout is a bridge called vmbr0 that takes over the server's public IP and uses the physical interface as its port.
Find the name of your main interface (for example eno1, enp1s0 or ens18) and the current address:
ip -br address
ip route show default
Make a backup of the current configuration so you can restore it from the remote console if something goes wrong:
cp /etc/network/interfaces /etc/network/interfaces.bak
Open the file:
nano /etc/network/interfaces
Replace its content with the following block. Change eno1 to your interface name, and your_server_ip/prefix and your_gateway to the values of your server:
auto lo
iface lo inet loopback
auto eno1
iface eno1 inet manual
auto vmbr0
iface vmbr0 inet static
address your_server_ip/prefix
gateway your_gateway
bridge-ports eno1
bridge-stp off
bridge-fd 0
The physical interface no longer has an address of its own; the IP now lives on vmbr0. Keep the DNS settings you already have in /etc/resolv.conf.
WarningA typo in this file leaves the server without network. Keep the remote console open before applying the change.
Reboot to apply the new configuration:
systemctl reboot
After reconnecting, check that the public IP is on vmbr0 and that the bridge has the physical interface as its port:
ip -br address show vmbr0
bridge link
vmbr0 UP your_server_ip/prefix
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master vmbr0 state forwarding priority 32 cost 100
Using additional IPs in your virtual machines
If you have additional IPs assigned to the server and want to use them inside virtual machines, enable IPv4 forwarding on the host with a drop-in file:
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/99-ip-forward.conf
sysctl --system
Confirm the value:
sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
Inside each virtual machine attached to vmbr0, configure the additional IP with a /24 mask and use the main IP of the Proxmox node as the gateway. If your additional IPs are delivered in a different way, open a ticket with CubePath support before configuring them.
Step 6 - Logging in to the web interface
Open the following address in your browser, replacing your_server_ip:
https://your_server_ip:8006
The certificate is self-signed, so the browser shows a warning the first time; accept it to continue. Log in with the user root, the realm Linux PAM standard authentication and the server's root password. A notice about not having a valid subscription appears at every login; it is informational and does not block any feature.
ImportantPort 8006 gives full control of the host. Restrict it to your own IPs with the Proxmox firewall (Datacenter > Firewall) and enable two-factor authentication for
rootunder Datacenter > Permissions > Two Factor. Do not install UFW on a Proxmox host, because it conflicts with the Proxmox firewall rules.
Step 7 - Adding the vg0 volume group as VM storage
When Debian is installed with the automatic installation of the CubePath panel, the disks are set up with LVM in a volume group called vg0, and the free space in that group is where your virtual machine disks should live. Check the volume group and how much free space it has:
vgs vg0
VG #PV #LV #SN Attr VSize VFree
vg0 1 2 0 wz--n- 893.25g 850.00g
Add it to Proxmox as LVM storage with the ID local-lvm, allowed to hold VM disks and container volumes. You can do this in the web interface under Datacenter > Storage > Add > LVM (ID local-lvm, volume group vg0, content Disk image, Container), or with a single command:
pvesm add lvm local-lvm --vgname vg0 --content images,rootdir
Verify that the storage is active:
pvesm status
Name Type Status Total Used Available %
local dir active 30832548 4220432 25022868 13.69%
local-lvm lvm active 936640512 45088768 891551744 4.81%
From now on, select local-lvm as the storage when you create a virtual machine or container. Proxmox creates one logical volume in vg0 for each virtual disk.
Troubleshooting
apt updateshows401 Unauthorizedforenterprise.proxmox.com: apve-enterpriserepository file is enabled but you have no subscription. Comment out the line in/etc/apt/sources.list.d/pve-enterprise.listand runapt updateagain.pve-clusterfails to start after installation: the hostname does not resolve to the public IP. Repeat Step 1, checkhostname --ip-address, then runsystemctl restart pve-cluster pveproxy.- The server is unreachable after Step 5: log in through the remote console, restore the backup with
cp /etc/network/interfaces.bak /etc/network/interfaces, reboot and review the interface name and gateway. - Virtual machines fail to start with a KVM error: hardware virtualization is disabled in the BIOS. Enable Intel VT-x or AMD-V and check again with
grep -Ec '(vmx|svm)' /proc/cpuinfo.
Conclusion
Your Debian 12 server now runs Proxmox VE 8 with a bridged network and LVM storage on vg0, ready to host virtual machines and containers. As next steps, upload an ISO image or download an LXC template from the local storage, create your first virtual machine on local-lvm, and configure scheduled backups under Datacenter > Backup to a storage outside the host.
