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.

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 as root, so every command in this guide is run as root.
  • 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.

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.

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 update shows 401 Unauthorized for enterprise.proxmox.com: a pve-enterprise repository file is enabled but you have no subscription. Comment out the line in /etc/apt/sources.list.d/pve-enterprise.list and run apt update again.
  • pve-cluster fails to start after installation: the hostname does not resolve to the public IP. Repeat Step 1, check hostname --ip-address, then run systemctl 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.