Cómo desplegar unikernels de MirageOS sobre NixOS

Fuentes: Deploying MirageOS Unikernels Reproducibly with Nix

Este artículo explica cómo combinar dos tecnologías del ecosistema del software libre —NixOS y MirageOS— para desplegar servicios de red reproducibles y seguros, tomando como caso de uso un servidor DNS autoritativo.

MirageOS es un framework de library operating system que permite compilar aplicaciones escritas en OCaml como unikernels: sistemas especializados que integran en un único núcleo tanto el código de aplicación como las funciones de sistema operativo que éste necesita. Esta arquitectura reduce la superficie de ataque mediante dead-code elimination y mejora la eficiencia, al eliminar interfaces del sistema operativo que la aplicación no utiliza. MirageOS parte de una larga línea de investigación en exokernels y es el primer marco práctico de creación de unikernels.

NixOS, por su parte, es una distribución Linux orientada a la configuración declarativa y reproducible del sistema, en la que cada paquete y cada servicio se describe como una derivación de Nix. Instalar un servidor DNS como bind en NixOS basta con unas pocas líneas en un módulo. El problema aparece cuando se quiere ir más allá de bind —escrito en C— y desplegar en su lugar un unikernel de MirageOS: las herramientas de despliegue del ecosistema OCaml (opam) son imperativas y rompen la reproducibilidad que Nix garantiza.

El artículo detalla el camino seguido para resolver esa fricción. Como Nixpkgs solo maneja un conjunto global y fijo de versiones de paquetes OCaml, no puede resolver por sí solo las restricciones de versiones de un proyecto opam concreto. La herramienta opam-nix, desarrollada por Tweag, ya abordaba esta carencia invocando el resolvedor SAT de dependencias de opam dentro de una derivación Nix. Los autores la extendieron además para soportar opam-monorepo, necesario porque los unikernels a menudo requieren cross-compilation (por ejemplo al objetivo Solo5, el shim que conecta el unikernel con hipervisores), y Dune solo conoce el contexto de compilación correcto si recibe todas las dependencias de las fuentes de antemano.

El resultado es un flujo que permite construir un unikernel de MirageOS enteramente desde Nix, versionar la configuración y desplegar un servidor DNS (o cualquier otro servicio de red) de forma reproducible sobre una máquina NixOS, incluyendo la gestión del glue record en el registrar.