SSD Nodes Learn
Gidsen Matt ConnorDoor Matt Connor · Bijgewerkt 2026-07-24

Proxmox op een VPS draaien: kan dit?

Controleer met kvm-ok of uw VPS de vmx flag ondersteunt. Ontdek of nesting mogelijk is voor Proxmox en voorkom foutmeldingen bij het draaien van gasten.

Het korte antwoord

Nested virtualization is een hypervisor die draait binnen een virtuele machine: uw VPS is al een gast en u wilt dat deze zelf gasten host. Dit werkt alleen als de hypervisor van uw provider de virtualisatie-extensies van de CPU bewust beschikbaar stelt aan uw instance. Controleer /proc/cpuinfo op de vmx flag (Intel) of svm (AMD). Als deze niet verschijnen, kan u dit niet oplossen door instellingen binnen de VPS aan te passen.

Een belangrijke opmerking vooraf: Docker heeft dit niet nodig. Containers delen de kernel van uw VPS en maken nooit gebruik van /dev/kvm. Als uw 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 nodig heeft — zoals een Proxmox-lab, een Windows-gast, Firecracker microVMs, een Android-emulator, een Kubernetes-testomgeving met echte VM's, of CI-runners die VM-images booten.

Wat er precies wordt genest

Drie lagen:

  • L0 — de hypervisor van de provider, direct 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 uitvoeren.

Hardwarevirtualisatie bestaat uit VT-x (de vmx flag) plus EPT op Intel, en AMD-V / SVM (svm) plus RVI/NPT op AMD. Een hypervisor gebruikt deze instructies om de guest mode te betreden en om de CPU twee paginatabellen tegelijk te laten doorlopen.

Geen van beide is ontworpen om re-entrant te zijn, dus wordt nesting geëmuleerd: wanneer L1 een VMX-instructie uitvoert, wordt deze opgevangen door L0. L0 beheert de shadow-structuren voor L2 namens L1. KVM voert dit goed uit, maar L0 moet bij elke exit extra werk verrichten — dit is de reden waarom de provider hiervoor expliciet toestemming moet geven.

Voor een versnelde L2 moeten beide condities waar zijn:

  1. De KVM-module van L0 is geladen met nested=1.
  2. L0 geeft uw VPS een CPU-model met de benodigde flag — <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 als nesting wereldwijd 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 werkende instance geeft vmx of svm weer, kvm-ok geeft KVM acceleration can be used weer, en /dev/kvm bestaat als root:kvm in 660 modus. Als de flag aanwezig is maar de device node ontbreekt, laad het module handmatig en lees de kernel log:

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

Eén bestand wordt vaak geciteerd maar verkeerd geïnterpreteerd:

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

Binnen uw VPS is dit de instelling van uw KVM module. Deze bepaalt of een L2 guest nesting op een derde niveau kan uitvoeren. Het zegt niets over of L0 nesting voor u heeft ingeschakeld — /proc/cpuinfo en kvm-ok geven daar antwoord op. De nested parameter is de instelling die u configureert op een machine die u volledig bezit:

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 het module wordt geweigerd terwijl een VM draait. Schakel daarom eerst de guests uit.

Waarom de meeste VPS-hosts dit uitgeschakeld laten

  • Live migration. Het aanbieden van vmx betekent dat een CPU-model wordt blootgesteld dat de flag bevat. Een gast-OS dat afhankelijk is van deze CPU-functies kan niet veilig worden gemigreerd naar een machine waarvan de CPU deze functies mist. Een host die nodes ontlast door klanten te migreren, verliest deze mogelijkheid zodra nesting wordt ingeschakeld.
  • Aanvalsoppervlak. De nested VMX/SVM-paden behoren tot de meest complexe code in de virtualisatielaag van de kernel en hebben een bijbehorende CVE-geschiedenis.
  • L0 is mogelijk geen KVM. Als systemd-detect-virt vmware, xen of microsoft weergeeft, gelden de nesting-regels van die stack en niet die van KVM.

Geen flag op uw instance? Neem contact op met de support (sommigen schakelen dit per VM in), kies een plan waarin nesting wordt gedocumenteerd, of stap over naar een dedicated server. De rest van deze handleiding gaat uit van root-toegang op een machine waar de flag aanwezig is.

Een L2-gast draaien 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'

Een grafische sessie is niet nodig. Een installatie via de seriële poort duurt enige tijd. Start de sessie daarom in een persistente shell: dezelfde tmux workflow die Claude Code-sessies op een VPS actief houdt houdt een virt-install-console verbonden bij een verbroken SSH-verbinding. Als --os-variant debian13 wordt geweigerd, is uw osinfo-db ouder dan de release — voer osinfo-query os uit en kies een bestaande naam. --cpu host-passthrough stuurt vmx door naar L2; dit is alleen nodig als L2 zelf virtualisatie moet uitvoeren. Maak de gast boot-veilig met virsh autostart guest1.

De virtio-bus op de disk en NIC is niet enkel ter decoratie: geëmuleerde IDE- en e1000-apparaten veroorzaken veel vaker traps naar de hypervisor dan virtio-queues. Bij nesting wordt elke trap dubbel belast.

Networking: het deel 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-gasten naar het publieke netwerk werkt meestal niet. Als u br0 op de publieke NIC plaatst en de gast een eigen MAC-adres geeft, zult u zien dat ARP-verzoeken worden verzonden maar er niets terugkomt. De switch van de provider blokkeert frames van een MAC-adres dat niet aan u is toegewezen. Als dit uw probleem is, stop dan met het debuggen van de bridge; dit is het standaardmechanisme.

Gebruik in plaats daarvan het NAT-netwerk. libvirt levert default: virbr0, 192.168.122.0/24 en dnsmasq-leases, waardoor uitgaand verkeer direct werkt. Voor inkomend verkeer kunt u TLS termineren op L1 en het verkeer proxen — de certificaatpaden hieronder komen van het uitgeven van een Let's Encrypt-certificaat 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 gast eerst een statische lease (virsh net-edit default), zodat het adres in die proxy_pass constant blijft.

Beheersinterfaces blijven offline: VNC op 5900 en de Proxmox web UI op 8006 horen op de loopback-interface te staan, bereikbaar via een SSH-tunnel (ssh -N -L 8006:127.0.0.1:8006 you@your-vps) of via een self-hosted WireGuard VPN naar de VPS, waardoor de volledige 192.168.122.0/24 gast-range één private hop verwijderd is. Houd de firewall beperkt — sudo ufw allow 22,80,443/tcp, verder niets. Als gasten direct de uitgaande verbinding verliezen nadat u ufw heeft ingeschakeld, is de gebruikelijke oorzaak DEFAULT_FORWARD_POLICY="DROP" in /etc/default/ufw — stel dit in op ACCEPT en herlaad ufw.

Proxmox op een VPS

Proxmox VE 9 is gebaseerd op Debian 13. U installeert dit op een Debian VPS door het pve-no-subscription repository en het proxmox-ve package toe te voegen. Gebruik de repository- en keyring-regels uit de officiële documentatie van Proxmox. Een URL uit een oude blogpost zorgt voor een mislukte installatie.

De packages zijn niet het moeilijkste onderdeel. Proxmox vereist een vmbr0 die verbonden is met een fysieke NIC. Dit veroorzaakt het eerder genoemde probleem met MAC-filtering. Een werkende configuratie op een VPS is een NAT- of gerouteerde vmbr0 zonder fysieke poort. Gebruik een privaat IP-bereik voor gasten. Gebruik DNAT-regels of een reverse proxy op de host voor publieke toegang. Als de publieke services containers zijn in plaats van VM's, dan biedt Traefik fronting multiple apps from one Docker Compose file dezelfde routering met automatische certificaten. Maak eerst een snapshot van /etc/network/interfaces: een foutieve bridge-definitie kan leiden tot een lockout van een machine waar u mogelijk geen console-toegang van heeft.

Prestaties, eerlijk gesteld

Nested is trager dan single-level. De oorzaak is specifiek: de kosten zitten niet in het geheugenbeheer, maar in de exits. Dankzij EPT/NPT onderhoudt L0 shadow page tables voor L2, waardoor gewone geheugenlezingen op hardware-snelheid verlopen. Elke operatie die de guest mode verlaat is echter kostbaar — zoals I/O, timer interrupts, MMIO en inter-processor interrupts. Dit komt doordat een L2 exit door L0 wordt afgehandeld en mogelijk via L1 moet worden doorgestuurd. CPU-intensieve taken met data in het RAM benaderen native prestaties. Taken met veel syscalls, netwerkpakketten of disk I/O ondervinden wel de vertraging door de extra lagen.

Conclusie: gebruik overal virtio devices. Uw qcow2-bestand staat op een disk die de provider al heeft gevirtualiseerd. Dit zijn twee lagen van thin-provisioning op elkaar. Hierdoor voorkomt cache=none op de guest disk dat dezelfde blokken in twee verschillende page caches tegelijkertijd staan. Er worden hier geen benchmark-cijfers gegeven: meet uw eigen workload op uw eigen instance.

Foutmodi en de strings die u zult zien

INFO: /dev/kvm does not exist / KVM acceleration can NOT be used van kvm-ok. De module is niet geladen of de flag is niet geëxposeerd. Controleer eerst /proc/cpuinfo.

kvm: disabled by bios in dmesg. Schakel op bare metal de VT-x/SVM toggle in de firmware in. In een VPS betekent dit dat L0 de extensies niet doorgeeft; dit kan niet worden aangepast in de guest.

modprobe: ERROR: could not insert 'kvm_intel': Operation not supported. De CPU die uw kernel ziet heeft geen vmx — dit is opnieuw een beslissing van L0.

Could not access KVM kernel module: Permission denied. Dit betreft permissies, geen hardware. ls -l /dev/kvm moet groep kvm en mode 660 tonen; voeg uzelf toe aan deze groep en start een nieuwe login shell, aangezien groepslidmaatschap niet geldt voor een lopende sessie.

kvm: Device or resource busy wanneer QEMU start. Een andere hypervisor-module gebruikt de CPU: voer lsmod uit, zoek naar vboxdrv of VMware-modules naast kvm_intel, en ontlaad de module die u niet gebruikt.

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

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

Android emulator: x86_64 emulation currently requires hardware acceleration! Opnieuw /dev/kvm — meestal een probleem met de groep.

Geen foutmelding, maar alles is extreem traag. QEMU valt terug op TCG (de softwarematige emulator) als er geen accelerator flag is meegegeven. Dit is correct gedrag, maar het is traag — een bootproces van seconden duurt nu minuten. Geef -accel kvm expliciet op, zodat QEMU stopt met een foutmelding in plaats van stilzwijgend te emuleren.

Een guest verdwijnt tijdens het draaien. Controleer dmesg op 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. L2 RAM wordt onttrokken aan de vaste allocatie van L1 — er kan geen extra geheugen van de host worden geleend.

Gebruik: backups, upgrades, limieten

Backups. Het kopiëren van een actieve qcow2 van een gast resulteert in een beschadigd image. Gebruik ofwel virsh shutdown guest1 en kopieer, of maak een externe snapshot (virsh snapshot-create-as guest1 snap1 --disk-only --atomic). Hierdoor worden schrijfacties naar een overlay geleid terwijl u het statische basisbestand kopieert. Gebruik vervolgens virsh blockcommit om de snapshot weer samen te voegen. Verplaats de kopieën naar een andere VPS — een snapshot op dezelfde schijf biedt geen bescherming.

Upgrades. apt full-upgrade installeert nieuwe kvm_intel/kvm_amd modules, maar de actieve kernel behoudt de oude modules totdat u herstart. Laat de vorige kernel geïnstalleerd staan en voer kvm-ok opnieuw uit na elke kernelwijziging: een host die zonder vmx herstart, kan met één boot-entry weer functioneren.

Schaalbaarheid. Eén publiek IP betekent dat elke L2 service de wereld bereikt via een proxy of een DNAT-regel op L1. Live migration is niet beschikbaar. Bij CPU-congestie is het nested exit-pad het eerste dat vertraging oploopt. Een hypervisor met meerdere gasten heeft al het beschikbare RAM verbruikt — nested VM's kunnen een vaste allocatie niet omzeilen via overcommit. Wanneer een lab groter wordt dan deze capaciteit, is de oplossing geen diepere nested stack; het is een dedicated machine waarbij u L0 bent en deze beperkingen niet gelden.

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. Een standaard instance zonder de vmx of svm flag draait Docker en Docker Compose probleemloos. Nesting is alleen relevant wanneer u een tweede kernel nodig heeft: een Proxmox lab, een Windows guest, Firecracker microVMs, een Android emulator, of CI runners die VM images booten.

Hoe controleer ik of mijn VPS nested virtualization ondersteunt?

Voer grep -o -E 'vmx|svm' /proc/cpuinfo | sort -u uit, gevolgd door kvm-ok uit het cpu-checker pakket. Een bruikbare instance geeft vmx (Intel) of svm (AMD) weer. kvm-ok rapporteert KVM acceleration can be used, en /dev/kvm is aanwezig met groep kvm en modus 660. Negeer /sys/module/kvm_intel/parameters/nested voor deze vraag — dit bestand beschrijft uw eigen KVM module, niet wat de hypervisor van de provider aan u heeft doorgegeven.

Waarom schakelen de meeste VPS providers nested virtualization uit?

Het blootstellen van vmx betekent dat de guest een CPU-model krijgt met die flag. Een guest die afhankelijk is van die CPU-features kan niet live-migrated worden naar een machine waarvan de CPU deze features mist. Providers die nodes ontlasten door klanten te verplaatsen, geven dit daarom op. De nested VMX/SVM code paths hebben bovendien een lange geschiedenis van CVE's. Sommige hosts activeren het nog steeds per VM op verzoek, en anderen documenteren nesting als een betaalde feature.

Mijn nested VM heeft geen netwerk op de publieke bridge. Wat is het probleem?

De switch van de provider blokkeert frames van een MAC-adres dat nooit aan u is toegewezen. Een L2 guest die is gebridged naar de publieke NIC stuurt ARP-pakketten 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 guest een statische lease, en publiceer publieke diensten via een reverse proxy of een DNAT rule op de VPS zelf.

Hoeveel langzamer is een nested VM?

De vertraging ontstaat bij VM exits, niet bij geheugentoegang. Met EPT/NPT actief draaien normale lees- en schrijfacties binnen L2 op hardware-snelheid. I/O, timer interrupts, MMIO en IPIs worden echter afgehandeld door L0 en kunnen via L1 worden doorgestuurd. CPU-intensieve taken met data in het RAM lijken bijna native; workloads met veel syscalls, pakketten of disk-I/O merken elke laag. Gebruik overal virtio devices en cache=none op guest disks, en meet vervolgens uw eigen workload.

#nested-virtualization#kvm#proxmox#vps#qemu#libvirt