SSD Nodes Learn Hosting plans →
Gidsen Matt ConnorDoor Matt Connor · Bijgewerkt 2026-08-07

Nested virtualization op een VPS: kan Proxmox draaien?

Wilt u Proxmox of KVM draaien op uw VPS? Controleer met kvm-ok of uw provider nested virtualization toestaat. Wij tonen hoe u de vmx flag checkt en welke foutmeldingen u krijgt.

Het korte antwoord

Nested virtualization is een hypervisor die binnen een virtuele machine draait: uw VPS is zelf al een gast en u wilt dat deze eigen gasten host. Dit werkt alleen wanneer de hypervisor van uw provider de virtualisatie-extensies van de CPU bewust doorgeeft aan uw instantie. Controleer /proc/cpuinfo op de vlag vmx (Intel) of svm (AMD). Als geen van beide verschijnt, zal geen enkele configuratie binnen de VPS dit oplossen.

Eerst een verwachtingsmanagement: Docker heeft dit niet nodig. Containers delen de kernel van uw VPS en gebruiken nooit /dev/kvm. Als het werkelijke doel is om "meerdere services in containers op mijn server te draaien", dan beschikt u al over alles wat nodig is. Nesting is relevant wanneer u een tweede kernel wilt, een Proxmox-lab, een Windows-gast, Firecracker microVM's, een Android-emulator, een Kubernetes-testomgeving met echte VM's, of CI-runners die VM-images opstarten.

Wat wordt er feitelijk genest

Drie lagen:

  • L0, de hypervisor van de provider, op de hardware. U heeft hier geen toegang toe.
  • L1, uw VPS. Voor L0 is dit slechts een gast.
  • L2, de VM die u binnen uw VPS wilt draaien.

Hardware-virtualisatie is VT-x (de vmx-vlag) plus EPT bij Intel, AMD-V / SVM (svm) plus RVI/NPT bij AMD. Een hypervisor gebruikt deze instructies om de gastmodus te activeren en de CPU twee paginatabellen tegelijk te laten doorlopen.

Geen van beide was ontworpen om re-entrant te zijn, dus nesting wordt geëmuleerd: wanneer L1 een VMX-instructie uitvoert, treedt er een trap op naar L0, die namens L1 de schaduwstructuren voor L2 onderhoudt. KVM doet dit goed, maar L0 moet bij elke exit extra werk verrichten, wat de reden is dat de provider hiervoor toestemming moet geven.

Aan twee voorwaarden moet worden voldaan voor een versnelde L2:

  1. De KVM-module van L0 is geladen met nested=1.
  2. L0 geeft uw VPS een CPU-model dat de vlag bevat, <cpu mode='host-passthrough'/> in libvirt, cpu: host in Proxmox, -cpu host in raw QEMU. Een generiek geëmuleerd model (qemu64, kvm64) verbergt vmx, zelfs wanneer nesting globaal is ingeschakeld.

Controleer uw VPS in één minuut

# 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/kvm

Een bruikbare instantie geeft vmx of svm weer, kvm-ok meldt KVM acceleration can be used, en /dev/kvm bestaat als root:kvm met modus 660. Als de vlag aanwezig is maar het device node niet, laad de module dan handmatig en lees het kernel-logboek:

sudo modprobe kvm_intel     # or kvm_amd
sudo dmesg | tail -n 20

Eén bestand wordt constant geciteerd en op grote schaal verkeerd gelezen:

cat /sys/module/kvm_intel/parameters/nested   # Y or N

Binnen uw VPS is dat de instelling van uw KVM-module, en deze bepaalt of een L2-gast een derde niveau kan nesten. Het zegt niets over de vraag of L0 nesting voor u heeft ingeschakeld; /proc/cpuinfo en kvm-ok geven daar antwoord op. De parameter nested is de knop die u instelt op een machine die volledig uw eigendom is:

echo 'options kvm_intel nested=1' | sudo tee /etc/modprobe.d/kvm-nested.conf
sudo modprobe -r kvm_intel && sudo modprobe kvm_intel

Het verwijderen van de module wordt geweigerd zolang er een VM draait, dus sluit eerst de gasten af.

Waarom de meeste VPS-providers dit uitschakelen

  • Live migratie. Het aanbieden van vmx betekent dat u een CPU-model blootstelt dat de vlag bevat. Een gastmachine die afhankelijk is van deze CPU-functies kan niet veilig worden gemigreerd naar een machine waarvan de CPU deze mist. Een host die nodes leegmaakt door klanten te migreren, geeft die mogelijkheid op zodra nesting wordt ingeschakeld.
  • Aanvalsoppervlak. De geneste VMX/SVM-paden behoren tot de meest complexe code in de virtualisatielaag van de kernel, met een bijbehorende CVE-geschiedenis.
  • L0 is mogelijk geen KVM. Als systemd-detect-virt de uitvoer vmware, xen of microsoft geeft, dan gelden de nesting-regels van die stack, niet die van KVM.

Geen vlag op uw instance? Vraag het aan de supportafdeling (sommigen schakelen het per VM in), kies een abonnement waarin nesting wordt gedocumenteerd, of stap over naar een dedicated server. De rest van deze handleiding gaat uit van root-toegang op een machine die de vlag toont.

Een L2-guest uitvoeren met 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'

Er is geen grafische sessie vereist. Een seriële installatie duurt enige tijd, start deze daarom in een persistente shell: dezelfde tmux-workflow die Claude Code-sessies op een VPS actief houdt zorgt ervoor dat een virt-install-console verbonden blijft bij een verbroken SSH-verbinding. Als --os-variant debian13 wordt geweigerd, is uw osinfo-db verouderd; voer osinfo-query os uit en kies een naam die bestaat. --cpu host-passthrough stuurt vmx door naar L2, wat alleen nodig is als L2 zelf ook moet virtualiseren. Maak de guest boot-safe met virsh autostart guest1.

De virtio-bus op schijf en NIC is geen decoratie: geëmuleerde IDE- en e1000-apparaten veroorzaken veel vaker een trap naar de hypervisor dan virtio-wachtrijen, en bij nesting wordt elke trap dubbel betaald.

Netwerken: het onderdeel dat tutorials overslaan

Uw VPS heeft één publiek IP-adres en bevindt zich achter een netwerkstructuur die onbekende MAC-adressen filtert. Dit heeft twee gevolgen.

Het bridgen van L2-guests naar het publieke netwerk werkt meestal niet. Plaats br0 op de publieke NIC, geef de guest een eigen MAC-adres en u zult zien dat ARP-verzoeken worden verzonden zonder antwoord; de switch van de provider negeert frames van een MAC-adres dat niet aan u is toegewezen. Als dit uw symptoom is, stop dan met het debuggen van de bridge; dit is de werking van het netwerk.

Gebruik in plaats daarvan het NAT-netwerk. libvirt levert default: virbr0, 192.168.122.0/24, dnsmasq-leases, uitgaand verkeer werkt direct. Voor inkomend verkeer beëindigt u TLS op L1 en proxyt u het verkeer door; de certificaatpaden hieronder zijn afkomstig van een Let's Encrypt-certificaat uitgeven met Certbot op 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;
    }
}

Geef de guest eerst een statische lease (virsh net-edit default), zodat het adres in dat proxy_pass behouden blijft.

Beheerinterfaces blijven buiten het internet: VNC op 5900 en de Proxmox web-UI op 8006 horen op loopback thuis, bereikbaar via een SSH-tunnel (ssh -N -L 8006:127.0.0.1:8006 you@your-vps) of via een zelfgehoste WireGuard VPN naar de VPS, waardoor het gehele 192.168.122.0/24 guest-bereik op één private hop afstand staat. Houd de firewall strikt, sudo ufw allow 22,80,443/tcp, niets anders. Als guests hun uitgaande verbinding verliezen direct nadat u ufw inschakelt, is de gebruikelijke boosdoener DEFAULT_FORWARD_POLICY="DROP" in /etc/default/ufw; stel deze in op ACCEPT en herlaad ufw.

Proxmox op een VPS

Proxmox VE 9 is gebaseerd op Debian 13 en kan daarom op een Debian VPS worden geïnstalleerd door de pve-no-subscription repository en het proxmox-ve pakket toe te voegen. Gebruik de repository- en keyring-regels uit de actuele documentatie van Proxmox; een URL die uit een verouderde blogpost is gekopieerd, zal de installatie doen mislukken. Het is raadzaam om eerst te overwegen of Proxmox op gehuurde hardware wel de juiste keuze is voordat u tijd investeert in de onderstaande netwerkconfiguratie. De vergelijking tussen de kosten en mogelijkheden van een eigen Proxmox-server thuis versus een gehuurde VPS bevat de berekeningen voor stroomverbruik en hardware die u hierbij kunnen helpen.

De installatie van de pakketten is niet het lastigste onderdeel. Proxmox verwacht een vmbr0 die is gebridged naar een fysieke netwerkkaart, wat direct leidt tot de eerder genoemde problemen met MAC-filtering. De configuratie die op een VPS wel werkt, is een NAT- of gerouteerde vmbr0 zonder gekoppelde fysieke poort, waarbij gastsystemen zich in een privé-netwerkbereik bevinden. Gebruik DNAT-regels of een reverse proxy op de host voor verkeer dat vanaf het internet bereikbaar moet zijn. Wanneer de publieke services containers zijn in plaats van VM's, beschrijft Traefik voor meerdere applicaties vanuit één Docker Compose-bestand hoe u dit routeringsvraagstuk oplost met automatische certificaten. Maak eerst een snapshot van /etc/network/interfaces: een onjuiste bridge-definitie kan u de toegang tot een machine ontzeggen waarvan u mogelijk geen console-toegang heeft.

Prestaties, eerlijk beoordeeld

Geneste virtualisatie is trager dan een enkele laag, en het mechanisme is specifiek in plaats van diffuus: de kosten zitten niet in geheugentoegang, maar in exits. Met EPT/NPT aanwezig onderhoudt L0 shadow page tables voor L2 en verlopen normale geheugenleesacties op hardware-snelheid. Wat kostbaar wordt, is elke operatie die de guest-modus verlaat, zoals I/O, timer-interrupts, MMIO en inter-processor interrupts, aangezien een L2-exit door L0 wordt afgehandeld en mogelijk wordt teruggekaatst via L1. CPU-intensief werk met data die al in het RAM staat, benadert de native snelheid; alles wat gedomineerd wordt door syscalls, pakketten en schijf-I/O ondervindt hinder van de lagen.

Dus: gebruik overal virtio-apparaten. Uw qcow2-bestand bevindt zich op een schijf die de provider al heeft gevirtualiseerd; dit betekent twee gestapelde thin-provisioning-lagen, waarbij cache=none op de guest-schijf voorkomt dat dezelfde blokken tegelijkertijd in twee page caches staan. Er zijn hier geen benchmarkcijfers: meet uw eigen workload op uw eigen instance.

Foutmodi en de meldingen die u zult zien

INFO: /dev/kvm does not exist / KVM acceleration can NOT be used vanuit kvm-ok. Ofwel de module is niet geladen, of de vlag is niet beschikbaar. Controleer eerst /proc/cpuinfo.

kvm: disabled by bios in dmesg. Schakel op bare metal de VT-x/SVM-instelling in de firmware in. Binnen een VPS betekent dit dat L0 de extensies niet aan u doorgeeft; niets wat u in de guest invoert, zal dit veranderen.

modprobe: ERROR: could not insert 'kvm_intel': Operation not supported. De CPU die uw kernel ziet, beschikt niet over vmx; ook dit is een beslissing van L0.

Could not access KVM kernel module: Permission denied. Rechten, geen hardware. ls -l /dev/kvm zou groep kvm en modus 660 moeten tonen; voeg uzelf toe aan die groep en start een nieuwe login-shell, aangezien groepslidmaatschap niet van toepassing is op een reeds actieve sessie.

kvm: Device or resource busy bij het starten van QEMU. Een andere hypervisor-module houdt de CPU bezet: voer lsmod uit, zoek naar vboxdrv of VMware-modules naast kvm_intel en ontlaad de module die u niet wilt gebruiken.

/var/run/libvirt/libvirt-sock: No such file or directory vanuit virsh. De daemon is niet actief: sudo systemctl enable --now libvirtd.

Proxmox: KVM virtualisation configured, but not available. Een guest heeft KVM-versnelling ingeschakeld op een host die dit niet kan leveren. Herstel de nesting of schakel de optie uit en accepteer emulatie.

Android emulator: x86_64 emulation currently requires hardware acceleration! Wederom /dev/kvm, meestal het geval met de groep.

Geen foutmelding en alles is extreem traag. QEMU zonder accelerator-vlag valt terug op TCG, de software-emulator. Dit is correct maar traag; een opstartproces dat normaal seconden duurt, duurt nu minuten. Geef expliciet -accel kvm mee, zodat QEMU stopt met een foutmelding in plaats van geruisloos te emuleren.

Een guest verdwijnt tijdens het draaien. Zoek in dmesg naar Out of memory: Killed process ... qemu-system-x86_64. Een L2-guest is een proces op L1 en de OOM-killer behandelt dit als elk ander proces. Het RAM-geheugen van L2 komt uit de vaste toewijzing van L1; er wordt niet geleend van de host.

Bediening: backups, upgrades, limieten

Backups. Het kopiëren van een draaiende guest-qcow2 resulteert in een corrupt image. Gebruik ofwel virsh shutdown guest1 en kopieer het bestand, of maak een externe snapshot (virsh snapshot-create-as guest1 snap1 --disk-only --atomic) zodat schrijfacties naar een overlay worden omgeleid terwijl u de nu statische basis kopieert. Voeg deze daarna weer samen met virsh blockcommit. Verplaats de kopieën buiten de VPS; een snapshot op dezelfde schijf biedt geen bescherming.

Upgrades. apt full-upgrade installeert nieuwe kvm_intel/kvm_amd-modules, maar de actieve kernel blijft de oude gebruiken totdat u opnieuw opstart. Houd de vorige kernel geïnstalleerd en voer kvm-ok opnieuw uit na elke kernelwijziging: een host die terugkeert zonder vmx is dan slechts één boot-entry verwijderd van een werkende staat.

Waar de schaalbaarheid ophoudt. Eén publiek IP-adres betekent dat elke L2-service de buitenwereld bereikt via een proxy of een DNAT-regel op L1. Live migratie is niet mogelijk. Bij CPU-congestie is het geneste exit-pad het eerste dat vertraging oploopt. Een hypervisor met meerdere guests is een machine waarvan het RAM-geheugen al is toegewezen; geneste VM's kunnen hun vaste toewijzing niet overschrijden. Wanneer een labomgeving uit dit model groeit, is de oplossing niet een hogere geneste stack, maar een dedicated server waar u L0 bent en deze beperkingen niet van toepassing zijn.

FAQ

Heb ik nested virtualization nodig om Docker op een VPS te draaien?

Nee. Containers delen de kernel van uw VPS en openen nooit /dev/kvm, dus een standaard-instantie zonder vmx of svm flag draait Docker en Docker Compose zonder problemen. Nesting is alleen relevant wanneer u een tweede kernel wilt draaien: een Proxmox-lab, een Windows-gast, Firecracker microVMs, een Android-emulator of CI-runners die VM-images opstarten.

Hoe controleer ik of mijn VPS nested virtualization ondersteunt?

Voer grep -o -E 'vmx|svm' /proc/cpuinfo | sort -u uit en daarna kvm-ok uit het cpu-checker-pakket. Een bruikbare instantie toont vmx (Intel) of svm (AMD), kvm-ok rapporteert KVM acceleration can be used, en /dev/kvm bestaat met groep kvm en modus 660. Negeer /sys/module/kvm_intel/parameters/nested voor deze vraag; dat bestand beschrijft uw eigen KVM-module, niet wat de hypervisor van de provider aan u heeft blootgesteld.

Waarom schakelen de meeste VPS-providers nested virtualization uit?

Het blootstellen van vmx betekent dat de gast een CPU-model krijgt dat de flag bevat. Een gast die afhankelijk is van die CPU-functies kan niet live worden gemigreerd naar een machine waarvan de CPU deze mist. Een provider die nodes leegmaakt door klanten te verplaatsen, geeft die mogelijkheid op. De nested VMX/SVM-codepaden hebben bovendien een lange CVE-geschiedenis. Sommige hosts schakelen het op verzoek per VM in, en anderen documenteren nesting als een feature van een specifiek abonnement.

Mijn nested VM heeft geen netwerk op de publieke bridge. Wat is er mis?

De switch van de provider blokkeert frames van een MAC-adres dat niet aan u is toegewezen. Een L2-gast die op de publieke NIC is gebridged, verstuurt ARP-verzoeken maar ontvangt geen antwoord. Stop met het debuggen van br0, gebruik het NAT default-netwerk van libvirt (virbr0, 192.168.122.0/24), geef de gast een statische lease en publiceer publieke diensten via een reverse proxy of een DNAT-regel op de VPS zelf.

Hoeveel trager is een nested VM?

De prestatievermindering zit in VM-exits, niet in geheugentoegang. Met EPT/NPT actief draaien gewone lees- en schrijfacties binnen L2 op hardware-snelheid, terwijl I/O, timer-interrupts, MMIO en IPI's door L0 worden afgehandeld en mogelijk via L1 worden teruggestuurd. CPU-intensief werk met data die al in het RAM staat, is bijna gelijk aan native prestaties; workloads die zwaar leunen op syscalls, netwerkpakketten en schijfactiviteit merken elke laag. Gebruik overal virtio-apparaten en cache=none op gastschijven en meet vervolgens uw eigen workload.