NodeOS: Das JavaScript-basierte Betriebssystem
Veröffentlicht: 2022-03-11Ich bin mir sicher, dass die meisten Programmierer von Node.js gehört haben, aber was ist mit NodeOS? Ja, NodeOS, ein in Node.js geschriebenes Betriebssystem. So in etwa. NodeOS verwendet den Linux-Kernel für die meisten leistungskritischen Dinge wie beispielsweise Hardwareinteraktionen, aber für alles andere verwendet es Node.js. Die NodeOS-Entwicklung begann vor zwei Jahren und wurde von Leuten ins Leben gerufen, die eine einfache, aber faszinierende Idee teilten: „Ist es möglich, ein Betriebssystem nur mit Node.js zu erstellen?“
Was ist die große Sache?
Denken Sie zunächst an die Fortschritte, die Node.js in der kurzen Zeit, in der es existiert, gemacht haben. Denken Sie jetzt an dasselbe, was mit einem Betriebssystem passiert. Dann fügen wir ein paar coole Sachen hinzu.
Benutzerunabhängiges und isoliertes Root-Dateisystem
NodeOS hat ein interessantes Paradigma eingeführt: Wenn alle Benutzer ein isoliertes Dateisystem haben, gibt es ihnen eine einfache Dateisystemhierarchie, mit der sie arbeiten können. Da ihr „Home-Ordner“ tatsächlich das Stammverzeichnis ihrer eigenen Dateisystemhierarchie ist, können sie Pakete global installieren, ohne spezielle Berechtigungen zu benötigen, und müssen nichts konfigurieren, da sie standardmäßig in ihrem Home-Verzeichnis installiert werden. Außerdem bietet es ein gutes Maß an Sicherheit; Wenn ein Hacker einen Weg findet, in ein bestimmtes Konto im Betriebssystem einzudringen, ist die einzige Partition, auf die er/sie zugreifen kann, die Partition dieses Benutzers. Das Endergebnis ist, dass Hacker das gesamte System nicht kompromittieren können.
Node.js und NPM
Wenn Sie darüber nachdenken, bedeutet ein Betriebssystem, das Node.js verwendet, dass jedes in NPM verfügbare Paket gleichzeitig auch ein NodeOS-Paket ist. Zum Zeitpunkt des Schreibens gibt es 210.735 Pakete; Da die Anzahl der NPM-Pakete jede Minute wächst, wäre es nicht verwunderlich, wenn NodeOS in einigen Jahren eine Million Anwendungen haben würde.
Es basiert auf dem Linux-Kernel
Das scheint keine große Sache zu sein, aber Linux ist das am häufigsten verwendete Serverbetriebssystem. Da NodeOS auf dem Linux-Kernel basiert, können Sie jede Anwendung, die für andere Linux-Distributionen geschrieben wurde, mit minimalen Änderungen ausführen.
Die Nachteile
So sehr ich mir ein fertiges NodeOS wünschen würde, es ist noch nicht da. Es fehlen noch viele Schlüsselfunktionen für ein Serverbetriebssystem. Beispielsweise fehlt das gesamte BASH-Toolset, einschließlich ps, tail, nano und grep. Außerdem können Sie es nicht als Desktop-Betriebssystem ausführen, da es keine GUI hat. Sicher, Sie können einige der fehlenden Funktionen ziemlich einfach mit ein wenig JavaScript implementieren, aber die Tatsache, dass alle genannten Funktionen standardmäßig nicht verfügbar sind, ist nicht gut.
Also, wie kann ich NodeOS ausprobieren?
Verwenden von Docker
Der einfachste und schnellste Weg, NodeOS auszuprobieren, ist die Verwendung der folgenden:
- Ein Computer mit Mac OSX oder Linux. Es könnte mit Windows funktionieren, aber ich habe es nicht ausprobiert.
- Docker.
Sobald Sie Docker installiert haben, ist das Ausführen einer Instanz von NodeOS einfach. Alles, was Sie tun müssen, ist den folgenden Befehl auszuführen, und Docker erledigt die ganze Magie:
sudo docker run -t -i nodeos/nodeos
Wenn Sie den oben genannten Befehl ausführen, lädt Docker automatisch das Disk-Image für NodeOS aus einem Repository herunter und führt die Installation von NodeOS in einer virtuellen Maschine durch. Sobald die Installation abgeschlossen ist, öffnet sie eine SSH-Sitzung zur NodeOS-Shell.
Ohne Docker
Es gibt einige Gründe, warum Sie die Verwendung von Docker vermeiden sollten, und einer davon ist die neueste NodeOS-Version. Zum Zeitpunkt des Schreibens wurde die letzte Änderung am Docker-Image von NodeOS vor zwei Monaten durchgeführt, während die Entwicklungsversion vor sechs Tagen aktualisiert wurde. Wenn Sie also die neueste Version verwenden möchten, sollten Sie sich unbedingt den Quellcode besorgen. Das ist nicht allzu schwierig, aber es dauert lange. Du wirst brauchen:
- Ein Computer mit Linux. Sie können es unter OS X kompilieren, aber es dauert länger, da es eine Kreuzkompilierung machen muss. Dasselbe gilt für Windows.
- Die Linux-Build-Dienstprogramme (make, g++, gcc, autoconf).
- Qemu.
- Zeit. Im Ernst, viel.
Sobald Sie alles haben, können Sie mit der Quellcode-Kompilierung fortfahren:
- Laden Sie den Quellcode des Projekts herunter:
bash git clone [email protected]:NodeOS/NodeOS.git
. - Kompilieren Sie es, indem Sie die folgenden Befehle ausführen:
cd NodeOS
undnpm install
. - Ich werde Wort für Wort die offizielle Dokumentation zitieren: „Nimm etwas Mikrowellen-Popcorn und geh ins Kino. Nein, wirklich, tun Sie es.“ . Ja, es wird so lange dauern, also tun Sie in der Zwischenzeit etwas Interessantes.
- Führen Sie
bash npm start
aus, um NodeOS in Qemu auszuführen.
Funktioniert es?
Sobald die Installation abgeschlossen ist, können wir überprüfen, ob sie funktioniert, indem wir in der NodeOS-Shell den Befehl ls
ausführen. Eine Ausgabe wie diese sollte angezeigt werden:
[ 'etc', 'lib', 'lib64', 'root', 'bin', 'sys', 'usr', 'share', 'proc' ]
Wenn dies der Fall ist, bedeutet dies, dass einige grundlegende Befehle funktionieren. Aber was ist, wenn wir die IP-Adresse der Netzwerkkarte anzeigen möchten? Unter Linux gibt es einen Befehl namens ifconfig
, der genau das tut; Lass es uns versuchen:
command not found: ifconfig
Es sieht so aus, als ob der Befehl ifconfig
fehlt. Das liegt daran, dass NodeOS keinen standardmäßigen ifconfig
-Befehl hat. Was jetzt? Nun, es ist einfach; NodeOS hat einen integrierten Paketmanager (wie apt
oder yum
) namens npkg
, der auf Nodes NPM basiert und einfach zu bedienen ist. Die Installation von ifconfig
ist so einfach wie das Ausführen des folgenden Befehls:
npkg install bin-ifconfig
Wenn alles geklappt hat, sollte jetzt der Befehl ifconfig
in der Shell verfügbar sein. Wenn wir versuchen, es erneut auszuführen, wird eine Ausgabe wie diese angezeigt (ich habe aus offensichtlichen Gründen eine zufällige MAC-Adresse und IP-Adresse eingegeben):
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
Wenn Ihre Ausgabe so aussieht, dann funktioniert es. Sie haben Ihre erste NodeOS-Anwendung erfolgreich installiert: ifconfig
.
Es funktioniert. Aber was machen wir jetzt mit dem Betriebssystem?
Was bringt es, ein in Node.js geschriebenes Betriebssystem zu haben, wenn Sie die gleichen (oder sogar weniger) Dinge tun können, die Sie unter Ubuntu oder jeder anderen Linux-Distribution tun können? Nun, der springende Punkt ist, dass alles mit nichts anderem als Node.js entwickelt wird. Das bedeutet auch, dass wir unsere Anwendungen nur mit Node.js entwickeln können. Beispielsweise hat NodeOS keine Standardimplementierung für den Befehl man
, der unter Linux verwendet wird, um Handbuchseiten anderer Befehle anzuzeigen. Keine Angst, die Umsetzung ist einfach. Wie, höre ich Sie fragen? Einfach.

Lassen Sie uns zunächst einen Texteditor namens Hipster installieren, damit wir Dateien erstellen und bearbeiten können, indem Sie den folgenden Befehl ausführen: npm install -g [email protected]
. Dieser Dateieditor ist einfach und definitiv nichts , was ich als Editor für etwas anderes verwenden würde, aber in diesem Fall ist er gut genug. Das Erstellen von Dateien mit Hipster ist wirklich einfach, führen Sie einfach hip filename
filename aus, wie hip package.json
; zum Speichern drücken Ctrl + s
und zum Beenden drücken Ctrl + q
. Für dieses Beispiel werde ich einen Code verwenden, der von einem der wichtigsten NodeOS-Entwickler entwickelt wurde, ich habe ihn nicht selbst implementiert. Den Originalcode für unser Beispiel finden Sie im Git-Repository node-bin-man.
Kehren wir zum Erstellen unserer ersten NodeOS-Anwendung zurück. Wie bei jeder Node.js-Anwendung (oder NPM-Paket) beginnen wir mit der Erstellung einer package.json
-Datei, wie im folgenden Beispiel:
{ "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" } }
Die Parameter name
, version
, author
, repository
, license
und description
sind selbsterklärend. Die bin
-Sammlung ist ein JSON-Schlüssel/Wert-Objekt, das den Befehlsnamen und eine zugehörige JavaScript-Datei enthält. In unserem Beispiel ist der Befehl man
mit der Datei man.js
. Die Sammlung „ dependencies
“ enthält eine Liste der NPM-Pakete, die für die Verwendung dieser Anwendung erforderlich sind. In unserem Beispiel enthielt der Autor des Codes Blessed, eine Curses-ähnliche Bibliothek mit einer High-Level-Terminalschnittstellen-API für Node.js.
Kommen wir nun zum Hauptteil, dem eigentlichen Code.
#!/usr/bin/env node
Dieser Teil wird „shebang“ genannt. Es wird von NodeOS eigentlich nicht benötigt, aber es teilt einem Betriebssystem mit, wie der folgende Code ausgeführt werden soll. In unserem Fall teilt es dem Interpreter mit, dass alles mit dem Befehl /usr/bin/env node
ausgeführt werden muss.
var fs = require('fs'); var blessed = require('blessed');
Genau wie in Node.js lädt die Funktion require()
das ausgewählte Paket in den Speicher und speichert es in der angegebenen Variablen.
var arg = process.argv[2] || 'bin-man';
Das Standardverhalten eines man
-Befehls besteht darin, ein Handbuch über sich selbst zu informieren, wenn kein anderer Befehl angegeben ist. Unser Codebeispiel tut dasselbe: Wenn für den zweiten Parameter kein Argument angegeben ist (der erste ist man selbst), wird standardmäßig bin-man verwendet.
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); }
An dieser Stelle prüft das Programm, ob eine Readme-Datei für die angegebene Anwendung existiert. In NodeOS ist der Installationspfad jeder Anwendung das Home-Verzeichnis (oder /
), gefolgt vom Verzeichnis lib/node_modules
. Wenn die Datei README.md
existiert, speichert sie ihren Inhalt in der Variablen readme
. Andernfalls zeigt es einen Fehler an und beendet den Prozess.
// 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 hat eine wirklich einfache API; Das Anzeigen des Inhalts einer Datei ist so einfach wie das Erstellen einer box
und das Laden des Inhalts.
screen.key(['escape', 'q', 'C-c'], function(ch, key) { return process.exit(0); });
Lassen Sie uns nun eine Möglichkeit schaffen, die man
-Anwendung zu beenden. Wir kombinieren die Tasten escape
, q
oder die Kombination Cc
im Emacs-Stil, um den Prozess zu beenden.
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(); });
Wir verwenden die Richtungstasten, um eine Zeile nach oben oder unten zu scrollen, und die Tasten space
, f
, j
oder n
, um eine Seite nach unten zu scrollen (so viele Zeilen wie auf dem Bildschirm vorhanden sind). Verwenden Sie b
, k
oder p
, um das Gegenteil zu tun.
box.focus(); screen.render();
Schließlich weisen wir die Anwendung an, sich auf die von uns erstellte box
zu konzentrieren und das Ganze zu rendern. Legen wir diese Dateien in das Verzeichnis /lib/node_modules/bin-man
und fügen wir eine einfache README.md
, etwa so:
# Man Author: @groundwater ## Install npkg install bin-man ## Usage ``` Usage: man PKGNAME Display a packages README.md file ```
Wir sind fast fertig mit unserer ersten benutzerdefinierten Anwendung für NodeOS. Es bleibt nur noch ein letzter kleiner Schritt; Wir müssen eine Konfigurationsdatei erstellen, da dies für NodeOS-Anwendungen erforderlich ist. Es ist so einfach wie das Erstellen einer Datei im Pfad /etc/bin-man/config.json
mit folgendem Inhalt: {}
, ein leeres JSON-Objekt. Jetzt können wir unsere neue Anwendung ausprobieren. Wenn man man in der man
-Shell ausführt, sollte die zuvor erstellte Readme-Datei angezeigt werden.
Fazit
Wie Sie an unserem einfachen Codebeispiel sehen können, ist die Implementierung von allem in NodeOS eine einfache Aufgabe, Sie müssen nur Node.js kennen.
NodeOS hat viel Potenzial und ich denke, es könnte ein großartiges Betriebssystem werden, sobald zusätzliche Funktionen implementiert sind. Es braucht noch Arbeit, aber aufgrund der Popularität des gesamten Node.js-basierten Ökosystems wäre ich nicht überrascht, wenn es schnell zu einem beliebten Betriebssystem wird. Was denkst du darüber? Lass es mich in den Kommentaren wissen.