
Proxmox VE 9 is based on Debian 13 (Trixie) and introduces a newer kernel, updated LXC, QEMU and improved virtualization stack. This guide presents a simplified and automated method to install Proxmox VE 9 on a clean Debian 13 system using two installation scripts.
The method follows the same approach as my previous Proxmox 8 on Debian 12 guide, but adapted for Debian 13 and Proxmox VE 9.
Prerequisites
- Fresh Debian 13 (Trixie) installation
- Root access
- Internet connectivity
All commands must be executed as root.
Part 1 – System Preparation & Proxmox Kernel Installation
Download the first script:
|
1 2 3 |
wget http://soban.pl/bash/install-proxmox9-part1.sh chmod +x install-proxmox9-part1.sh ./install-proxmox9-part1.sh |
This script:
- Sets hostname and updates /etc/hosts
- Installs Proxmox archive keyring (verified via SHA512)
- Adds Proxmox VE 9 repository for Debian 13
- Performs full system upgrade
- Installs proxmox-default-kernel
- Reboots the system
Content of install-proxmox9-part1.sh
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
#!/usr/bin/env bash set -euo pipefail # Part 1/2: Debian 13 (Trixie) -> Proxmox VE 9 # - sets /etc/hosts # - adds PVE repo + installs Proxmox archive keyring (verified by SHA512) # - full-upgrade # - installs proxmox-default-kernel # - reboots log() { echo "[$(date '+%F %T')] $*"; } die() { echo "ERROR: $*" >&2; exit 1; } if [[ "$(id -u)" -ne 0 ]]; then die "Run as root." fi log "=== Proxmox VE 9 install (part 1/2) on Debian 13 Trixie ===" if ! grep -qi 'trixie' /etc/os-release; then log "WARNING: This does not look like Debian 13 (Trixie). Continue at your own risk." fi log "Network interfaces (for reference):" ip -br -c a || true CURRENT_HOSTNAME="$(hostname)" CURRENT_IP="$(hostname -I | awk '{print $1}')" read -r -p "Hostname for this node [${CURRENT_HOSTNAME}]: " HOSTNAME HOSTNAME="${HOSTNAME:-$CURRENT_HOSTNAME}" read -r -p "Primary IP for /etc/hosts [${CURRENT_IP}]: " IPADDR IPADDR="${IPADDR:-$CURRENT_IP}" if [[ -z "${HOSTNAME}" || -z "${IPADDR}" ]]; then die "Hostname/IP cannot be empty." fi log "Setting hostname to: ${HOSTNAME}" hostnamectl set-hostname "${HOSTNAME}" log "Backing up /etc/hosts -> /etc/hosts.backup" cp -a /etc/hosts /etc/hosts.backup log "Writing /etc/hosts (makes hostname resolvable locally)" cat > /etc/hosts <<EOT 127.0.0.1 localhost ${IPADDR} ${HOSTNAME} # IPv6 ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters EOT log "Installing prerequisites" apt update apt install -y wget ca-certificates gnupg log "Installing Proxmox archive keyring to /usr/share/keyrings/proxmox-archive-keyring.gpg" KEYRING="/usr/share/keyrings/proxmox-archive-keyring.gpg" wget -q https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg -O "${KEYRING}" log "Verifying SHA512 of keyring" EXPECTED_SHA512="8678f2327c49276615288d7ca11e7d296bc8a2b96946fe565a9c81e533f9b15a5dbbad210a0ad5cd46d361ff1d3c4bac55844bc296beefa4f88b86e44e69fa51" ACTUAL_SHA512="$(sha512sum "${KEYRING}" | awk '{print $1}')" if [[ "${ACTUAL_SHA512}" != "${EXPECTED_SHA512}" ]]; then die "Keyring SHA512 mismatch! Expected: ${EXPECTED_SHA512} Actual: ${ACTUAL_SHA512}" fi log "Adding Proxmox VE 9 no-subscription repo (Trixie)" cat > /etc/apt/sources.list.d/pve-install-repo.list <<EOT deb [arch=amd64 signed-by=/usr/share/keyrings/proxmox-archive-keyring.gpg] http://download.proxmox.com/debian/pve trixie pve-no-subscription EOT log "Updating + full-upgrade" apt update apt full-upgrade -y log "Installing Proxmox kernel meta-package: proxmox-default-kernel" apt install -y proxmox-default-kernel log "Part 1 done. Rebooting now. After reboot run: ./install-proxmox9-part2.sh" reboot |
Part 2 – Proxmox VE 9 Installation
After reboot, download and execute:
|
1 2 3 |
wget http://soban.pl/bash/install-proxmox9-part2.sh chmod +x install-proxmox9-part2.sh ./install-proxmox9-part2.sh |
Content of install-proxmox9-part2.sh
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#!/usr/bin/env bash set -euo pipefail # Part 2/2: Debian 13 (Trixie) -> Proxmox VE 9 # - verifies running PVE kernel (unless FORCE=1) # - installs proxmox-ve + required packages # - removes Debian kernel packages (keeps pve) # - updates grub # - removes os-prober # - prints URL to GUI log() { echo "[$(date '+%F %T')] $*"; } die() { echo "ERROR: $*" >&2; exit 1; } FORCE="${FORCE:-0}" if [[ "$(id -u)" -ne 0 ]]; then die "Run as root." fi log "=== Proxmox VE 9 install (part 2/2) ===" KERNEL="$(uname -r || true)" if ! echo "${KERNEL}" | grep -qi 'pve'; then if [[ "${FORCE}" != "1" ]]; then die "You are NOT running a PVE kernel (uname -r: ${KERNEL}). Reboot and select the Proxmox kernel first. If you really want to continue anyway: FORCE=1 ./install-proxmox9-part2.sh" else log "WARNING: Continuing despite not running PVE kernel because FORCE=1" fi else log "OK: running PVE kernel: ${KERNEL}" fi log "Update package lists" apt update log "Install Proxmox VE packages" # postfix is optional but commonly installed by docs; choose config during prompts DEBIAN_FRONTEND=readline apt install -y proxmox-ve postfix open-iscsi chrony log "Upgrade remaining packages" apt full-upgrade -y log "Removing Debian kernel meta-package and non-PVE kernels (best-effort)" # Remove Debian meta kernel (keeps proxmox kernel) apt remove -y linux-image-amd64 || true # Purge any installed linux-image-* that is NOT a pve kernel mapfile -t KPKGS < <(dpkg -l | awk '/^ii linux-image-/{print $2}' | grep -vE 'pve|proxmox' || true) if (( ${#KPKGS[@]} > 0 )); then log "Purging non-PVE kernel packages: ${KPKGS[*]}" apt purge -y "${KPKGS[@]}" || true fi log "Update grub" update-grub || true log "Remove os-prober (recommended for servers; avoids odd grub side effects)" apt remove -y os-prober || true log "Done. Proxmox UI should be available at:" IP="$(hostname -I | awk '{print $1}')" echo "https://${IP}:8006" log "Login: root + your root password" |
Accessing the Web Interface
After completing the second script, open:
|
1 |
https://YOUR_SERVER_IP:8006 |
Login with the root user and your root password. You may see a certificate warning — this is normal for fresh installations.
Conclusion
This method provides a clean and controlled way to deploy Proxmox VE 9 directly on Debian 13 without using the ISO installer. It is especially useful for automated environments, labs, and custom infrastructure setups.