Paravirtualisatie: hoe een besturingssysteem leert samenwerken met zijn hypervisor
Stel je een groot kantoorgebouw voor met één telefooncentrale en tien bedrijven die er allemaal gebruik van maken. Elk bedrijf denkt dat het de enige gebruiker is, maar op de achtergrond regelt de centrale wie wanneer mag bellen. Zoiets gebeurt er ook in een computer die virtualisatie gebruikt: één fysieke machine draait meerdere "virtuele" computers tegelijk, elk met hun eigen besturingssysteem, terwijl een soort verkeersregelaar - de hypervisor - de fysieke hardware eronder verdeelt.
Bij gewone (volledige) virtualisatie hoeft het gastbesturingssysteem niet te weten dat het virtueel draait: de hypervisor doet alsof hij echte hardware is en vangt stiekem elke instructie op die problemen zou kunnen geven. Dat werkt, maar kost tijd en rekenkracht. Paravirtualisatie kiest een andere aanpak: het gastbesturingssysteem wordt aangepast zodat het weet dat het virtueel draait, en het vraagt de hypervisor rechtstreeks en efficiënt om hulp, in plaats van dat de hypervisor voortdurend moet gokken en onderscheppen. Het is net het verschil tussen iemand die stiekom moet raden wat je bedoelt, en iemand die je gewoon eerlijk vertelt wat je nodig hebt.
Wat is het precies?
Een besturingssysteem zoals Linux of Windows is normaal gemaakt om rechtstreeks met de processor en andere hardware te praten. Bepaalde instructies - bijvoorbeeld het wijzigen van geheugentabellen of het aan- en uitzetten van interrupts (onderbrekingssignalen van hardware) - mogen alleen door het besturingssysteem zelf worden uitgevoerd, niet door gewone programma's. Dat heet een bevoorrechte instructie.
In een gevirtualiseerde omgeving draait het gastbesturingssysteem echter niet meer op het hoogste bevoegdheidsniveau; dat is nu voor de hypervisor. Bij volledige virtualisatie merkt de hypervisor elke bevoorrechte instructie op, onderbreekt het gastbesturingssysteem, voert de instructie namens hem uit en geeft de controle terug. Dat heet trap-and-emulate en gebeurt duizenden keren per seconde, wat vertraging oplevert.
Bij paravirtualisatie wordt de broncode van het gastbesturingssysteem aangepast: op de plekken waar het normaal een bevoorrechte instructie zou geven, roept het nu een speciale functie aan die de hypervisor rechtstreeks aanspreekt. Dit heet een hypercall - te vergelijken met een systeemcall (systeemaanroep) waarmee een gewoon programma het besturingssysteem om hulp vraagt, maar dan één niveau hoger, van besturingssysteem naar hypervisor. Omdat de hypervisor vooraf weet wat er gevraagd wordt, kan hij dit veel efficiënter afhandelen dan wanneer hij losse instructies moet onderscheppen en interpreteren.
Ditzelfde principe wordt vaak ook toegepast op invoer/uitvoer, zoals netwerkkaarten en schijven. In plaats van een virtuele kopie van een bestaande fysieke netwerkkaart na te bootsen (wat traag is, omdat elk detail van die hardware moet worden gesimuleerd), krijgt het gastbesturingssysteem een speciaal, "paravirtueel" stuurprogramma dat weet dat het met een hypervisor praat en daardoor grote datablokken in één keer kan doorgeven in plaats van talloze kleine hardwaresignalen na te bootsen.
Wat wil men ermee bereiken?
Het hoofddoel is snelheid. Virtualisatie brengt bijna altijd een prestatieverlies met zich mee ten opzichte van software die rechtstreeks op de hardware draait, en paravirtualisatie probeert dat verlies zo klein mogelijk te maken door onnodige tussenstappen te schrappen. Voor datacenters en cloudproviders die duizenden virtuele machines op dezelfde fysieke servers laten draaien, tikken kleine efficiëntiewinsten per virtuele machine flink aan in energieverbruik en benodigde hardware.
Een tweede doel is een lagere belasting van de hypervisor zelf. Omdat gastbesturingssystemen minder vaak "per ongeluk" bevoorrechte instructies proberen uit te voeren die opgevangen moeten worden, kan de hypervisor eenvoudiger en voorspelbaarder blijven, wat ook de betrouwbaarheid ten goede komt.
Daarnaast speelde paravirtualisatie historisch een belangrijke rol omdat gewone processors lange tijd geen ingebouwde hardwareondersteuning voor virtualisatie hadden. Vóór ongeveer 2005-2006 moesten processors van Intel en AMD alle virtualisatietrucs softwarematig oplossen, wat zwaar en foutgevoelig was. Paravirtualisatie was toen vaak de enige praktische manier om virtualisatie snel genoeg te laten werken. Inmiddels hebben vrijwel alle moderne processors hardwarematige virtualisatie-extensies (zoals Intel VT-x en AMD-V), waardoor paravirtualisatie voor de kern van het besturingssysteem minder cruciaal is geworden - al blijft het voor invoer/uitvoer nog altijd waardevol.
Voorbeelden uit de praktijk
Xen is het bekendste voorbeeld. Dit project startte in 2003 aan de Universiteit van Cambridge, onder leiding van onderzoekers als Ian Pratt en Keir Fraser, en introduceerde paravirtualisatie als praktische techniek voor Linux-gastsystemen. Het bedrijf XenSource dat rond Xen werd opgericht, werd in 2007 overgenomen door Citrix. Amazon gebruikte Xen met paravirtualisatie (de zogeheten "PV-instances") jarenlang als basis van zijn Elastic Compute Cloud (EC2), voordat het vanaf ongeveer 2017 overstapte naar hardwaregeassisteerde varianten (HVM) via het eigen Nitro-systeem.
De Linux-kernel kreeg in 2007 een raamwerk genaamd paravirt_ops (of pv_ops), waarmee dezelfde Linux-kernel zowel op echte hardware als, efficiënter, op een paravirtualisatie-hypervisor als Xen kan draaien, zonder dat daarvoor twee aparte kernels nodig zijn.
VMware paste een verwante aanpak toe met paravirtuele stuurprogramma's zoals "VMXNET" voor netwerkverkeer en "PVSCSI" voor opslag, die samen met VMware Tools in gastbesturingssystemen worden geïnstalleerd om invoer/uitvoer te versnellen, ook wanneer de rest van het systeem volledig gevirtualiseerd draait.
Een ander belangrijk voorbeeld is virtio, een open standaard die vanaf 2007 door Rusty Russell (destijds bij IBM) werd ontwikkeld voor de Linux-hypervisor KVM (Kernel-based Virtual Machine). Virtio definieert een generieke manier waarop gastbesturingssystemen efficiënt netwerk-, schijf- en andere apparaten kunnen aanspreken via de hypervisor, en is inmiddels de facto standaard geworden in Linux-, en in mindere mate Windows-gastsystemen, ook buiten KVM (bijvoorbeeld in QEMU-gebaseerde omgevingen).
Ook Microsoft Hyper-V gebruikt vergelijkbare technieken, die Microsoft "enlightenments" noemt: aanpassingen in Windows- en Linux-gastsystemen waarmee ze bepaalde bewerkingen (zoals tijdmeting of geheugenbeheer) rechtstreeks via de hypervisor laten lopen in plaats van via emulatie.
Hoe ver is de techniek?
Paravirtualisatie is geen opkomende, experimentele technologie meer - het is al twee decennia in productie bij grote cloudproviders en bedrijven en wordt als volwassen beschouwd. De ontwikkeling is de afgelopen jaren vooral verschoven van "volledige" paravirtualisatie van de kern van het besturingssysteem naar gerichte paravirtualisatie van invoer/uitvoer, zoals virtio, omdat moderne processors dankzij hardware-ondersteuning steeds minder baat hebben bij het aanpassen van de kernelcode zelf.
Een belangrijke ontwikkeling is dat grote cloudproviders, waaronder Amazon, in de afgelopen jaren zijn overgestapt van klassieke Xen-paravirtualisatie naar hybride vormen die hardwarematige virtualisatie combineren met paravirtuele stuurprogramma's voor snelheid, vaak ondersteund door speciale netwerkkaarten (zogeheten SmartNICs) die een deel van het werk overnemen van de processor. Dit wordt soms "hardware-geassisteerde paravirtualisatie" genoemd en is een actief technisch aandachtsgebied.
Een belangrijk obstakel blijft compatibiliteit: paravirtualisatie vereist per definitie dat het gastbesturingssysteem is aangepast of over de juiste stuurprogramma's beschikt. Oudere of gesloten besturingssystemen die niet ondersteund worden, kunnen niet zomaar van paravirtualisatie profiteren, en het onderhouden van deze aanpassingen in de Linux-kernel en andere systemen vergt doorlopend werk van de betrokken ontwikkelaarsgemeenschappen.
Wie werken eraan?
Het Xen Project wordt tegenwoordig als open-sourceproject onder de vlag van de Linux Foundation ontwikkeld, met bijdragen van bedrijven als Citrix, Arm en Amazon Web Services (AWS). AWS blijft een grote gebruiker en bijdrager, gezien de geschiedenis van EC2 met Xen.
Rond KVM en virtio zijn vooral Red Hat (onderdeel van IBM) en de bredere Linux-kernelgemeenschap actief, evenals chipfabrikant Intel en diverse cloudbedrijven die bijdragen aan prestatieverbeteringen. Red Hat is met name een drijvende kracht achter QEMU/KVM-gerelateerde virtio-ontwikkeling.
VMware (sinds 2023 onderdeel van Broadcom) ontwikkelt zijn eigen paravirtuele stuurprogramma's voor zijn vSphere/ESXi-platform, en Microsoft doet hetzelfde voor Hyper-V en Azure. Academisch gezien blijft de Universiteit van Cambridge, waar Xen ontstond, historisch verbonden aan het onderzoeksveld, en universiteiten wereldwijd publiceren regelmatig over prestatie- en beveiligingsaspecten van virtualisatietechnieken in vakbladen op het gebied van systeemresearch.