La empresa Varnish Software, que desarrolla sistemas para la construcción de redes de entrega y almacenamiento en caché de contenido, ha presentado el proyecto abierto TinyKVM, que desarrolla herramientas para la aislamiento de la ejecución de procesos individuales utilizando el hipervisor KVM. El objetivo del proyecto es crear el sistema de aislamiento sandbox más rápido para procesos individuales, utilizando virtualización de hardware. El código del proyecto está escrito en C y C++, y se distribuye bajo la licencia GPLv3 (para aquellos que no pueden cumplir con los requisitos de la GPLv3, se ofrece una licencia comercial).
TinyKVM está diseñado para la ejecución aislada de cualquier programa de consola para Linux con un rendimiento cercano al de la ejecución normal. Los gastos generales por cada llamada al sistema son de aproximadamente 2 microsegundos. Como ejemplo de uso del proyecto, se menciona el aislamiento adicional de procesos en sistemas de almacenamiento en caché y procesamiento de solicitudes web. TinyKVM fue desarrollado para reemplazar el emulador libriscv, que se utiliza para el aislamiento del procesamiento de cada solicitud web en la plataforma Varnish. Además, se ha creado una variante de la biblioteca libvmod, que permite ejecutar módulos para Varnish utilizando TinyKVM.


Al ejecutarse mediante TinyKVM, el código máquina de los programas se ejecuta sin capas de emulación en la CPU y se limita mediante la API del hipervisor KVM, lo que permite eliminar los gastos generales y alcanzar un rendimiento cercano a la ejecución sin virtualización. Las principales características de TinyKVM son:
- Restricción del tiempo máximo de ejecución. El programa puede detenerse forzosamente después de que se agote el tiempo, sin llamar a los manejadores de señales y hilos.
- Restricción del consumo de memoria.
- Capacidad de bifurcar (fork) instancias no inicializadas máquinas virtuales de una instancia inicializada de un programa aislado. Las copias de las máquinas virtuales se crean en modo copy-on-write, lo que permite ahorrar significativamente memoria, almacenando solo una instancia de los datos compartidos.
- Los procesos ramificados pueden restablecerse al estado anterior (por ejemplo, un manejador de solicitudes http ramificado puede volver sin reiniciarse a su estado original después de procesar cada solicitud). Una instancia de un proceso aislado también puede restablecerse al estado de otra máquina virtual, no aquella de la que fue ramificada, pero los costos en este caso serán más altos, ya que será necesario modificar la tabla de páginas de memoria.
- La posibilidad de crear páginas de memoria estáticas durante la inicialización, adecuadas incluso para runtimes sofisticados, como en el lenguaje Go. En este caso, sólo se permiten modificaciones para las páginas que estén en modo copia-sobre-escritura.
- Soporte de depuración remota mediante GDB. La depuración en tiempo real con reanudación de la ejecución es posible.
El entorno de hospedaje TinyKVM forma un núcleo reducido, protegido contra cambios, construido con habilitación de protección de páginas de memoria y utilizando SMAP (Prevención de Acceso en Modo Supervisor) y SMEP (Prevención de Ejecución en Modo Supervisor) para una mayor aislamiento entre el núcleo y el espacio del usuario. TinyKVM utiliza páginas de memoria grandes (hugepage) para mejorar el rendimiento. Las llamadas al sistema realizadas por programas son interceptadas por el emulador y redirigidas al entorno anfitrión (la latencia para el procesamiento y la traducción de la llamada emulada es de alrededor de 2 microsegundos). En el mismo una máquina virtual no se utilizan controladores, entrada/salida y dispositivos virtuales.

Fuente: opennet.ru
