NodeOS : le système d'exploitation basé sur JavaScript
Publié: 2022-03-11Je suis sûr que la plupart des programmeurs ont entendu parler de Node.js, mais qu'en est-il de NodeOS ? Oui, NodeOS, un système d'exploitation écrit en Node.js. Bon type de. NodeOS utilise le noyau Linux pour la plupart des éléments critiques en termes de performances comme, par exemple, les interactions matérielles, mais pour tout le reste, il utilise Node.js. Le développement de NodeOS a commencé il y a deux ans et a été créé par des personnes qui partageaient une idée simple mais intrigante : "Est-il possible de créer un système d'exploitation en utilisant uniquement Node.js ?"
Quel est le gros problème?
Tout d'abord, pensez aux progrès réalisés par Node.js depuis le peu de temps qu'il existe. Maintenant, pensez à la même chose qui se passe avec un système d'exploitation. Ensuite, ajoutons-y des trucs sympas.
Système de fichiers racine indépendant et isolé par utilisateur
NodeOS a introduit un paradigme intéressant : si tous les utilisateurs ont un système de fichiers isolé, cela leur donne une hiérarchie de système de fichiers simple avec laquelle travailler. Étant donné que leur "dossier personnel" est, en fait, la racine de leur propre hiérarchie de système de fichiers, ils peuvent installer des packages globalement sans nécessiter d'autorisations spéciales et sans avoir besoin de configurer quoi que ce soit puisqu'ils sont installés dans leur répertoire personnel par défaut. En outre, il offre une bonne dose de sécurité ; si un pirate trouve un moyen d'accéder à un compte particulier dans le système d'exploitation, la seule partition à laquelle il peut accéder est la partition de cet utilisateur. Le résultat final est que le pirate ne peut pas compromettre l'ensemble du système.
Node.js et NPM
Si vous y réfléchissez, un système d'exploitation qui utilise Node.js signifie que tout package disponible dans NPM est, en même temps, également un package NodeOS. Au moment de la rédaction, il y a 210 735 colis ; puisque le nombre de packages NPM augmente chaque minute, il ne serait pas étrange que, dans quelques années, NodeOS compte un million d'applications.
Il est basé sur le noyau Linux
Cela peut ne pas sembler un gros problème, mais Linux est le système d'exploitation de serveur le plus utilisé. Étant donné que NodeOS est basé sur le noyau Linux, vous pouvez exécuter toutes les applications écrites pour d'autres distributions Linux avec des modifications minimes.
Les inconvénients
Même si j'aimerais un NodeOS fini, il n'y est pas encore. Il manque encore de nombreuses fonctions clés pour un système d'exploitation serveur. Par exemple, l'ensemble des outils BASH est manquant, y compris ps, tail, nano et grep. De plus, vous ne pouvez pas l'exécuter en tant que système d'exploitation de bureau car il n'a pas d'interface graphique. Bien sûr, vous pouvez implémenter assez facilement certaines des fonctionnalités manquantes en utilisant un peu de JavaScript, mais le fait que toutes les fonctionnalités mentionnées ne soient pas disponibles par défaut n'est pas bon.
Alors, comment puis-je essayer NodeOS ?
Utiliser Docker
Le moyen le plus simple et le plus rapide d'essayer NodeOS consiste à utiliser ce qui suit :
- Un ordinateur avec Mac OSX ou Linux. Cela pourrait fonctionner avec Windows, mais je ne l'ai pas essayé.
- Docker.
Une fois que vous avez installé Docker, exécuter une instance de NodeOS est facile. Tout ce que vous avez à faire est d'exécuter la commande suivante, et Docker fait toute la magie :
sudo docker run -t -i nodeos/nodeos
Lorsque vous exécutez la commande susmentionnée, Docker télécharge automatiquement l'image disque pour NodeOS à partir d'un référentiel et effectue l'installation de NodeOS dans une machine virtuelle. Une fois l'installation terminée, il ouvre une session SSH vers le shell NodeOS.
Sans docker
Il y a plusieurs raisons pour lesquelles vous voudriez éviter d'utiliser Docker, et l'une étant la dernière version de NodeOS. Au moment de la rédaction de cet article, la dernière modification de l'image Docker de NodeOS a été effectuée il y a deux mois, tandis que la version de développement a été mise à jour il y a six jours. Donc, si vous souhaitez utiliser la dernière version, vous devez absolument obtenir le code source. Ce n'est pas trop difficile, mais cela prend beaucoup de temps. Tu auras besoin de:
- Un ordinateur avec Linux. Vous pouvez le compiler sur OS X, mais cela prendra plus de temps car il doit faire une compilation croisée. Il en va de même pour Windows.
- Les utilitaires de construction Linux (make, g++, gcc, autoconf).
- Qemu.
- Temps. Sérieusement, beaucoup.
Une fois que vous avez tout, vous pouvez procéder à la compilation du code source :
- Téléchargez le code source du projet :
bash git clone [email protected]:NodeOS/NodeOS.git
. - Compilez-le en exécutant les commandes suivantes :
cd NodeOS
etnpm install
. - Je vais citer, mot à mot, la documentation officielle : « Choisissez du pop-corn au micro-ondes et allez voir un film. Non, vraiment, fais-le. . Oui, cela prendra autant de temps, alors faites quelque chose d'intéressant en attendant.
- Exécutez
bash npm start
pour exécuter NodeOS dans Qemu.
Est-ce que ça marche?
Une fois l'installation terminée, nous pouvons vérifier si cela fonctionne en exécutant à l'intérieur du shell NodeOS la commande ls
. Une sortie comme celle-ci devrait apparaître :
[ 'etc', 'lib', 'lib64', 'root', 'bin', 'sys', 'usr', 'share', 'proc' ]
Si c'est le cas, cela signifie que certaines commandes de base fonctionnent. Mais que se passe-t-il si nous voulons afficher l'adresse IP de la carte réseau ? Sous Linux, il existe une commande appelée ifconfig
qui fait exactement cela ; essayons:
command not found: ifconfig
Il semble que la commande ifconfig
soit manquante. En effet, NodeOS n'a pas de commande ifconfig
par défaut. Maintenant quoi? Eh bien, c'est simple; NodeOS dispose d'un gestionnaire de packages intégré (comme apt
ou yum
), appelé npkg
, basé sur le NPM de Node et facile à utiliser. L'installation d' ifconfig
est aussi simple que d'exécuter la commande suivante :
npkg install bin-ifconfig
Si tout s'est bien passé, la commande ifconfig
devrait maintenant être disponible dans le shell. Si nous essayons de l'exécuter à nouveau, une sortie comme celle-ci apparaît (j'ai mis une adresse MAC et une adresse IP aléatoires pour des raisons évidentes):
eth0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 01:23:45:67:89:ab inet6 f0cd::ef01:0203:0405:181%en1 prefixlen 64 scopeid 0x5 inet 192.168.0.21 netmask 0xffffff00 broadcast 192.168.0.21 nd6 options=1<PERFORMNUD> media: autoselect status: active
Si votre sortie ressemble un peu à ça, alors ça marche. Vous avez installé avec succès votre première application NodeOS : ifconfig
.

Ça fonctionne. Cependant, que faisons-nous maintenant avec l'OS ?
Quel est l'intérêt d'avoir un système d'exploitation écrit en Node.js si vous pouvez faire les mêmes choses (ou même moins de choses) que vous pouvez faire sur Ubuntu ou toute autre distribution Linux ? Eh bien, le fait est que tout est développé en utilisant rien de plus que Node.js. Cela signifie également que nous pouvons développer nos applications en utilisant rien de plus que Node.js. Par exemple, NodeOS n'a pas d'implémentation par défaut pour la commande man
, qui est utilisée sous Linux pour afficher les pages de manuel d'autres commandes. N'ayez crainte, sa mise en œuvre est simple. Comment, je vous entends demander? Simple.
Tout d'abord, installons un éditeur de texte appelé Hipster afin de pouvoir créer et modifier des fichiers en exécutant la commande suivante : npm install -g [email protected]
. Cet éditeur de fichiers est simple, et certainement pas quelque chose que j'utiliserais comme éditeur pour autre chose, mais il est assez bon dans ce cas. Créer des fichiers avec Hipster est très simple, lancez simplement hip filename
, comme hip package.json
; pour enregistrer appuyez sur Ctrl + s
et pour quitter appuyez sur Ctrl + q
. Pour cet exemple, je vais utiliser un code développé par l'un des principaux développeurs de NodeOS, je ne l'ai pas implémenté moi-même. Le code original de notre exemple se trouve dans le référentiel Git node-bin-man.
Revenons à la création de notre première application NodeOS. Comme pour toute application Node.js (ou package NPM), nous commençons par créer un fichier package.json
, comme dans l'exemple suivant :
{ "name": "bin-man", "version": "0.0.1", "description": "Format and display manual pages", "bin": { "man": "man.js" }, "repository": "https://github.com/groundwater/node-bin-man", "author": "groundwater", "license": "MIT", "dependencies": { "blessed": "~0.0.22" } }
Les paramètres name
, version
, author
, repository
, license
et description
sont explicites. La collection bin
est un objet clé/valeur JSON contenant le nom de la commande et un fichier JavaScript associé. Dans notre exemple, la commande man
est associée au fichier man.js
. La collection, dependencies
, contient une liste des packages NPM nécessaires pour utiliser cette application. Dans notre exemple, l'auteur du code a inclus Blessed, une bibliothèque de type curses avec une API d'interface de terminal de haut niveau pour Node.js.
Passons maintenant à la partie principale, le code réel.
#!/usr/bin/env node
Cette partie s'appelle "shebang". Ce n'est pas réellement requis par NodeOS, mais il indique à un système d'exploitation comment exécuter le code suivant. Dans notre cas, il indique à l'interpréteur que tout doit être exécuté avec la commande /usr/bin/env node
.
var fs = require('fs'); var blessed = require('blessed');
Tout comme dans Node.js, la fonction require()
charge le package sélectionné en mémoire et l'enregistre dans la variable spécifiée.
var arg = process.argv[2] || 'bin-man';
Le comportement standard d'une commande man
est d'informer un manuel d'elle-même si aucune autre commande n'est spécifiée. Notre exemple de code fait la même chose : si aucun argument n'est spécifié pour le deuxième paramètre (le premier étant l'homme lui-même), la valeur par défaut est bin-man.
var path = process.env.HOME + "/lib/node_modules/" + arg + "/README.md"; try{ var readme = fs.readFileSync(path, 'utf-8'); }catch(e){ console.log('No README.md for Package ',arg); process.exit(-1); }
À ce stade, le programme vérifie si un fichier Lisez-moi existe pour l'application donnée. Dans NodeOS, le chemin d'installation de chaque application est le répertoire personnel (ou /
) suivi du répertoire lib/node_modules
. Si le fichier README.md
existe, il enregistre son contenu dans la variable readme
. Sinon, il affiche une erreur et quitte le processus.
// Create a screen object. var screen = blessed.screen(); var box = blessed.box({ content: readme, alwaysScroll:true, scrollable: true, }); // Append our box to the screen. screen.append(box);
Blessed a une API vraiment simple ; afficher le contenu d'un fichier est aussi simple que de lui dire de créer une box
et de charger le contenu.
screen.key(['escape', 'q', 'C-c'], function(ch, key) { return process.exit(0); });
Maintenant, créons un moyen de quitter l'application man
. Nous combinons les touches escape
, q
ou la combinaison de style emacs Cc
pour quitter le processus.
screen.key(['space','f','j','n'], function(ch, key) { box.scroll(box.height); screen.render(); }); screen.key(['down'], function(ch, key) { box.scroll(1); screen.render(); }); screen.key(['up'], function(ch, key) { box.scroll(-1); screen.render(); }); screen.key(['b','k','p'], function(ch, key) { box.scroll(-box.height); screen.render(); });
On utilise les touches directionnelles pour faire défiler une ligne vers le haut ou vers le bas et les touches space
, f
, j
ou n
pour faire défiler une page vers le bas (autant de lignes qu'il y en a à l'écran). Utilisez b
, k
ou p
pour faire l'inverse.
box.focus(); screen.render();
Enfin, nous disons à l'application de se concentrer sur la box
que nous avons créée et de rendre le tout. Mettons ces fichiers dans le répertoire /lib/node_modules/bin-man
et ajoutons un simple README.md
, quelque chose comme ceci :
# Man Author: @groundwater ## Install npkg install bin-man ## Usage ``` Usage: man PKGNAME Display a packages README.md file ```
Nous avons presque terminé notre première application personnalisée pour NodeOS. Il ne reste qu'une dernière petite étape ; nous devons créer un fichier de configuration car c'est une exigence pour les applications NodeOS. C'est aussi simple que de créer un fichier dans le chemin /etc/bin-man/config.json
avec le contenu suivant : {}
, un objet JSON vide. Maintenant, nous pouvons essayer notre nouvelle application. Running man
à l'intérieur du shell NodeOS devrait afficher le fichier readme que nous avons créé précédemment.
Conclusion
Comme vous pouvez le voir avec notre exemple de code simple, implémenter quoi que ce soit dans NodeOS est une tâche facile, il vous suffit de connaître Node.js.
NodeOS a beaucoup de potentiel, et je pense qu'il pourrait devenir un excellent système d'exploitation une fois que des fonctionnalités supplémentaires seront implémentées. Il a encore besoin de travail, mais en raison de la popularité de l'ensemble de l'écosystème basé sur Node.js, je ne serais pas surpris s'il devenait rapidement un système d'exploitation populaire. Qu'est-ce que tu en penses? Faites-moi savoir dans les commentaires.