Desarrolladores del proyecto NetBSD sobre la creación de un nuevo hipervisor y su correspondiente pila de virtualización, que ya están incluidos en la rama experimental NetBSD-current y se ofrecerán en la versión estable de NetBSD 9. NVMM actualmente está limitado al soporte de la arquitectura x86_64 y proporciona dos backends para aprovechar los mecanismos de virtualización de hardware: x86-SVM con soporte para las extensiones de virtualización de CPU AMD y x86-VMX para CPU Intel. En su forma actual, es posible ejecutar hasta 128 máquinas virtuales en un solo host, a cada una de las cuales se le pueden asignar hasta 256 núcleos virtuales de procesador (VCPU) y 128 GB de RAM.
NVMM incluye un controlador que funciona a nivel del núcleo del sistema y coordina el acceso a los mecanismos de virtualización de hardware, así como la pila Libnvmm, que se ejecuta en espacio de usuario. La interacción entre los componentes del núcleo y el espacio de usuario se realiza a través de IOCTL. Una característica de NVMM, que lo distingue de hipervisores como KVM, y Bhyve, es que a nivel del núcleo se ejecuta solo el conjunto mínimo necesario de envolturas alrededor de los mecanismos de virtualización de hardware, mientras que todo el código de emulación de hardware se ha extraído del núcleo al espacio de usuario. Este enfoque permite reducir la cantidad de código que se ejecuta con privilegios elevados y disminuye el riesgo de comprometer todo el sistema en caso de ataques a vulnerabilidades en el hipervisor. Además, se simplifica notablemente la depuración y las pruebas de fuzzing del proyecto.
Por otro lado, Libnvmm en sí mismo no contiene funciones de emulador, sino que proporciona una API que permite integrar el soporte de NVMM en emuladores existentes, como QEMU. La API abarca funciones como la creación y ejecución de máquinas virtuales, la asignación de memoria al sistema huésped y la distribución de VCPU. Para aumentar la seguridad y reducir los posibles vectores de ataque, libnvmm proporciona solo funciones expresamente solicitadas: por defecto, los manejadores complejos no se llaman automáticamente y pueden no aplicarse en absoluto si se pueden evitar. NVMM intenta emplear soluciones simples, evitando complejidades y permitiendo controlar tantos aspectos del funcionamiento como sea posible.
La parte de NVMM que opera a nivel de núcleo está altamente integrada con el núcleo de NetBSD, lo que permite mejorar el rendimiento al reducir el número de cambios de contexto entre el sistema operativo invitado y el entorno host. En el espacio de usuario, libnvmm intenta agregar operaciones típicas de entrada/salida y evita realizar llamadas al sistema cuando no es necesario. El sistema de gestión de memoria se basa en la subsistema pmap, lo que permite desalojar páginas de memoria de los sistemas invitados en el área de intercambio en caso de escasez de memoria en el sistema. NVMM se libera de bloqueos globales y se escala bien, permitiendo el uso simultáneo de diferentes núcleos de CPU para ejecutar diferentes máquinas virtuales invitadas.
Sobre la base de QEMU, se ha preparado una solución que utiliza NVMM para aprovechar los mecanismos de virtualización de hardware. Se está trabajando en la inclusión de los parches preparados en la versión principal de QEMU. La combinación de QEMU+NVMM ya ha logrado iniciar sistemas invitados con FreeBSD, OpenBSD, Linux, Windows XP/7/8.1/10 y otros sistemas operativos en sistemas x86_64 con procesadores AMD e Intel (NVMM en sí no está ligado a una arquitectura específica, por ejemplo, al crear el backend correspondiente, puede funcionar en sistemas ARM64). Entre las áreas de aplicación futura de NVMM también se menciona el aislamiento sandbox de aplicaciones individuales.
Fuente: opennet.ru
