Proxmox auf VPS installieren: geht das?
Prüfen Sie mit kvm-ok, ob Ihr VPS die vmx oder svm Flags unterstützt. Erfahren Sie, warum Proxmox ohne Hardware-Virtualisierung fehlschlägt.
Die kurze Antwort
Nested Virtualization bezeichnet einen Hypervisor, der innerhalb einer virtuellen Maschine läuft: Ihr VPS ist bereits ein Gast, und Sie möchten darauf eigene Gäste hosten. Dies funktioniert nur, wenn der Hypervisor Ihres Providers die Virtualisierungs-Erweiterungen der CPU explizit an Ihre Instanz weitergibt. Prüfen Sie /proc/cpuinfo auf das Flag vmx (Intel) oder svm (AMD). Wenn keines dieser Flags erscheint, kann keine Konfiguration innerhalb des VPS das Problem beheben.
Ein wichtiger Hinweis vorab: Docker benötigt dies nicht. Container nutzen den Kernel Ihres VPS und greifen niemals auf /dev/kvm zu. Wenn das Ziel darin besteht, „mehrere Dienste in Containern auf meinem Server auszuführen“, besitzen Sie bereits alles Notwendige. Nested Virtualization ist nur relevant, wenn Sie einen zweiten Kernel benötigen – etwa für ein Proxmox-Labor, einen Windows-Gast, Firecracker microVMs, einen Android-Emulator, ein Kubernetes-Testbed mit echten VMs oder CI-Runner, die VM-Images booten.
Was tatsächlich verschachtelt wird
Drei Ebenen:
- L0 — der Hypervisor des Anbieters auf der Hardware. Sie haben keinen Zugriff darauf.
- L1 — Ihr VPS. Für L0 ist dies lediglich ein Gast.
- L2 — die VM, die Sie innerhalb Ihres VPS ausführen möchten.
Hardware-Virtualisierung umfasst VT-x (das vmx Flag) plus EPT bei Intel sowie AMD-V / SVM (svm) plus RVI/NPT bei AMD. Ein Hypervisor nutzt diese Befehle, um in den Gastmodus zu wechseln und der CPU zu ermöglichen, zwei Seitentabellen gleichzeitig zu durchlaufen.
Keine dieser Technologien wurde für Reentrancy entwickelt, daher wird die Verschachtelung emuliert: Wenn L1 einen VMX-Befehl ausführt, erfolgt ein Trap an L0. L0 verwaltet die Shadow-Strukturen für L2 im Auftrag von L1. KVM führt dies effizient aus, jedoch verursacht L0 bei jedem Exit zusätzlichen Aufwand — deshalb muss der Anbieter dies explizit aktivieren.
Für eine beschleunigte L2 müssen beide Bedingungen erfüllt sein:
- Das KVM-Modul von L0 ist mit
nested=1geladen. - L0 weist Ihrem VPS ein CPU-Modell zu, das das Flag unterstützt —
<cpu mode='host-passthrough'/>in libvirt,cpu: hostin Proxmox,-cpu hostin nativem QEMU. Ein generisches emuliertes Modell (qemu64,kvm64) verbirgtvmx, selbst wenn die Verschachtelung global aktiviert ist.
Prüfen Sie Ihren VPS in einer Minute
# 1. Are you in a VM, and under what?
systemd-detect-virt # kvm, vmware, xen, microsoft, or "none" on metal
# 2. Does the CPU expose the extensions to you?
grep -o -E 'vmx|svm' /proc/cpuinfo | sort -u
lscpu | grep -i -E 'virtual|hypervisor'
# 3. The definitive check
sudo apt update && sudo apt install -y cpu-checker
kvm-ok
# 4. The device node the whole stack depends on
ls -l /dev/kvmEine einsatzbereite Instanz gibt vmx oder svm aus, kvm-ok gibt KVM acceleration can be used aus, und /dev/kvm existiert als root:kvm im Modus 660. Wenn das Flag vorhanden ist, aber der Device-Node fehlt, laden Sie das Modul manuell und lesen Sie das Kernel-Log:
sudo modprobe kvm_intel # or kvm_amd
sudo dmesg | tail -n 20Eine Datei wird häufig zitiert, aber oft falsch interpretiert:
cat /sys/module/kvm_intel/parameters/nested # Y or NInnerhalb Ihres VPS ist dies die Einstellung Ihres KVM-Moduls. Sie bestimmt, ob ein L2-Gast eine dritte Ebene verschachteln (nesting) kann. Sie gibt keine Auskunft darüber, ob L0 das Nesting für Sie aktiviert hat — /proc/cpuinfo und kvm-ok beantworten diese Frage. Der Parameter nested ist der Regler, den Sie auf einem Ihnen gehörenden System einstellen:
echo 'options kvm_intel nested=1' | sudo tee /etc/modprobe.d/kvm-nested.conf
sudo modprobe -r kvm_intel && sudo modprobe kvm_intelDas Entfernen des Moduls wird verweigert, solange eine VM läuft. Fahren Sie die Gäste daher zuerst herunter.
Warum die meisten VPS-Hostings diese Funktion deaktiviert lassen
- Live-Migration. Die Bereitstellung von
vmxbedeutet, dass ein CPU-Modell mit diesem Flag exponiert wird. Ein Gast, der von diesen CPU-Funktionen abhängt, kann nicht sicher auf eine Maschine migriert werden, deren CPU diese Funktionen nicht besitzt. Ein Host, der Knoten durch Migration entlastet, verliert diese Fähigkeit, sobald er Nesting aktiviert. - Angriffsfläche. Die verschachtelten VMX/SVM-Pfade gehören zu den komplexesten Code-Abschnitten in der Virtualisierungsschicht des Kernels und weisen eine entsprechende CVE-Historie auf.
- ist möglicherweise nicht KVM. Wenn
systemd-detect-virtvmware,xenodermicrosoftausgibt, gelten die Nesting-Regeln dieses Stacks und nicht die von KVM.
Kein Flag auf Ihrer Instanz? Fragen Sie den Support (einige aktivieren es pro VM), wählen Sie einen Tarif, der Nesting dokumentiert, oder wechseln Sie zu einem Dedicated Server. Der Rest dieser Anleitung setzt voraus, dass Sie Root-Zugriff auf eine Maschine haben, die das Flag anzeigt.
Ausführen eines L2-Gastes mit libvirt
sudo apt install -y qemu-system-x86 libvirt-daemon-system virtinst ovmf
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt,kvm "$USER" # log out and back in
virt-install \
--name guest1 \
--memory 2048 \
--vcpus 2 \
--cpu host-passthrough \
--disk path=/var/lib/libvirt/images/guest1.qcow2,size=20,format=qcow2,bus=virtio \
--network network=default,model=virtio \
--os-variant debian13 \
--location https://deb.debian.org/debian/dists/trixie/main/installer-amd64/ \
--graphics none \
--console pty,target_type=serial \
--extra-args 'console=ttyS0,115200n8'Eine grafische Sitzung ist nicht erforderlich. Da eine serielle Installation eine gewisse Zeit dauert, sollten Sie diese in einer persistenten Shell starten: Derselbe tmux-Workflow, der Claude Code-Sitzungen auf einem VPS am Leben erhält hält eine virt-install-Konsole auch bei einer unterbrochenen SSH-Verbindung offen. Falls --os-variant debian13 abgelehnt wird, ist Ihre osinfo-db älter als die aktuelle Version — führen Sie osinfo-query os aus und wählen Sie einen existierenden Namen. --cpu host-passthrough leitet vmx an den L2 weiter; dies ist nur erforderlich, wenn der L2 selbst virtualisieren muss. Machen Sie den Gast mit virsh autostart guest1 boot-sicher.
Der virtio-Bus für Disk und NIC dient nicht nur der Dekoration: Emulierte IDE- und e1000-Geräte lösen wesentlich häufiger Traps an den Hypervisor aus als virtio-Queues. Bei Nesting verursacht jeder Trap doppelte Kosten.
Networking: Der Teil, den Tutorials überspringen
Ihr VPS hat eine öffentliche IP und befindet sich hinter einem Fabric, das unbekannte MAC-Adressen filtert. Dies hat zwei Konsequenzen.
Das Bridging von L2-Gästen in das öffentliche Netzwerk wird normalerweise nicht funktionieren. Wenn Sie br0 auf der öffentlichen NIC konfigurieren und dem Gast eine eigene MAC zuweisen, werden Sie sehen, dass ARP-Anfragen gesendet werden, aber keine Antworten zurückkommen — der Switch des Anbieters verwirft Frames von einer MAC, die Ihnen nie zugewiesen wurde. Wenn dies das Symptom ist, beenden Sie die Fehlersuche am Bridge; dies ist die Ursache.
Verwenden Sie stattdessen das NAT-Netzwerk. libvirt liefert default: virbr0, 192.168.122.0/24 und dnsmasq-Leases mit, wodurch der ausgehende Datenverkehr sofort funktioniert. Für eingehenden Datenverkehr beenden Sie TLS auf L1 und nutzen Sie einen Proxy — die Zertifikatspfade unten stammen aus der Ausstellung eines Let's Encrypt Zertifikats mit Certbot auf Nginx:
server {
listen 443 ssl;
server_name lab.example.com;
ssl_certificate /etc/letsencrypt/live/lab.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/lab.example.com/privkey.pem;
location / {
proxy_pass http://192.168.122.50:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Geben Sie dem Gast zuerst eine statische Lease (virsh net-edit default), damit die Adresse in dieser proxy_pass konstant bleibt.
Management-Schnittstellen bleiben vom Internet getrennt: VNC auf 5900 und das Proxmox Web-UI auf 8006 sollten auf dem Loopback liegen und über einen SSH-Tunnel (ssh -N -L 8006:127.0.0.1:8006 you@your-vps) oder über ein selbst gehostetes WireGuard VPN in den VPS erreichbar sein, wodurch der gesamte 192.168.122.0/24 Gast-Bereich einen privaten Hop entfernt ist. Halten Sie die Firewall restriktiv — sudo ufw allow 22,80,443/tcp, sonst nichts. Wenn Gäste direkt nach der Aktivierung von ufw die ausgehende Verbindung verlieren, ist der übliche Verursacher DEFAULT_FORWARD_POLICY="DROP" in /etc/default/ufw — setzen Sie diesen auf ACCEPT und laden Sie ufw neu.
Proxmox auf einem VPS
Proxmox VE 9 basiert auf Debian 13. Die Installation auf einem Debian VPS erfolgt durch Hinzufügen des pve-no-subscription Repositorys und des proxmox-ve Pakets. Verwenden Sie die Repository- und Keyring-Zeilen aus der aktuellen Proxmox-Dokumentation. Eine URL aus einem alten Blogpost führt zu einem Installationsfehler.
Die Pakete sind nicht der schwierige Teil. Proxmox erwartet ein an eine physische NIC gebundenes vmbr0. Dies führt direkt zu dem oben genannten Problem mit der MAC-Filterung. Eine funktionierende Konfiguration auf einem VPS ist ein NAT- oder geroutetes vmbr0 ohne physischen Port. Die Gäste befinden sich in einem privaten Bereich. Für öffentliche Dienste werden DNAT-Regeln oder ein Reverse Proxy auf dem Host verwendet. Wenn die öffentlichen Dienste Container statt VMs sind, übernimmt Traefik als Front für mehrere Apps aus einer Docker Compose Datei dieselbe Routing-Aufgabe mit automatischen Zertifikaten. Erstellen Sie zuerst einen /etc/network/interfaces Snapshot: Eine fehlerhafte Bridge-Definition führt zum Ausschluss von einer Maschine, für die möglicherweise keine Konsole verfügbar ist.
Performance, ehrlich betrachtet
Nested Virtualization ist langsamer als Single-Level-Virtualisierung. Die Ursache ist spezifisch: Der Overhead entsteht nicht durch den Speicherzugriff, sondern durch die Exits. Wenn EPT/NPT genutzt wird, verwaltet L0 die Shadow Page Tables für L2, wodurch normale Speicherlesevorgänge mit Hardware-Geschwindigkeit ausgeführt werden. Teuer werden alle Operationen, die den Guest-Mode verlassen – I/O, Timer-Interrupts, MMIO und Inter-Processor-Interrupts. Ein L2-Exit wird von L0 verarbeitet und kann über L1 zurückgegeben werden. CPU-intensive Aufgaben mit Daten im RAM erreichen fast native Performance; Prozesse, die von Syscalls, Netzwerkpaketen oder Disk-I/O dominiert werden, leiden unter der Schichtung.
Das bedeutet: Nutzen Sie überall virtio-Devices. Ihre qcow2-Datei liegt auf einer Festplatte, die vom Provider bereits virtualisiert wurde. Es entstehen zwei Schichten von Thin-Provisioning, wobei cache=none auf der Guest-Disk verhindert, dass dieselben Blöcke gleichzeitig in zwei Page-Caches liegen. Hier werden keine Benchmark-Werte bereitgestellt: Messen Sie Ihre eigene Workload auf Ihrer eigenen Instanz.
Fehlerursachen und die angezeigten Meldungen
INFO: /dev/kvm does not exist / KVM acceleration can NOT be used von kvm-ok. Entweder ist das Modul nicht geladen oder das Flag ist nicht verfügbar. Prüfen Sie zuerst /proc/cpuinfo.
kvm: disabled by bios in dmesg. Bei Bare-Metal-Systemen aktivieren Sie den VT-x/SVM-Schalter im Firmware-Menü. In einem VPS bedeutet dies, dass L0 die Erweiterungen nicht bereitstellt; keine Einstellung im Gast ändert dies.
modprobe: ERROR: could not insert 'kvm_intel': Operation not supported. Die vom Kernel erkannte CPU besitzt kein vmx — auch dies ist eine Entscheidung von L0.
Could not access KVM kernel module: Permission denied. Berechtigungsfehler, kein Hardwarefehler. ls -l /dev/kvm sollte die Gruppe kvm und den Modus 660 anzeigen; fügen Sie sich dieser Gruppe hinzu und starten Sie eine neue Login-Shell, da Gruppenmitgliedschaften in laufenden Sitzungen nicht übernommen werden.
kvm: Device or resource busy beim Start von QEMU. Ein anderes Hypervisor-Modul belegt die CPU: Führen Sie lsmod aus, suchen Sie nach vboxdrv oder VMware-Modulen neben kvm_intel und entladen Sie das nicht benötigte Modul.
/var/run/libvirt/libvirt-sock: No such file or directory von virsh. Der Daemon ist nicht aktiv: sudo systemctl enable --now libvirtd.
Proxmox: KVM virtualisation configured, but not available. Ein Gast verwendet KVM-Beschleunigung auf einem Host, der diese nicht bereitstellen kann. Korrigieren Sie das Nesting oder deaktivieren Sie die Beschleunigung, um Emulation zu nutzen.
Android-Emulator: x86_64 emulation currently requires hardware acceleration! Erneut /dev/kvm — meistens ein Gruppenproblem.
Keine Fehlermeldung, aber extrem langsame Performance. QEMU nutzt ohne Accelerator-Flag den TCG (Software-Emulator). Das System funktioniert korrekt, ist aber langsam — ein Bootvorgang dauert statt Sekunden nun Minuten. Übergeben Sie -accel kvm explizit, damit QEMU bei fehlender Hardware mit einem Fehler abbricht, anstatt lautlos zu emulieren.
Ein Gast stürzt während des Betriebs ab. Suchen Sie in dmesg nach Out of memory: Killed process ... qemu-system-x86_64. Ein L2-Gast ist ein Prozess auf L1, und der OOM-Killer behandelt ihn wie jeden anderen Prozess. Der L2-RAM wird aus der festen Zuweisung von L1 entnommen — es erfolgt keine zusätzliche Zuweisung durch den Host.
Betrieb: Backups, Upgrades, Limits
Backups. Das Kopieren einer laufenden qcow2-Datei eines Gastes führt zu einem korrupten Image. Entweder virsh shutdown guest1 und kopieren, oder erstellen Sie einen externen Snapshot (virsh snapshot-create-as guest1 snap1 --disk-only --atomic). Dabei werden Schreibvorgänge in ein Overlay umgeleitet, während Sie die nun statische Basisdatei kopieren. Verwenden Sie anschließend virsh blockcommit, um die Änderungen wieder zusammenzuführen. Sichern Sie die Kopien außerhalb des VPS — ein Snapshot auf derselben Festplatte bietet keinen Schutz.
Upgrades. apt full-upgrade installiert neue kvm_intel/kvm_amd-Module, aber der laufende Kernel behält die alten Module bei, bis Sie neu starten. Behalten Sie den vorherigen Kernel installiert und führen Sie kvm-ok nach jeder Kernel-Änderung erneut aus: Ein Host, der ohne vmx startet, ist nur einen Boot-Eintrag von der Wiederherstellung der Funktion entfernt.
Skalierungsgrenzen. Eine öffentliche IP bedeutet, dass jeder L2-Dienst die Welt über einen Proxy oder eine DNAT-Regel auf L1 erreicht. Live-Migration ist nicht verfügbar. Bei CPU-Konflikten (CPU contention) ist der nested exit path die erste Komponente, die Performance-Einbußen erleidet. Ein Hypervisor mit mehreren Gästen verbraucht bereits den verfügbaren RAM — nested VMs können eine feste Zuweisung nicht durch Overcommit kompensieren. Wenn ein Labor diese Grenzen überschreitet, ist die Lösung kein tieferer nested stack, sondern ein dedizierter Server, auf dem Sie L0 sind und keine dieser Einschränkungen gelten.
FAQ
Benötige ich Nested Virtualization, um Docker auf einem VPS auszuführen?
Nein. Container teilen sich den Kernel Ihres VPS und öffnen niemals /dev/kvm. Eine Standard-Instanz ohne vmx oder svm Flag führt Docker und Docker Compose problemlos aus. Nesting ist nur relevant, wenn Sie einen zweiten Kernel benötigen: ein Proxmox-Lab, einen Windows-Gast, Firecracker microVMs, einen Android-Emulator oder CI-Runner, die VM-Images booten.
Wie prüfe ich, ob mein VPS Nested Virtualization unterstützt?
Führen Sie grep -o -E 'vmx|svm' /proc/cpuinfo | sort -u aus und anschließend kvm-ok aus dem Paket cpu-checker. Eine nutzbare Instanz gibt vmx (Intel) oder svm (AMD) aus, kvm-ok meldet KVM acceleration can be used, und /dev/kvm existiert mit der Gruppe kvm und dem Modus 660. Ignorieren Sie /sys/module/kvm_intel/parameters/nested für diese Frage — diese Datei beschreibt Ihr eigenes KVM-Modul, nicht das, was der Hypervisor des Anbieters bereitstellt.
Warum deaktivieren die meisten VPS-Anbieter Nested Virtualization?
Das Bereitstellen von vmx bedeutet, dem Gast ein CPU-Modell mit diesem Flag zu übergeben. Ein Gast, der von diesen CPU-Funktionen abhängt, kann nicht per Live-Migration auf eine Maschine verschoben werden, deren CPU diese Funktionen nicht besitzt. Anbieter, die Nodes durch das Verschieben von Kunden entlasten, verzichten daher darauf. Die VMX/SVM Code-Pfade für Nesting haben zudem eine lange CVE-Historie. Einige Hosts aktivieren es auf Anfrage pro VM, andere führen Nesting als geplante Funktion auf.
Meine Nested VM hat keine Netzwerkverbindung über die öffentliche Bridge. Was ist das Problem?
Der Switch des Anbieters verwirft Frames von einer MAC-Adresse, die Ihnen nie zugewiesen wurde. Ein L2-Gast, der auf die öffentliche NIC gebridged ist, sendet ARP-Anfragen, erhält aber keine Antwort. Beenden Sie die Fehlersuche bei br0 — nutzen Sie das NAT-Netzwerk default von libvirt (virbr0, 192.168.122.0/24), vergeben Sie eine statische Lease für den Gast und veröffentlichen Sie öffentliche Dienste über einen Reverse Proxy oder eine DNAT-Regel auf dem VPS selbst.
Wie viel langsamer ist eine Nested VM?
Die Performance-Einbußen entstehen durch VM-Exits, nicht durch den Speicherzugriff. Bei aktivem EPT/NPT laufen normale Lese- und Schreibvorgänge innerhalb von L2 mit Hardware-Geschwindigkeit. I/O, Timer-Interrupts, MMIO und IPIs werden jedoch von L0 verarbeitet und können über L1 zurückgegeben werden. CPU-intensive Aufgaben mit Daten im RAM verhalten sich fast wie nativ; Workloads mit vielen Syscalls, Paketen oder Disk-Zugriffen spüren jede Ebene. Verwenden Sie überall virtio-Devices und cache=none auf den Gast-Disks und messen Sie dann Ihre eigene Workload.