# 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:**

<div class="callout info" id="bkmrk-debian-13-trixie-ist">- 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`

</div>---

## 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.