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 precies genest
Drie lagen:
- L0, de hypervisor van de provider, op de fysieke 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 op Intel, AMD-V / SVM (svm) plus RVI/NPT op AMD. Een hypervisor gebruikt deze instructies om de gastmodus te openen 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 zoals VMLAUNCH of VMRESUME, treedt er een trap op naar L0, die namens L1 de schaduwstructuren voor L2 onderhoudt. Op CPU's met VMCS-shadowing kunnen VMREAD en VMWRITE van L1 worden afgehandeld zonder een exit, wat een groot deel van dat verkeer wegneemt, maar niet de rest. KVM doet dit goed, maar het is L0 die bij elke exit extra werk verricht, en daarom moet de provider hiervoor toestemming geven.
Wanneer L0 KVM is, moet aan twee voorwaarden worden voldaan voor een versnelde L2:
- De KVM-module van L0 is geladen met
nested=1. - L0 geeft uw VPS een CPU-model dat de vlag bevat,
<cpu mode='host-passthrough'/>in libvirt,cpu: hostin Proxmox,-cpu hostin raw QEMU. Een generiek geëmuleerd model (qemu64,kvm64) verbergtvmx, zelfs wanneer nesting wereldwijd is ingeschakeld.
Andere hypervisors hebben hun eigen schakelaar. Hyper-V emuleert bijvoorbeeld de virtualisatie-extensies voor een geneste hypervisor binnen zijn VM's, maar alleen in VM's waar nesting stuk voor stuk 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/kvmEen 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 20Eén bestand wordt constant geciteerd en op grote schaal verkeerd gelezen:
cat /sys/module/kvm_intel/parameters/nested # Y or NBinnen 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_intelHet verwijderen van de module wordt geweigerd zolang er een VM actief is. Schakel de guests daarom eerst uit. Als die machine een Proxmox-host is, behandelt geneste virtualisatie inschakelen in Proxmox VE 9 dezelfde wijziging in modprobe.d, plus de cpu: host-instelling per VM waardoor de flag zichtbaar wordt in een guest.
Waarom de meeste VPS-providers dit uitschakelen
- Live migratie. Het aanbieden van
vmxbetekent 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-virtde uitvoervmware,xenofmicrosoftgeeft, 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-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 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 houdt een virt-install-console verbonden, zelfs als de SSH-verbinding wegvalt. Als --os-variant debian13 wordt geweigerd, is uw osinfo-db verouderd; 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 ook moet virtualiseren. Maak de gast 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 exits naar de hypervisor dan virtio-wachtrijen. Bij nesting wordt een exit die L0 niet zelfstandig kan afhandelen, doorgegeven aan L1, waar de afhandeling ervan verdere exits kan triggeren.
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 enkelvoudige laag, en het mechanisme is specifiek in plaats van diffuus: de kosten zitten in exits en adresvertaling, niet in reguliere instructies. Met EPT/NPT aanwezig, combineert L0 de pagetabellen van L1 voor L2 en zijn eigen tabellen tot één schaduwtabel, waardoor een TLB-hit op hardware-snelheid draait. Een TLB-miss kost meer: de hardware doorloopt de pagetabel van de gast en de schaduwtabel tegelijkertijd, en elke wijziging die L1 aanbrengt in zijn eigen tabellen dwingt een exit af zodat L0 de schaduwtabel kan synchroniseren. Wat kostbaar wordt, is elke operatie die de gastmodus verlaat, I/O, timer-interrupts, MMIO, inter-processor interrupts, aangezien een L2-exit door L0 wordt afgehandeld en mogelijk via L1 wordt teruggekaatst. CPU-intensief werk met een kleine werkset lijkt op native prestaties; grote werksets in het geheugen betalen de prijs voor TLB-misses, en alles wat gedomineerd wordt door syscalls, pakketten en schijf-I/O ondervindt hinder van de lagen.
Dus: gebruik overal virtio-apparaten. En uw qcow2-bestand bevindt zich op een schijf die de provider al heeft gevirtualiseerd, twee gestapelde thin-provisioning-lagen, waarbij cache=none op de gastschijf voorkomt dat dezelfde blokken tegelijkertijd in twee page caches staan. Geen benchmarkcijfers hier: meet uw eigen workload op uw eigen instantie.
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: back-ups, upgrades, limieten
Back-ups. Het kopiëren van een draaiende guest-qcow2 brengt het risico op een inconsistente image met zich mee, omdat de guest blijft schrijven terwijl u leest. Voer ofwel virsh shutdown guest1 uit, wacht tot virsh domstate guest1 de status shut off rapporteert (het shutdown-commando kan terugkeren terwijl de guest nog bezig is met stoppen), en kopieer daarna; 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, en voeg deze daarna weer samen met virsh blockcommit guest1 vda --active --pivot. Verplaats de kopieën van de VPS; een snapshot op dezelfde schijf biedt geen enkele bescherming.
Upgrades. apt full-upgrade installeert nieuwe kvm_intel/kvm_amd-modules, maar de draaiende kernel behoudt de oude 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 wereld bereikt via een proxy of een DNAT-regel op L1. Live migratie is niet mogelijk. Bij CPU-congestie is het nested exit-pad het eerste dat vertraging oploopt. Een hypervisor met meerdere guests is een machine waarvan u het RAM-geheugen al heeft toegewezen; nested VM's kunnen hun weg niet uit een vaste toewijzing overcommitten. Wanneer een labomgeving groter wordt dan dit, is de oplossing niet een hogere nested stack; het is een dedicated server waar u L0 bent en niets van dit alles van toepassing is.
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 voert Docker en Docker Compose probleemloos uit. Nesting is alleen relevant wanneer u een tweede kernel nodig heeft: 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 vervolgens 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 draagt. 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 gebrugd, 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 prestatieverliezen treden op bij VM-exits en adresvertaling. Met EPT/NPT actief draaien instructies en TLB-hits binnen L2 op hardware-snelheid, maar een TLB-miss doorloopt extra paginatabellen. I/O, timer-interrupts, MMIO en IPI's worden afgehandeld door L0 en kunnen worden teruggekaatst via L1. CPU-intensief werk met een kleine werkset lijkt op native prestaties; grote werksets in het geheugen en workloads die zwaar leunen op syscalls, pakketten en schijfactiviteit merken elke laag. Gebruik overal virtio-apparaten en cache=none op gastschijven en meet vervolgens uw eigen workload.