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:
ashiftauf 12, was der korrekte Wert für 4-Kilobyte-Sektoren ist und danach nur durch einen Neuaufbau des Pools geändert werden kann.compressauf lz4. Das kostet einen Bruchteil eines Kerns und bringt typischerweise ein Drittel des Platzes zurück.hdsizereduziert, 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
reboot3. 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 allEinunddreiß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/64IPv6 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 -a5. Verschachtelte Virtualisierung
cat /sys/module/kvm_amd/parameters/nestedBei 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 && rebootVerschachtelung 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 100discard=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-firewallVerifizieren
Zuerst Host:
pveversion -v | head -3
zpool status rpool
zpool list -o name,size,alloc,free,frag,cap
arc_summary | head -12Der 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/cpuinfoDer 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 -nographickvm-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.