Home IncludeOS el unikernel de c++
Post
Cancel
Preview Image

IncludeOS el unikernel de c++

IncludeOS es un unikernel escrito desde cero, utilizando la virtualización de hardware x86, sin dependencias, excepto para el hardware virtual, actualmente es un prototipo.

Características

1
2
3
4
5
6
* IncludeOS pretende ser la capa más pequeña posible entre el código C++ y el hardware virtual.
* Con IncludeOS podremos crear **un servicio en la nube escrito en C++** que contendrá unicamente las librerías necesarias para ejecutarse.
* El resultado de la compilación nos dará como resultado una **imagen de disco**, que contendrá la aplicación y los pocos componentes necesarios de un S.O para ser ejecutado.
* Ésta imagen se podrá ejecutar en **KVM** y en VirtualBox.
* La imagen que es generada, ocupará al rededor de unos** 693k.**
* El modelo de programación con IncludeOS está inspirado en **Node.js**, utiliza **un solo hilo** y devuelve **callbacks asíncronos**.

Podremos ver todas sus características y limitaciones en el siguiente link.

unikernel IncludeOS

Sin duda, la elección de este tipo diseño y lenguaje, ofrecerá grandes ventajas para la creación de servicios web, con una eficiencia mayor a la que estamos acostumbrados a ver en servicios escritos en lenguajes de alto nivel, como puedan ser Java, JS o C#,

El “Hello World”

Bueno, ahora los mas importante: ¿Cómo diablos hacemos para crear nuestro primer Hello world?.

Nos descargaremos desde el repositorio oficial el proyecto. En él encontraremos un script que nos instalará las dependencias y realizará las configuraciones necesarias.

Éste script está preparado para sistemas basados en Debian.

1
2
3
git clone https://github.com/h1ioa-cs/IncludeOS.git
cd IncludeOS
./etc/install_from_bundle.sh

Configuración

En caso de querer modificar la IP o puerto al que responde el servicio podemos modificarlo desde el fichero:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
IncludeOS/examples/demo_service/service.cpp

  // Static IP configuration, until we (possibly) get DHCP
  // @note : Mostly to get a robust demo service that it works with and without DHCP
  inet->network_config( 192,      // IP
			255,  // Netmask
			192,       // Gateway
			8 );      // DNS
  
  printf("Size of IP-stack: %i b \n",sizeof(inet));
  printf("Service IP address: %s \n", inet->ip_addr().str().c_str());
  
  // Set up a TCP server on port 80
  net::TCP::Socket& sock =  inet->tcp().bind(80);

También podemos modificar el bridge que crea por defecto al ejecutar “install_from_bundle.sh” desde el fichero “IncludeOS/etc/create_bridge.sh”

1
2
3
4
5
6
7
BRIDGE=include1
NETMASK=255.255.255.0
GATEWAY=192.168.1.1

# For later use
NETWORK=192.168.1.0
DHCPRANGE=192.168.1.50,192.168.1.60

Ejecución

Antes de ejecutar  “test.sh” nos fijamos que “install_from_bundle.sh” no devolvió ningún error.

1
./test.sh

Una vez termine la ejecución del script, nos encontraremos con la siguiente salida, que nos muestra la ip donde tendremos el servicio corriendo, por defecto “Service IP address: 10.0.0.42

testIncludeOS

Resultado

end

This post is licensed under CC BY 4.0 by the author.