# Unikernel

Les unikernels sont des images systèmes spécialisées, où tous les processus partagent le même espace mémoire, créées en utilisant des systèmes d'exploitation bibliothèques.
Le développeur sélectionne, à partir d'un ensemble modulaire, un ensemble minimum de bibliothèques qui correspondent aux services du système d'exploitation nécessaires à l'exécution de son application. Ces bibliothèques sont alors compilées avec l'application et des configurations pour créer des images fixes, à but unique, qui fonctionnent directement sur un hyperviseur ou sur du matériel sans intervention d'un système d'exploitation tel que Linux ou Windows.

## Système d'exploitation bibliothèque

Dans un système d'exploitation bibliothèque, les limites de protection sont repoussées vers les bas niveaux, ce qui permet :
* un ensemble de bibliothèques qui implémentent les mécanismes nécessaires pour faire fonctionner le matériel ou pour gérer les protocoles réseau;
* un ensemble de règles permettant d'appliquer une politique d'accès et d'isolation au niveau de l'application.
Les premiers systèmes de ce type étaient Exokernel et « Nemesis » vers la fin des années 1990.
L'architecture des systèmes d'exploitation bibliothèque présente plusieurs avantages et inconvénients en comparaison de la conception de systèmes plus classiques. Un des avantages est que, puisqu'il n'y a qu'un seul espace d'adressage, les transitions de privilège entre l'espace utilisateur et l'espace noyau, régulières sur les systèmes classiques, ne sont pas nécessaires. Ainsi, un système d'exploitation bibliothèque peut offrir des performances améliorées en offrant un accès direct au matériel sans changement de contexte. Un inconvénient est que, puisqu'il n'y a pas de séparation, il est difficile de faire fonctionner plusieurs applications de concert dans un système d'exploitation bibliothèque avec une isolation des ressources. De plus, des pilotes de matériel sont requis pour la machine sur laquelle le système d'exploitation fonctionne. Les changements fréquents du matériel font de ce besoin de réécrire des pilotes régulièrement un problème.
La virtualisation permet d'éviter ces points négatifs sur du matériel courant. Les hyperviseurs modernes permettent de simplement gérer des machines virtuelles avec le temps processeur qu'elles consomment, tout en fournissant une isolation forte. Un système d'exploitation bibliothèque fonctionnant dans une machine virtuelle n'a besoin d'implémenter que les pilotes pour le matériel virtuel stable que fournit cet hyperviseur, et peut laisser la tâche complexe de gérer le véritable matériel à l'hyperviseur. Cependant, des bibliothèques permettant d'utiliser des protocoles réseau sont toujours nécessaires pour remplacer les services fournis par un système d'exploitation plus classique. La création de ces bibliothèques de protocoles est la plus grande partie du travail d'implémentation d'un système d'exploitation bibliothèque moderne.

## Avantages et inconvénients

Les unikernels ont un certain nombre d'avantages, mais aussi d'inconvénients, en comparaison des systèmes d'exploitation classiques :
* Une sécurité améliorée — En réduisant la quantité de code déployé, les unikernels réduisent la surface d'attaque et présentent donc une sécurité améliorée$^,$.
* Taille réduite — Il a été démontré que les unikernels ne faisaient qu'environ 4 % de la taille de bases de code équivalentes basées sur un système d'exploitation classique.
* Optimisation du système — En raison de la façon dont ils sont construits, il est possible d'optimiser le système entier, des pilotes à l'application, ce qui permet d'améliorer la spécialisation$^,$.
* Temps de démarrage faibles — Il a été montré régulièrement que les unikernels étaient capables de démarrer extrêmement rapidement, suffisamment pour répondre à une requête avant son expiration$^,$$^,$.
Ces avantages poussent les unikernels vers l'utilisation en tant que systèmes de type orienté-services ou microservices
Cependant, le haut niveau de spécialisation signifie que les unikernels ne sont pas appropriés à l'informatique généraliste, avec plusieurs utilisateurs, pour laquelle les systèmes d'exploitation classiques sont utilisés. Ajouter des fonctionnalités ou altérer un unikernel compilé est en général impossible, et l'approche acceptée est de recompiler et de déployer un nouvel unikernel avec les changements désirés.

## Implémentations modernes

Il existe un grand nombre de nouvelles approches à la construction d'unikernels, qui sont à des degrés variables de maturité.

### ClickOS

ClickOS$^,$ est une plateforme haute performance virtualisée pour les appliances, basée sur un système de virtualisation open-source. Des analyses de performance montrent que les machines virtuelles ClickOS sont petites (5 Mo), démarrent vite (jusqu'à 20 millisecondes), ajoutent peu de délai à l'application cible (45 microsecondes), et plus de 100 peuvent être en fonctionnement simultané, en saturant une interface 10Gb, sur un serveur peu cher standard.

### Clive

Clive est un système d'exploitation conçu pour fonctionner dans des environnements de calcul distribué et d’informatique en nuage, écrit dans le langage de programmation Go.

### Drawbridge

Drawbridge est un prototype de recherche sur une nouvelle forme de virtualisation pour le sandboxing d'applications. Drawbridge combine deux technologies centrales : un picoprocessus, qui est un conteneur d'isolation basé au niveau processus présentant une surface d'API kernel minimale, et un système d'exploitation bibliothèque, qui est une version de Windows modifiée pour fonctionner efficacement dans un picoprocessus.

### Graphene

Graphene$^,$ est un système d'exploitation bibliothèque compatible avec Linux qui concentre ses efforts sur la sécurisation d'applications anciennes multi-processus, de type serveur ou shell. Graphene sépare une application multi-processus sur plusieurs picoprocessus, avec les abstractions inter-processus (signaux, files d'attente, sémaphores, etc.) coordonnées sur des flux simples. Pour les applications présentant des principes de sécurité multiples, Graphene peut sandboxer dynamiquement un picoprocessus exposé.

### HaLVM

HaLVM (Haskell Lightweight Virtual Machine) est un port de Glasgow Haskell Compiler, qui permet aux développeurs d'écrire des machines virtuelles haut niveau légères qui fonctionnent sur l'hyperviseur Xen.

### IncludeOS

IncludeOS est un système d'exploitation bibliothèque minimaliste, orienté services, open-source, et intégrable, visant les services dans le nuage. C'est actuellement un projet de recherche permettant de faire fonctionner du code C++ sur du matériel virtuel.

### LING

LING est un unikernel basé sur Erlang/OTP qui est capable d'interpréter les fichiers .beam. Les développeurs peuvent créer du code Erlang et le déployer en tant qu'unikernels LING. LING retire la majorité des fichiers vecteurs, n'utilise que trois librairies externes et n'utilise pas OpenSSL.

### MirageOS

MirageOS$^,$ est un système d'exploitation bibliothèque qui permet de créer des unikernels pour des applications réseau à haute performance sécurisées sur une grande variété de plateformes mobiles ou dans le nuage. Il existe actuellement plus de cent bibliothèques MirageOS et un nombre croissant de bibliothèques compatibles dans l'écosystème OCaml.

### OSv

OSv (en) est un système d'exploitation conçu par Cloudius Systems spécifiquement pour les machines virtuelles dans le nuage. Capable de démarrer en moins d'une seconde, OSv est développé dans le seul but d’exécuter une application sur un hyperviseur quelconque, ce qui offre de meilleures performances et une gestion simplifiée. OSv peut lancer des exécutables Linux non-modifiés (avec quelques limitations) et supporte les langages C, C++, Ruby, Node.js, et les langages basés sur la JVM.

### Rumprun

Rumprun est une pile logicielle qui permet de lancer des logiciels POSIX non-modifiés dans un unikernel. Rumprun supporte de multiples plateformes, dont le fonctionnement direct sur du matériel et des hyperviseurs tels que Xen ou KVM. Il est basé sur des rump kernel (en) qui offrent des pilotes logiciel portables, libres, séparés en composants, et de qualité, pour notamment des systèmes de fichiers, des gestionnaires d'appels systèmes POSIX, des pilotes de matériel PCI, une pile de protocole SCSI, virtio et une pile TCP/IP.

### Runtime.js

Runtime.js est un système d'exploitation bibliothèque open-source pour le nuage qui fonctionne sur la machine virtuelle JavaScript, qui peut être incluse avec une application et déployée comme une image virtuelle légère et immuable. Runtime.js est basé sur le moteur javascript V8 et supporte actuellement l'hyperviseur QEMU/KVM.