A Varnish Software, desenvolvedora de sistemas para construção de redes de entrega e cache de conteúdo, apresentou o projeto aberto TinyKVM, que aprimora as ferramentas para a isolação da execução de processos individuais usando o hipervisor KVM. O objetivo do projeto é criar o sistema de sandbox mais rápido para a isolação de processos individuais, utilizando virtualização de hardware. O código do projeto é escrito nas linguagens C e C++ e é distribuído sob a licença GPLv3 (para aqueles que não conseguem atender aos requisitos da GPLv3, uma licença comercial está disponível).
TinyKVM é projetado para a execução isolada de qualquer programa de console para Linux com desempenho próximo à execução normal. Os custos associados a cada chamada de sistema são de cerca de 2 microssegundos. Como exemplo da aplicação do projeto, menciona-se a isolação adicional de processos em sistemas de cache e processamento de requisições web. TinyKVM foi desenvolvido para substituir o emulador libriscv, usado para isolar o processamento de cada requisição web na plataforma Varnish. Adicionalmente, uma versão da biblioteca libvmod foi criada, permitindo adicionar módulos ao Varnish utilizando o TinyKVM.


Quando executado com o TinyKVM, o código de máquina do programa é executado sem camadas de emulação na CPU e é restrito pelo API do hipervisor KVM, o que permite eliminar sobrecargas e alcançar um desempenho próximo ao da execução sem virtualização. As principais funcionalidades do TinyKVM são:
- Limitação do tempo máximo de execução. O programa pode ser forçado a parar após o timeout, sem a invocação de manipuladores de sinais e threads.
- Limitação do consumo de memória.
- Capacidade de ramificação (fork) de instâncias não inicializadas máquinas virtuais de uma única instância inicializada de um programa isolado. Cópias das máquinas virtuais são criadas em modo copy-on-write, o que permite economizar significativamente memória, armazenando apenas uma instância de dados compartilhados.
- Processos ramificados podem ser revertidos para um estado anterior (por exemplo, um manipulador de requisições http ramificado pode retornar ao estado original após o processamento de cada requisição, sem reinicialização). Uma instância de um processo isolado também pode ser redefinida para o estado de outra máquina virtual, e não a da qual foi ramificada, mas os custos serão mais altos nesse caso, pois será necessário modificar a tabela de páginas da memória.
- A possibilidade de criar páginas de memória estáticas durante a inicialização, adequadas mesmo para runtimes sofisticados, como na linguagem Go. Nesse caso, modificações são permitidas apenas para páginas que estão no modo de copy-on-write.
- Suporte para depuração remota com o GDB. A depuração em tempo real é possível com a continuação da execução.
O ambiente convidado TinyKVM forma um núcleo reduzido, protegido de alterações, construído com a inclusão de proteção das páginas de memória e utilizando SMAP (Supervisor Mode Access Prevention) e SMEP (Supervisor Mode Execution Prevention) para uma maior isolação entre o núcleo e o espaço do usuário. TinyKVM utiliza grandes páginas de memória (hugepage) para melhorar o desempenho. As chamadas de sistema feitas pelos programas são interceptadas pelo emulador e redirecionadas para o ambiente host (a latência para o processamento e tradução da chamada emulada é de cerca de 2 microsegundos). máquina virtual não utiliza quaisquer drivers, entrada/saída e dispositivos virtuais.

Fonte: opennet.ru
