Zwölf Builds

Proxmox auf Bare Metal, mit verschachtelten virtuellen Maschinen, die funktionieren

Ein Single-Tenant-EPYC-Rechner mit Proxmox VE auf gespiegelter NVMe, einer gerouteten Bridge für Gäste und verschachtelter Virtualisierung, die von einem Gast aus nachgewiesen wird.

Was hier entsteht

Ein Bare-Metal-Server mit Proxmox VE als eigenem Hypervisor, einem ZFS-Mirror über die NVMe-Laufwerke, einer Bridge, die Gästen echte Adressen zuweist, und verschachtelter Virtualisierung, die aktiviert und verifiziert wurde – das heißt, ein Gast auf dieser Maschine kann selbst Gäste ausführen.

Verschachtelung ist der Grund, dies auf Metall statt auf einer virtuellen Instanz zu tun. Sie können nicht in den Hypervisor eines anderen verschachteln und dabei vorhersehbare Ergebnisse erwarten, und auf einem BM-E gibt es keinen Hypervisor von uns im Weg: Sie haben IPMI, einen Einschaltknopf und das Mainboard. Was darauf läuft, ist Ihre Entscheidung.

Bevor Sie beginnen

  • Ein BM-E: 32 Zen-4-Kerne, 256 GB ECC, vier NVMe-Laufwerke und acht IPv4-Adressen. IPMI ist über ein VPN erreichbar, das der Support bei der Übergabe einrichtet.
  • Proxmox VE 8 zum Bestellzeitpunkt ausgewählt oder eine benutzerdefinierte ISO über das Panel hochgeladen. Beide Wege führen zum selben Installationsprogramm.
  • Eine halbe Stunde, in der niemand die Maschine braucht, denn Schritt eins startet sie mehrmals neu.

1. Installation

Verbinden Sie sich über das Verwaltungs-VPN mit der Konsole, hängen Sie die ISO ein und booten Sie davon. Wählen Sie im Bildschirm zur Datenträgerauswahl alle vier NVMe-Geräte aus, wählen Sie zfs (RAID10) und öffnen Sie die erweiterten Optionen:

  • ashift auf 12, was der korrekte Wert für 4-Kilobyte-Sektoren ist und danach nur durch einen Neuaufbau des Pools geändert werden kann.
  • compress auf lz4. Das kostet einen Bruchteil eines Kerns und bringt typischerweise ein Drittel des Platzes zurück.
  • hdsize reduziert, um den Rest für Gast-Speicher zu lassen, es sei denn, der Root-Pool soll alles bekommen.

Setzen Sie Verwaltungsadresse und Gateway aus den Panel-Details und verwenden Sie den vollqualifizierten Namen der Maschine als Hostnamen. Nach zwei Neustarts haben Sie eine Anmeldeaufforderung und eine Weboberfläche auf Port 8006.

2. Repositories und Pakete

Das Enterprise-Repository wird ohne Abonnement fehlschlagen und jede apt update überladen, bis Sie sich darum kümmern:

rm -f /etc/apt/sources.list.d/pve-enterprise.sources
echo "deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-community.list
apt update && apt full-upgrade -y
apt install -y ifupdown2 chrony zfsutils-linux
reboot

3. Speicher für ZFS

Der ARC würde sonst auf die Hälfte Ihres RAMs anwachsen, und auf einer Maschine, deren einzige Aufgabe darin besteht, Gäste zu betreiben, hat dieser Speicher eine bessere Verwendung:

echo "options zfs zfs_arc_max=34359738368" > /etc/modprobe.d/zfs.conf
update-initramfs -u -k all

Einunddreißig Gigabyte ARC auf einer 256-GB-Maschine lassen genug für Caching übrig, ohne die Gäste auszuhungern. Starten Sie neu, um es zu übernehmen, oder setzen Sie es live mit echo in /sys/module/zfs/parameters/zfs_arc_max ein, falls Sie das nicht können.

4. Netzwerk

Acht Adressen sind nicht viele, also sitzen Gäste auf einer privaten Bridge, und nur diejenigen, die eine öffentliche Adresse benötigen, erhalten eine geroutete Adresse. Bearbeiten Sie /etc/network/interfaces:

auto lo
iface lo inet loopback

auto enp1s0f0
iface enp1s0f0 inet static
  address <public address>/24
  gateway <gateway>

auto vmbr0
iface vmbr0 inet static
  address 10.20.0.1/24
  bridge-ports none
  bridge-stp off
  bridge-fd 0
  post-up   iptables -t nat -A POSTROUTING -s 10.20.0.0/24 -o enp1s0f0 -j MASQUERADE
  post-down iptables -t nat -D POSTROUTING -s 10.20.0.0/24 -o enp1s0f0 -j MASQUERADE

iface vmbr0 inet6 static
  address 2001:db8:1a2b:20::1/64

IPv6 benötigt keine Adressübersetzung, da das an die Maschine geroutete /64 tatsächlich geroutet ist: Weisen Sie Adressen daraus Gästen auf der Bridge zu, und sie erreichen das Internet direkt. Diese Asymmetrie zwischen den beiden Familien ist nicht elegant, aber sie ist die ehrliche Form des Adressraums, in dem wir leben.

sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/80-pve.conf
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.d/80-pve.conf
ifreload -a

5. Verschachtelte Virtualisierung

cat /sys/module/kvm_amd/parameters/nested

Bei aktuellen Kerneln zeigt dies bereits 1. Wenn es 0 anzeigt:

echo "options kvm-amd nested=1" > /etc/modprobe.d/kvm-amd.conf
update-initramfs -u && reboot

Verschachtelung erfordert auch, dass der Gast eine CPU sieht, die zugibt, dieses Feature zu haben, was bedeutet, dass der Prozessortyp host sein muss. Alles andere präsentiert ein synthetisches CPU-Modell mit maskierten Virtualisierungserweiterungen, und der innere Hypervisor weigert sich zu starten, mit einem Fehler, der nichts davon erwähnt.

6. Ein Gast

cd /var/lib/vz/template/iso
wget https://cloud.debian.org/images/cloud/trixie/latest/debian-13-genericcloud-amd64.qcow2

qm create 100 --name inner --memory 16384 --cores 8 --cpu host \
  --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-single --ostype l26 \
  --agent enabled=1 --machine q35 --bios ovmf
qm set 100 --efidisk0 local-zfs:1
qm importdisk 100 debian-13-genericcloud-amd64.qcow2 local-zfs
qm set 100 --scsi0 local-zfs:vm-100-disk-1,discard=on,ssd=1
qm set 100 --boot order=scsi0
qm set 100 --ipconfig0 ip=10.20.0.100/24,gw=10.20.0.1
qm set 100 --sshkeys /root/.ssh/authorized_keys
qm set 100 --ciuser admin
qm start 100

discard=on mit ssd=1 bedeutet, dass Löschungen im Gast an den Pool zurückgegeben werden, anstatt sich als Speicher anzusammeln, den Sie aus den Augen verloren haben.

7. Firewall

Die Weboberfläche auf Port 8006 hat nichts auf einer öffentlich erreichbaren Adresse zu suchen. Beschränken Sie sie auf Rechenzentrumsebene auf die Adresse, von der aus Sie verwalten – der Tunnel-Endpunkt aus dem WireGuard-Leitfaden ist der naheliegende Kandidat:

cat > /etc/pve/firewall/cluster.fw <<EOF
[OPTIONS]
enable: 1
policy_in: DROP

[RULES]
IN SSH(ACCEPT) -source 10.7.0.0/24
IN ACCEPT -source 10.7.0.0/24 -dport 8006 -proto tcp
IN ACCEPT -p icmp
EOF
systemctl restart pve-firewall

Verifizieren

Zuerst Host:

pveversion -v | head -3
zpool status rpool
zpool list -o name,size,alloc,free,frag,cap
arc_summary | head -12

Der Pool meldet ONLINE mit zwei gespiegelten Paaren, und das ARC-Ziel liegt bei den zweiunddreißig Gigabyte, die Sie gesetzt haben, nicht bei der Hälfte der Maschine.

Jetzt der eigentliche Punkt dieses Builds. Melden Sie sich beim Gast an und prüfen Sie den Prozessor, den er erhalten hat:

ssh [email protected]
lscpu | grep -E "Model name|Virtuali"
grep -c svm /proc/cpuinfo

Der Modellname sollte der echte EPYC-Teil sein, und die Virtualisierungszeile sollte AMD-V melden. Eine Null vom dritten Befehl bedeutet, dass der Prozessortyp nicht host ist, und alles darunter wird fehlschlagen.

Führen Sie dann eine Maschine in der Maschine aus:

apt install -y qemu-system-x86 qemu-utils cpu-checker
kvm-ok
wget https://dl-cdn.alpinelinux.org/alpine/v3.22/releases/x86_64/alpine-virt-3.22.0-x86_64.iso
qemu-system-x86_64 -enable-kvm -m 2048 -cdrom alpine-virt-3.22.0-x86_64.iso -nographic

kvm-ok, das ausgibt, dass Beschleunigung verwendet werden kann, gefolgt von einem Alpine-Boot, das in ein paar Sekunden eine Anmeldeaufforderung erreicht, statt zu kriechen, ist die Verifizierung. Ohne Verschachtelung verweigert derselbe Befehl entweder ganz oder emuliert in Software mit ungefähr einem Zwanzigstel der Geschwindigkeit, was unverkennbar ist.

Bestätigen Sie zuletzt, dass die Schnittstelle von außen geschlossen ist:

curl -m5 -k https://<public address>:8006/ ; echo "exit $?"

Ein Verbindungs-Timeout ist die richtige Antwort.

Danach

Snapshots auf ZFS sind kostenlos, bis sie auseinanderlaufen, also kostet ein nächtlicher zfs-auto-snapshot-Zeitplan fast nichts und hat mehr Maschinen gerettet als jede Backup-Richtlinie. Neuaufbauten auf Metall sind am selben Tag möglich, aber ein Neuaufbau liefert Ihnen eine leere Maschine, was etwas anderes ist als die Rückgabe Ihrer Maschine.

Bereit, wenn Sie es sind

Wählen Sie eine Stadt. Wählen Sie eine Größe. Bezahlen Sie in Coins.

Keine Formulare darüber, wer Sie sind, kein Warten auf einen Menschen, der Sie genehmigt, kein Anruf zur Verifizierung. Die Rechnung wird beglichen, und die Zugangsdaten landen in Ihrem Posteingang.