Skip to main content

Proxmox VE 9 auf verschlüsseltem Debian 13 mit Dropbear-Remote-Unlock installieren

Diese Anleitung beschreibt die Installation von Proxmox VE 9 auf einem bereits installierten Debian 13 System mit verschlüsseltem Root-Dateisystem via LUKS. Das System wird vor dem Boot per dropbear-initramfs über SSH entsperrt. Zusätzlich wird ein zweiter verschlüsselter lokaler Storage für VM-Disks und ISO-Dateien eingerichtet.

Ausgangslage in diesem Beispiel:

  • Debian 13 Trixie ist bereits installiert.
  • Root liegt auf LUKS + LVM.
  • /boot und /boot/efi sind unverschlüsselt.
  • dropbear-initramfs funktioniert bereits.
  • Der Server wird als root administriert.
  • Hostname: byte-me
  • Management-IP: 10.100.3.13

1. Bestehende Partitionierung prüfen

lsblk
df -h
uname -r

Beispielhafte Zielstruktur für das Systemlaufwerk:

nvme0n1
├─nvme0n1p1        /boot/efi
├─nvme0n1p2        /boot
└─nvme0n1p3        crypto_LUKS
  └─nvme0n1p3_crypt
    ├─broken--vg-root   /
    └─broken--vg-swap_1 [SWAP]

Wichtig: /boot ist bei verschlüsselten Debian-Installationen oft klein. Proxmox-Kernel und Initramfs-Dateien können sehr groß werden. Vor der Installation sollte ausreichend Platz geschaffen werden.


2. Alten Debian-Kernel bereinigen

Aktuell laufenden Kernel prüfen:

uname -r

Installierte Kerneldateien prüfen:

ls -lh /boot
dpkg -l 'linux-image*' 'linux-headers*' | awk '/^ii|^rc/ {print $1, $2, $3}'

Wenn mehrere alte Kernel vorhanden sind, zuerst in den neuesten Debian-Kernel booten und danach alte Kernel entfernen.

Beispiel:

apt purge linux-image-6.12.85+deb13-amd64
apt autoremove
update-grub
df -h /boot

Falls das Paket anders heißt, den Besitzer der Kerneldatei ermitteln:

dpkg -S /boot/vmlinuz-6.12.85+deb13-amd64

Dann das exakt passende Paket entfernen, zum Beispiel:

apt purge linux-image-6.12.85+deb13-amd64-unsigned

3. Proxmox Repository einrichten

Benötigte Werkzeuge installieren:

apt install -y wget ca-certificates

Proxmox-Keyring für Debian 13 / Trixie herunterladen:

wget https://enterprise.proxmox.com/debian/proxmox-archive-keyring-trixie.gpg -O /usr/share/keyrings/proxmox-archive-keyring.gpg

Hash prüfen:

sha256sum /usr/share/keyrings/proxmox-archive-keyring.gpg

Erwarteter Hash:

136673be77aba35dcce385b28737689ad64fd785a797e57897589aed08db6e45  /usr/share/keyrings/proxmox-archive-keyring.gpg

Repository-Datei anlegen:

cat > /etc/apt/sources.list.d/proxmox.sources <<'EOF'
Types: deb
URIs: http://download.proxmox.com/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF

Paketlisten aktualisieren:

apt update

4. Proxmox-Kernel installieren

Zuerst nur den Proxmox-Kernel installieren, noch nicht das komplette Proxmox-Paket:

apt install proxmox-default-kernel

Danach GRUB prüfen:

update-grub

Erwartet wird ein Eintrag ähnlich zu:

Found linux image: /boot/vmlinuz-7.0.2-2-pve
Found initrd image: /boot/initrd.img-7.0.2-2-pve

5. Initramfs-Größe bei kleinem /boot reduzieren

Bei kleinem /boot kann der Proxmox-Initramfs zu groß werden. In diesem Setup wurde die Kompression von zstd auf xz geändert.

Datei öffnen:

nano /etc/initramfs-tools/initramfs.conf

Diese Zeile ändern:

COMPRESS=zstd

zu:

COMPRESS=xz

MODULES=most wurde bewusst beibehalten, damit Netzwerk- und Storage-Treiber für Dropbear/LUKS möglichst robust im Initramfs enthalten bleiben.

Proxmox-Initramfs neu bauen:

update-initramfs -c -k 7.0.2-2-pve

Prüfen:

df -h /boot
ls -lh /boot/initrd.img-7.0.2-2-pve

6. In den Proxmox-Kernel booten

reboot

Nach dem Reboot wie gewohnt per Dropbear entsperren.

Danach prüfen:

uname -r

Erwartet:

7.0.2-2-pve

7. Debian-Kernel entfernen

Nachdem der Proxmox-Kernel erfolgreich gebootet wurde, können die Debian-Kernel entfernt werden. Das schafft Platz in /boot und verhindert spätere Initramfs-Probleme.

Paketnamen ermitteln:

dpkg -S /boot/vmlinuz-6.12.86+deb13-amd64

Falls Debian-Headers den Kernel wieder installieren wollen, Kernel und Headers zusammen entfernen:

apt purge linux-image-6.12.86+deb13-amd64-unsigned linux-headers-6.12.86+deb13-amd64 linux-headers-6.12.86+deb13-common linux-headers-amd64

Danach Proxmox-Initramfs erneut bauen:

update-initramfs -c -k 7.0.2-2-pve
update-grub
df -h /boot

8. ZFS-DKMS entfernen und Proxmox-ZFS verwenden

Falls Debian-ZFS bereits installiert war, insbesondere zfs-dkms, sollte zfs-dkms entfernt werden. Proxmox nutzt eigene Kernel und passende ZFS-Pakete.

ZFS-Pakete prüfen:

dpkg -l 'zfs*' 'spl*' | awk '/^ii|^rc/ {print $1, $2, $3}'

zfs-dkms entfernen:

apt purge zfs-dkms

Falls dabei zfsutils-linux und zfs-zed entfernt wurden, diese aus dem Proxmox-Repository wieder installieren:

apt install zfsutils-linux zfs-zed

Prüfen:

dpkg -l 'zfs*' 'proxmox*' 'pve*' | awk '/^ii|^rc/ {print $1, $2, $3}'

Gewünscht:

ii proxmox-default-kernel ...
ii proxmox-kernel-7.0 ...
ii pve-firmware ...
ii zfs-zed ...
ii zfsutils-linux ...

Nicht gewünscht:

ii zfs-dkms ...

9. Proxmox VE installieren

apt install proxmox-ve postfix open-iscsi chrony

Bei der Postfix-Abfrage kann für einen normalen Proxmox-Host gewählt werden:

Local only

Entfernungen während der Installation sind normal:

  • exim4-* wird durch postfix ersetzt.
  • ifupdown wird durch ifupdown2 ersetzt.
  • systemd-timesyncd wird durch chrony ersetzt.

10. Hostname-Auflösung für Proxmox korrigieren

Proxmox benötigt, dass der Hostname auf eine echte Nicht-Loopback-IP zeigt. Wenn pve-cluster nicht startet und im Journal steht:

Unable to resolve node name 'byte-me' to a non-loopback IP address

dann muss /etc/hosts angepasst werden.

Datei öffnen:

nano /etc/hosts

Beispiel:

127.0.0.1       localhost
10.100.3.13     byte-me.localdomain byte-me

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Wichtig: Der Hostname byte-me darf nicht auf 127.0.0.1 oder 127.0.1.1 zeigen.

Prüfen:

hostname
hostname -f
getent hosts byte-me

Erwartung:

byte-me
byte-me.localdomain
10.100.3.13 byte-me.localdomain byte-me

Proxmox-Dienste neu starten:

systemctl reset-failed pve-cluster
systemctl restart pve-cluster
systemctl restart pvedaemon pveproxy pvestatd

Status prüfen:

systemctl status pve-cluster pvedaemon pveproxy pvestatd --no-pager

Erwartung:

pve-cluster   active
pvedaemon     active
pveproxy      active
pvestatd      active

Weboberfläche:

https://10.100.3.13:8006/

Verschlüsselten lokalen VM-Storage einrichten

Zusätzlich wurde eine zweite NVMe als verschlüsselter Storage für VMs und ISO-Dateien eingerichtet. In diesem Beispiel:

/dev/nvme1n1

Achtung: Die folgenden Schritte löschen die Zielplatte. Nicht auf dem Systemlaufwerk ausführen.


11. Zielplatte prüfen

lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL
wipefs -n /dev/nvme1n1

Beispiel:

nvme1n1 953,9G disk SKHynix_HFS001TEJ9X162N

12. Partition erstellen

fdisk /dev/nvme1n1

In fdisk:

g
n
1


y
w

Danach prüfen:

lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL /dev/nvme1n1

Erwartung:

nvme1n1       953,9G disk
└─nvme1n1p1   953,9G part

13. LUKS2 sicher formatieren

cryptsetup luksFormat \
  --type luks2 \
  --label crypt-vmstore \
  --cipher aes-xts-plain64 \
  --key-size 512 \
  --hash sha512 \
  --pbkdf argon2id \
  --iter-time 5000 \
  --verify-passphrase \
  /dev/nvme1n1p1

Eine lange Passphrase verwenden. Keine kurzen Passwörter, keine Projektnamen, keine Tastaturmuster.


14. LUKS öffnen

In diesem Beispiel wurde der Mapper exploding_disk genannt.

cryptsetup open /dev/nvme1n1p1 exploding_disk

Prüfen:

lsblk /dev/nvme1n1p1

Erwartung:

nvme1n1p1
└─exploding_disk

15. LUKS-Header sichern

Ein LUKS-Header-Backup ist wichtig. Wenn der Header beschädigt wird, sind die Daten sonst praktisch verloren.

mkdir -p /root/luks-header-backups
chmod 700 /root/luks-header-backups

cryptsetup luksHeaderBackup /dev/nvme1n1p1 \
  --header-backup-file /root/luks-header-backups/nvme1n1p1-crypt-vmstore-header.img

chmod 400 /root/luks-header-backups/nvme1n1p1-crypt-vmstore-header.img

Dieses Header-Backup sollte zusätzlich extern und sicher verschlüsselt gesichert werden. Ohne passenden Header und ohne Passphrase sind die Daten nicht wiederherstellbar.


16. LVM auf dem entschlüsselten Device erstellen

pvcreate /dev/mapper/exploding_disk
vgcreate vg_vmstore /dev/mapper/exploding_disk

Prüfen:

vgs
pvs

Erwartung:

VG           VSize    VFree
vg_vmstore   953,85g  953,85g

17. LVM-thin für VM-Disks erstellen

lvcreate -L 850G -T vg_vmstore/vmdata

Prüfen:

lvs

Beispiel:

LV       VG          Attr       LSize
vmdata   vg_vmstore  twi-a-tz-- 850,00g

18. ISO-Storage erstellen

lvcreate -L 60G -n iso vg_vmstore
mkfs.ext4 -L pve-iso /dev/vg_vmstore/iso
mkdir -p /mnt/pve/iso-store

UUID anzeigen:

blkid /dev/vg_vmstore/iso

Beispiel:

/dev/vg_vmstore/iso: LABEL="pve-iso" UUID="0f1496f7-d7ad-4e97-9243-cff799d44e5e" BLOCK_SIZE="4096" TYPE="ext4"

19. ISO-Storage in /etc/fstab eintragen

nano /etc/fstab

Eintrag ergänzen:

UUID=0f1496f7-d7ad-4e97-9243-cff799d44e5e /mnt/pve/iso-store ext4 defaults,noatime 0 2

Systemd neu laden und Mount testen:

systemctl daemon-reload
mount -a
df -h /mnt/pve/iso-store

20. Storage in Proxmox eintragen

LVM-thin für VM- und Container-Disks:

pvesm add lvmthin vmstore \
  --vgname vg_vmstore \
  --thinpool vmdata \
  --content images,rootdir

Directory-Storage für ISOs und Container-Templates:

pvesm add dir iso-store \
  --path /mnt/pve/iso-store \
  --content iso,vztmpl

Status prüfen:

pvesm status

Beispiel:

Name             Type     Status     Total (KiB)      Used (KiB) Available (KiB)        %
iso-store         dir     active        61611820            2084        58447624    0.00%
local             dir     active       477545328       154494456       298719404   32.35%
vmstore       lvmthin     active       891289600               0       891289600    0.00%

Optional: Automatisches Entsperren des zweiten LUKS-Storage

Ein Keyfile auf dem verschlüsselten Root-Dateisystem ist komfortabel, reduziert aber die Trennung der Sicherheitsstufen. Ohne Keyfile braucht ein Angreifer bei Diebstahl beider Platten Root-Passphrase und Storage-Passphrase. Mit Keyfile reicht die Root-Passphrase, weil danach das Keyfile verfügbar ist.

Variante A: Maximale Trennung

Kein Keyfile verwenden. Nach jedem Boot manuell entsperren:

cryptsetup open /dev/nvme1n1p1 exploding_disk
vgchange -ay vg_vmstore
mount -a

VM-Autostart für VMs auf diesem Storage sollte dann deaktiviert werden, weil der Storage nach dem Boot zunächst fehlt.

Variante B: Komfortabler Auto-Unlock nach Root-Unlock

Keyfile auf verschlüsseltem Root-Dateisystem erstellen:

mkdir -p /root/luks-keys
chmod 700 /root/luks-keys

dd if=/dev/random of=/root/luks-keys/exploding_disk.key bs=64 count=1
chmod 400 /root/luks-keys/exploding_disk.key

Keyfile zu LUKS hinzufügen:

cryptsetup luksAddKey /dev/nvme1n1p1 /root/luks-keys/exploding_disk.key

LUKS-UUID anzeigen:

blkid /dev/nvme1n1p1

/etc/crypttab bearbeiten:

nano /etc/crypttab

Eintrag ergänzen:

exploding_disk UUID=DEINE-LUKS-UUID-HIER /root/luks-keys/exploding_disk.key luks

Systemd neu laden:

systemctl daemon-reload

Ceph-Zukunftsplanung

Für später geplante drei Proxmox-Nodes mit Ceph gilt:

  • Die aktuell lokal genutzte NVMe muss später für Ceph gelöscht werden.
  • VMs müssen vorher vom lokalen Storage auf Ceph migriert werden.
  • Ceph-OSDs sollten später direkt über Proxmox/Ceph mit Encryption erstellt werden.
  • Nicht vorher manuell LUKS + LVM bauen und dann Ceph darüberlegen.

Geplanter späterer Ablauf:

1. PVE 2 und PVE 3 installieren
2. Cluster erstellen
3. Dediziertes 10G-Netz für Ceph konfigurieren
4. Ceph installieren
5. Auf allen Nodes freie NVMe als verschlüsselte Ceph-OSD einrichten
6. Ceph-Pool erstellen
7. VM-Storage auf Ceph RBD anlegen
8. VMs vom lokalen vmstore auf Ceph migrieren
9. Lokalen LUKS/LVM-Storage auf nvme1n1 entfernen
10. nvme1n1 als Ceph-OSD neu verwenden

Mit nur einem Node ist Ceph nicht sinnvoll redundant. Für produktive Ceph-Nutzung sollten mindestens drei Proxmox-Nodes vorhanden sein.


Wichtige Checks nach der Einrichtung

dpkg --audit
df -h /boot
uname -r
pvesm status
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS
vgs
lvs
systemctl status pve-cluster pvedaemon pveproxy pvestatd --no-pager

Erwartung:

Kernel: 7.0.2-2-pve
/boot nicht voll
pve-cluster active
pvedaemon active
pveproxy active
pvestatd active
vmstore active
iso-store active

Zusammenfassung

  • Debian 13 mit LUKS-Root und Dropbear-Remote-Unlock wurde als Basis verwendet.
  • Proxmox VE 9 wurde auf Debian installiert.
  • Der Proxmox-Kernel wurde zuerst einzeln installiert und getestet.
  • /boot-Probleme wurden durch Entfernen alter Debian-Kernel und COMPRESS=xz behoben.
  • zfs-dkms wurde entfernt und Proxmox-ZFS verwendet.
  • Hostname-Auflösung wurde für pve-cluster korrigiert.
  • Eine zweite NVMe wurde mit LUKS2 verschlüsselt.
  • Darauf wurde LVM-thin für VM-Disks eingerichtet.
  • Ein ext4-LV wurde als ISO-/Template-Storage eingebunden.
  • Späterer Ceph-Betrieb ist möglich, erfordert aber Migration und Neuanlage der Disk als Ceph-OSD.