Développeurs du projet NetBSD concernant la création d'un nouvel hyperviseur et de sa pile de virtualisation associée, qui sont déjà inclus dans la branche expérimentale NetBSD-current et seront proposés dans la version stable de NetBSD 9. NVMM est actuellement limité au support de l'architecture x86_64 et fournit deux backends pour utiliser les mécanismes de virtualisation matériels : x86-SVM avec support des extensions de virtualisation des CPU AMD et x86-VMX pour les CPU Intel. Dans sa forme actuelle, il est possible de lancer jusqu'à 128 machines virtuelles sur un seul hôte, chacune pouvant se voir attribuer jusqu'à 256 cœurs de processeur virtuels (VCPU) et 128 Go de RAM.
NVMM comprend un pilote qui fonctionne au niveau du noyau du système et coordonne l'accès aux mécanismes de virtualisation matériels, ainsi qu'une pile Libnvmm exécutée dans l'espace utilisateur. L'interaction entre les composants du noyau et de l'espace utilisateur se fait via IOCTL. La particularité de NVMM, qui le distingue des hyperviseurs comme KVM, et Bhyve, réside dans le fait qu'au niveau du noyau, seules les enveloppes minimales nécessaires autour des mécanismes de virtualisation matériels sont exécutées, tandis que tout le code d'émulation du matériel est déplacé de l'intérieur du noyau vers l'espace utilisateur. Cette approche permet de réduire la quantité de code exécuté avec des privilèges accrus et diminue le risque de compromission de l'ensemble du système en cas d'attaques sur des vulnérabilités de l'hyperviseur. De plus, elle simplifie considérablement le débogage et les tests de fuzzing du projet.
Cependant, Libnvmm lui-même ne contient pas de fonction d'émulateur, mais fournit uniquement une API permettant d'intégrer le support de NVMM dans des émulateurs existants, comme QEMU. L'API couvre des fonctions telles que la création et le lancement d'une machine virtuelle, l'allocation de mémoire au système invité, ainsi que la distribution de VCPU. Pour améliorer la sécurité et réduire les vecteurs d'attaque possibles, libnvmm offre uniquement les fonctionnalités explicitement demandées — par défaut, les gestionnaires complexes ne sont pas appelés automatiquement et peuvent ne pas être utilisés du tout, si leur utilisation peut être évitée. NVMM essaye d'employer des solutions simples, sans tomber dans des complications, et permet de contrôler autant que possible les aspects du fonctionnement.
La partie NVMM opérant au niveau du noyau est intégrée de manière assez serrée avec le noyau NetBSD, et permet d'améliorer les performances en réduisant le nombre de commutations de contexte entre le système d'exploitation invité et l'environnement hôte. Du côté de l'espace utilisateur, libnvmm s'efforce d'agréger les opérations d'entrée/sortie typiques et évite, autant que possible, de faire appel aux appels système. Le système de gestion de la mémoire est basé sur la sous-système pmap, ce qui permet d'éjecter les pages de mémoire des systèmes invités vers le swap en cas de manque de mémoire dans le système. NVMM est dépourvu de verrous globaux et se mise à l'échelle efficacement, permettant d'utiliser simultanément différents cœurs de CPU pour exécuter différentes machines virtuelles invitées.
Une solution basée sur QEMU a été développée, utilisant NVMM pour exploiter les mécanismes matériels de virtualisation. Des travaux sont en cours pour intégrer les patchs préparés dans la version principale de QEMU. L'association QEMU+NVMM permet déjà de lancer avec succès des systèmes invités avec FreeBSD, OpenBSD, Linux, Windows XP/7/8.1/10 et d'autres systèmes d'exploitation sur des systèmes x86_64 avec des processeurs AMD et Intel (NVMM n'est pas lié à une architecture spécifique, par exemple, en créant le backend approprié, il pourra fonctionner sur des systèmes ARM64). Parmi les domaines d'utilisation future, la sandbox-isolement de certaines applications est également mentionnée.
Source : opennet.ru
