Smol machines – démarrage à froid en moins d’une seconde et machine virtuelle portable
(github.com/smol-machines)- smolvm est un outil de gestion de machines virtuelles en ligne de commande qui exécute des logiciels dans un environnement isolé
- Il prend en charge un démarrage à froid en moins d’une seconde, une gestion élastique de la mémoire et une portabilité en fichier unique, pour exécuter des VM rapidement et avec légèreté
- Les VM s’exécutent sous forme de microVM basées sur le noyau Linux et peuvent être empaquetées dans un fichier
.smolmachinepour être relancées sans dépendances - Il offre une prise en charge intégrée des environnements de développement et de sécurité avec l’isolation par frontière d’hyperviseur, le transfert d’agent SSH et la déclaration d’environnement via Smolfile
- Il prend en charge le démarrage d’images OCI sans démon Docker et propose une alternative de virtualisation légère avec un temps de démarrage inférieur à 200 ms et une isolation au niveau matériel
Vue d’ensemble
- smolvm est un outil de gestion de machines virtuelles en ligne de commande conçu pour exécuter des logiciels dans un environnement isolé
- Il fonctionne sur macOS et Linux et prend en charge un cold start en moins d’une seconde, une utilisation élastique de la mémoire et un empaquetage portable en fichier unique
- Chaque charge de travail s’exécute dans une microVM basée sur le noyau Linux, offrant une isolation au niveau matériel
- Une VM empaquetée dans un fichier
.smolmachinepeut être relancée sans dépendances sur des plateformes de même architecture
Fonctionnalités principales
-
Gestion et exécution de machines virtuelles locales
- Exécution d’une VM Linux personnalisée avec la commande
smolvm machine run - Le démarrage à froid prend moins d’une seconde, avec prise en charge de macOS et Linux
- La mémoire est gérée de façon élastique via virtio balloon, et seule la consommation réelle est allouée à l’hôte
- Exécution d’une VM Linux personnalisée avec la commande
-
Empaquetage portable en fichier unique
- La VM, état inclus, peut être regroupée dans un fichier
.smolmachinepuis recréée sur une autre plateforme - Toutes les dépendances sont intégrées, ce qui permet une exécution immédiate sans installation, avec un temps de démarrage inférieur à 200 ms
- La VM, état inclus, peut être regroupée dans un fichier
-
Sandbox pour code non fiable
- La frontière de l’hyperviseur isole complètement le système de fichiers hôte, le réseau et les identifiants
- Le réseau est désactivé par défaut, et l’option
--allow-hostpermet d’autoriser uniquement des hôtes précis
-
VM persistantes pour le développement
- Création et gestion des VM avec les commandes
machine create,start,stop - Les paquets installés sont conservés après redémarrage, ce qui permet un usage comme environnement de développement
- Création et gestion des VM avec les commandes
-
Transfert d’agent SSH
- L’agent SSH de l’hôte est transmis à l’intérieur de la VM, mais la clé privée n’est pas copiée dans l’invité
- L’option
--ssh-agentpermet d’utiliser en toute sécurité l’authentification SSH de l’hôte
-
Déclaration d’environnement via Smolfile
- La configuration de la VM est déclarée dans un
Smolfileau format TOML - Il est possible de définir l’image, le réseau, les commandes d’initialisation, les volumes, les options d’authentification, etc., pour obtenir un environnement reproductible
- La configuration de la VM est déclarée dans un
Exemples d’utilisation
-
Exécution d’une VM temporaire
smolvm machine run --net --image alpine -- sh -c "echo 'Hello world'"- Mode d’exécution ponctuel dans lequel la VM est automatiquement nettoyée à la fermeture
-
Création d’un exécutable empaqueté
smolvm pack create --image python:3.12-alpine -o ./python312- L’exécutable généré permet de lancer un environnement Python autonome
-
Contrôle réseau
- Le réseau est désactivé par défaut
- L’option
--allow-hostpermet d’autoriser l’accès uniquement à des domaines précis
-
Utilisation de SSH et Git
smolvm machine run --ssh-agent --net --image alpine- Accès possible à des dépôts Git en utilisant en toute sécurité les clés SSH de l’hôte
Architecture interne et fonctionnement
- Chaque charge de travail exécute un noyau indépendant sur Hypervisor.framework (macOS) ou KVM (Linux)
- Utilise un VMM basé sur libkrun ainsi qu’un noyau personnalisé (libkrunfw)
- Prend en charge le format d’image OCI, ce qui permet de récupérer et d’exécuter directement des images depuis Docker Hub, ghcr.io, etc.
- Aucun démon Docker requis, avec possibilité de démarrer directement des images OCI standard
- La configuration par défaut est de 4 vCPU et 8 Gio de RAM, ajustables via les options
--cpuset--mem - Les threads vCPU passent automatiquement en veille côté hyperviseur lorsqu’ils sont inactifs, ce qui rend le coût de surallocation quasi nul
Comparaison
| Élément | smolvm | Containers | Colima | QEMU | Firecracker | Kata |
|---|---|---|---|---|---|---|
| Niveau d’isolation | VM par charge de travail | namespaces (noyau partagé) | namespaces (VM unique) | VM individuelles | VM individuelles | VM par conteneur |
| Temps de démarrage | <200ms | environ 100ms | quelques secondes | 15–30s | <125ms | environ 500ms |
| Architecture | bibliothèque (libkrun) | démon | démon dans la VM | processus | processus | pile d’exécution |
| VM par charge de travail | pris en charge | non pris en charge | partagé | pris en charge | pris en charge | pris en charge |
| macOS natif | pris en charge | via VM Docker | basé sur krunkit | pris en charge | non pris en charge | non pris en charge |
| SDK intégré | pris en charge | non pris en charge | non pris en charge | non pris en charge | non pris en charge | non pris en charge |
| Artefact portable | .smolmachine |
image nécessitant un démon | non pris en charge | non pris en charge | non pris en charge | non pris en charge |
Prise en charge des plateformes
| Hôte | Invité | Exigences |
|---|---|---|
| macOS Apple Silicon | Linux arm64 | macOS 11 ou supérieur |
| macOS Intel | Linux x86_64 | macOS 11 ou supérieur (tests non finalisés) |
| Linux x86_64 | Linux x86_64 | KVM (/dev/kvm) requis |
| Linux aarch64 | Linux aarch64 | KVM (/dev/kvm) requis |
Limitations connues
- Le réseau est désactivé par défaut et ne peut être activé qu’avec l’option
--net - Seuls TCP/UDP sont pris en charge, pas ICMP
- Les montages de volumes ne sont possibles qu’au niveau des répertoires, pas pour un fichier unique
- Sur macOS, seuls les binaires signés avec les autorisations Hypervisor.framework peuvent être exécutés
- Lors de l’utilisation de
--ssh-agent, un agent SSH doit être en cours d’exécution sur l’hôte (SSH_AUTH_SOCKdoit être défini)
Développement
- Les consignes de développement sont disponibles dans
docs/DEVELOPMENT.md - Publié sous licence Apache-2.0, créé par @binsquare
1 commentaires
Avis Hacker News
Je suis en train de construire une machine virtuelle qui pourrait remplacer les conteneurs Docker
avec la même ergonomie que les conteneurs, tout en visant un temps de démarrage inférieur à 1 seconde
En travaillant chez AWS sur Firecracker, j’ai réalisé que les conteneurs ajoutaient une couche inutile, et que Firecracker était une technologie conçue pour l’architecture interne d’AWS
J’ai donc fini par créer moi-même une forme hybride qui combine les avantages des conteneurs et ceux de Firecracker
J’aimerais avoir vos avis
Le problème, c’est que les microVM ne peuvent généralement pas exécuter Docker ou Kubernetes
Moi, j’aimerais mettre un cluster Kubernetes complet dans une sandbox. Je me demande si l’exécution de k3s est aussi prise en charge
C’est une fonctionnalité qui manque toujours dans ce genre de système, alors qu’il existe encore beaucoup d’environnements qui en ont besoin au-delà des workloads cloud native
Si vous l’ajoutez, ce serait un vrai facteur de différenciation
Firecracker ne fonctionne pas sur macOS, et je voulais pouvoir créer facilement des sandboxes microVM pour des apps d’IA
Pour un utilisateur classique, Firecracker est beaucoup trop lourd
Et j’aimerais aussi savoir quels sont aujourd’hui les goulots d’étranglement si vous voulez encore réduire ce temps
Ce projet ressemble à plusieurs implémentations de unikernel — par exemple Unikraft
Mais Smol Machines n’est pas une implémentation de unikernel : c’est une version allégée du noyau Linux
Il est donc hautement compatible avec la plupart des logiciels
La fonction de génération de binaire autonome ressemble à une manière de packager des apps JVM plus simplement qu’avec GraalVM Native
Exemple de commande :
smolvm pack create --image python:3.12-alpine -o ./python312./python312 run -- python3 --version→ Python 3.12.x s’exécute de façon totalement isolée, sans pyenv/venv/conda
De la même manière qu’Electron distribue des apps web avec le navigateur, Smol Machines packagerait le logiciel avec une VM Linux
Cela permet d’éviter les problèmes de gestion des dépendances et de compatibilité
Personnellement, j’aimerais que des outils comme Codex ou Claude Code soient aussi distribués de cette manière
C’est l’idée d’une « machine distribuable » pour résoudre ce problème
Une fois bien configurée, on peut la partager et l’exécuter immédiatement chez n’importe qui
Je me demande si le fichier
.smolmachineprend en charge la signature numérique et l’auto-authentificationJ’aimerais savoir si cela peut fonctionner comme dans la documentation de signature/vérification de Sylabs
Je me demande s’il serait possible d’aller encore plus vite en appliquant les idées de zeroboot
Le tableau comparatif est vraiment très bien fait
Au début, je me suis dit « ça ressemble à Firecracker », mais en voyant le tableau, les différences sont devenues très claires
C’était facile à lire et, dans l’ensemble, c’est un travail très impressionnant
Dans la documentation CLI, j’ai vu les images alpine et python:3.12-alpine, et je me demande d’où elles viennent
Est-ce que ça vient d’un registre Docker, est-ce intégré, ou est-ce qu’on les crée soi-même avec un smolfile ?
Je me demande aussi s’il existe une image Ubuntu
Ce serait bien d’ajouter le redimensionnement à chaud de la mémoire et du CPU, et je pense que cela pourrait aussi servir à orchestrer une infrastructure backend par client
La plupart des projets open source démarrent leurs conteneurs avec Docker Compose, mais Smol Machines ne prend pas en charge Docker dans la microVM
C’est aussi dommage qu’il ne prenne pas en charge les VM imbriquées comme Vagrant
À la place, il est proposé d’utiliser une approche trampoline pour l’exécuter comme VM sœur de la VM Vagrant
Je me demande si vous pourriez expliquer brièvement quelle est la raison principale d’utiliser Smol Machines plutôt qu’une sandbox Docker
Très beau résultat. Félicitations