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.
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”