NodeOS: il sistema operativo basato su JavaScript

Pubblicato: 2022-03-11

Sono sicuro che la maggior parte dei programmatori ha sentito parlare di Node.js, ma per quanto riguarda NodeOS? Sì, NodeOS, un sistema operativo scritto in Node.js. Beh, tipo. NodeOS utilizza il kernel Linux per la maggior parte delle cose critiche per le prestazioni come, ad esempio, le interazioni hardware, ma per tutto il resto usa Node.js. Lo sviluppo di NodeOS è iniziato due anni fa ed è stato creato da persone che condividevano un'idea semplice, ma intrigante: "È possibile creare un sistema operativo utilizzando solo Node.js?"

La carta evolutiva di Darwin

È possibile creare un sistema operativo utilizzando solo Node.js?
Twitta

qual'e il problema?

Prima di tutto, pensa ai progressi che Node.js ha fatto nel breve tempo in cui è stato disponibile. Ora, pensa alla stessa cosa che accade con un sistema operativo. Quindi, aggiungiamo alcune cose interessanti.

Filesystem radice per utente indipendente e isolato

NodeOS ha introdotto un paradigma interessante: se tutti gli utenti hanno un filesystem isolato, fornisce loro una semplice gerarchia di filesystem con cui lavorare. Poiché la loro "cartella home" è, in effetti, la radice della propria gerarchia di filesystem, possono installare pacchetti a livello globale senza richiedere permessi speciali e non hanno bisogno di configurare nulla poiché sono installati nella loro directory home per impostazione predefinita. Inoltre, fornisce una buona dose di sicurezza; se un hacker trova un modo per entrare in un particolare account nel sistema operativo, l'unica partizione a cui può accedere è la partizione di quell'utente. Il risultato finale è che l'hacker non può compromettere l'intero sistema.

Node.js e NPM

Se ci pensi, un sistema operativo che utilizza Node.js significa che qualsiasi pacchetto disponibile in NPM è, allo stesso tempo, anche un pacchetto NodeOS. Al momento in cui scrivo, i pacchetti sono 210.735; dato che il numero di pacchetti NPM cresce ogni minuto, non sarebbe strano se, in pochi anni, NodeOS avesse un milione di applicazioni.

Si basa sul kernel Linux

Potrebbe non sembrare un grosso problema, ma Linux è il sistema operativo per server più utilizzato. Poiché NodeOS è basato sul kernel Linux, puoi eseguire ogni applicazione scritta per altre distribuzioni Linux con modifiche minime.

Gli svantaggi

Per quanto mi piacerebbe un NodeOS finito, non è ancora lì. Mancano ancora molte funzioni chiave per un sistema operativo server. Ad esempio, manca l'intero set di strumenti BASH, inclusi ps, tail, nano e grep. Inoltre, non è possibile eseguirlo come sistema operativo desktop poiché non ha la GUI. Certo, puoi implementare alcune delle funzionalità mancanti abbastanza facilmente usando un po' di JavaScript, ma il fatto che tutte le funzionalità menzionate non siano disponibili per impostazione predefinita, non va bene.

Quindi, come posso provare NodeOS?

Utilizzando Docker

Il modo più semplice e veloce per provare NodeOS è utilizzare quanto segue:

  1. Un computer con Mac OSX o Linux. Potrebbe funzionare con Windows, ma non l'ho provato.
  2. Docker.

Dopo aver installato Docker, eseguire un'istanza di NodeOS è facile. Tutto quello che devi fare è eseguire il seguente comando e Docker fa tutta la magia:

 sudo docker run -t -i nodeos/nodeos 

Il modo più semplice e veloce per provare NodeOS è utilizzare Docker

Il modo più semplice e veloce per provare NodeOS è utilizzare Docker.
Twitta

Quando esegui il comando di cui sopra, Docker scarica automaticamente l'immagine del disco per NodeOS da un repository ed esegue l'installazione di NodeOS all'interno di una macchina virtuale. Una volta completata l'installazione, si apre una sessione SSH sulla shell di NodeOS.

Senza docking station

Ci sono alcuni motivi per cui dovresti evitare di usare Docker e uno è l'ultima versione di NodeOS. Nel momento in cui scriviamo, l'ultima modifica all'immagine Docker di NodeOS è stata eseguita due mesi fa, mentre la versione di sviluppo è stata aggiornata sei giorni fa. Quindi, se vuoi usare l'ultima versione, dovresti assolutamente ottenere il codice sorgente. Non è troppo difficile, ma ci vuole molto tempo. Avrai bisogno:

  1. Un computer con Linux. Puoi compilarlo su OS X, ma ci vorrà più tempo poiché deve fare una compilazione incrociata. Lo stesso vale per Windows.
  2. Le utilità di compilazione di Linux (make, g++, gcc, autoconf).
  3. Qemu.
  4. Volta. Seriamente, molto.

Una volta che hai tutto, puoi procedere con la compilazione del codice sorgente:

  1. Scarica il codice sorgente del progetto: bash git clone [email protected]:NodeOS/NodeOS.git .
  2. Compilalo eseguendo i seguenti comandi: cd NodeOS e npm install .
  3. Citerò, parola per parola, la documentazione ufficiale: “Prendi dei popcorn al microonde e vai a vedere un film. No, davvero, fallo". . Sì, ci vorrà così tanto tempo, quindi nel frattempo fai qualcosa di interessante.
  4. Esegui bash npm start per eseguire NodeOS all'interno di Qemu.

Funziona?

Una volta completata l'installazione, possiamo verificare se funziona eseguendo all'interno della shell di NodeOS il comando ls . Dovrebbe apparire un output come questo:

 [ 'etc', 'lib', 'lib64', 'root', 'bin', 'sys', 'usr', 'share', 'proc' ]

Se lo fa, significa che alcuni comandi di base stanno funzionando. Ma cosa succede se vogliamo visualizzare l'indirizzo IP della scheda di rete? Sotto Linux, c'è un comando chiamato ifconfig che fa proprio questo; Proviamolo:

 command not found: ifconfig

Sembra che manchi il comando ifconfig . Questo perché NodeOS non ha un comando ifconfig predefinito. Ora, cosa? Bene, è semplice; NodeOS ha un gestore di pacchetti integrato (come apt o yum ), chiamato npkg , che si basa sull'NPM di Node ed è facile da usare. Installare ifconfig è semplice come eseguire il comando seguente:

 npkg install bin-ifconfig

Se tutto è andato bene, il comando ifconfig dovrebbe ora essere disponibile nella shell. Se proviamo a eseguirlo di nuovo, viene visualizzato un output come questo (ho inserito un indirizzo MAC e un indirizzo IP casuali per ovvi motivi):

 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

Se il tuo output è simile a quello, allora funziona. Hai installato con successo la tua prima applicazione NodeOS: ifconfig .

Funziona. Tuttavia, cosa facciamo ora con il sistema operativo?

Che senso ha avere un sistema operativo scritto in Node.js se puoi fare le stesse cose (o anche meno cose) che puoi fare su Ubuntu o qualsiasi altra distribuzione Linux? Bene, il punto è che tutto viene sviluppato utilizzando nient'altro che Node.js. Significa anche che possiamo sviluppare le nostre applicazioni utilizzando nient'altro che Node.js. Ad esempio, NodeOS non ha un'implementazione predefinita per il comando man , che viene utilizzato su Linux per visualizzare le pagine di manuale di altri comandi. Non temere, implementarlo è facile. Come, ti sento chiedere? Semplice.

Creazione di un'applicazione NodeOS con Node.js

Innanzitutto, installiamo un editor di testo chiamato Hipster in modo da poter creare e modificare file eseguendo il seguente comando: npm install -g [email protected] . Questo editor di file è semplice e sicuramente non è qualcosa che userei come editor per qualcos'altro, ma in questo caso è abbastanza buono. Creare file con Hipster è davvero semplice, basta eseguire hip filename , come hip package.json ; per salvare premere Ctrl + s e per uscire premere Ctrl + q . Per questo esempio userò un codice sviluppato da uno dei principali sviluppatori NodeOS, non l'ho implementato io stesso. Il codice originale per il nostro esempio può essere trovato nel repository Git node-bin-man.

Torniamo alla creazione della nostra prima applicazione NodeOS. Come per ogni applicazione Node.js (o pacchetto NPM), iniziamo creando un file package.json , come nell'esempio seguente:

 { "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" } }

I parametri name , version , author , repository , license e description sono autoesplicativi. La raccolta bin è un oggetto chiave/valore JSON contenente il nome del comando e un file JavaScript associato. Nel nostro esempio, il comando man è associato al file man.js . La raccolta, dependencies , contiene un elenco di pacchetti NPM necessari per utilizzare questa applicazione. Nel nostro esempio, l'autore del codice includeva Blessed, una libreria simile a curses con un'API di interfaccia terminale di alto livello per Node.js.

Ora andiamo alla parte principale, il codice vero e proprio.

 #!/usr/bin/env node

Questa parte è chiamata "shebang". In realtà non è richiesto da NodeOS, ma indica a un sistema operativo come eseguire il codice seguente. Nel nostro caso, dice all'interprete che tutto deve essere eseguito con il comando /usr/bin/env node .

 var fs = require('fs'); var blessed = require('blessed');

Proprio come in Node.js, la funzione require() carica il pacchetto selezionato in memoria e lo salva nella variabile specificata.

 var arg = process.argv[2] || 'bin-man';

Il comportamento standard di un comando man è raccontare un manuale su se stesso se non viene specificato nessun altro comando. Il nostro esempio di codice sta facendo lo stesso: se non viene specificato alcun argomento per il secondo parametro (il primo è man stesso), il valore predefinito è 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); }

A questo punto, il programma verifica se esiste un file readme per l'applicazione specificata. In NodeOS, il percorso di installazione di ogni applicazione è la home directory (o / ) seguita dalla directory lib/node_modules . Se il file README.md esiste, ne salva il contenuto all'interno della variabile readme . In caso contrario, mostra un errore ed esce dal processo.

 // 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);

Benedetto ha un'API davvero semplice; mostrare il contenuto di un file è facile come dirgli di creare una box e caricare il contenuto.

 screen.key(['escape', 'q', 'C-c'], function(ch, key) { return process.exit(0); });

Ora creiamo un modo per uscire dall'applicazione man . Combiniamo i tasti escape , q o la combinazione in stile emacs Cc per uscire dal processo.

 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(); });

Usiamo i tasti direzionali per scorrere una riga in alto o in basso e i tasti space , f , j o n per scorrere una pagina in basso (tante righe quante sono sullo schermo). Utilizzare b , k o p per fare il contrario.

 box.focus(); screen.render();

Infine, diciamo all'applicazione di concentrarsi sulla box che abbiamo creato e renderizzare l'intera cosa. Mettiamo quei file nella directory /lib/node_modules/bin-man e aggiungiamo un semplice README.md , qualcosa del genere:

 # Man Author: @groundwater ## Install npkg install bin-man ## Usage ``` Usage: man PKGNAME Display a packages README.md file ```

Abbiamo quasi finito con la nostra prima applicazione personalizzata per NodeOS. Rimane solo un ultimo piccolo passo; dobbiamo creare un file di configurazione poiché è un requisito per le applicazioni NodeOS. È semplice come creare un file nel percorso /etc/bin-man/config.json con il seguente contenuto: {} , un oggetto JSON vuoto. Ora possiamo provare la nostra nuova applicazione. L'esecuzione man all'interno della shell di NodeOS dovrebbe mostrare il file readme che abbiamo creato in precedenza.

Conclusione

Come puoi vedere con il nostro semplice esempio di codice, implementare qualsiasi cosa in NodeOS è un compito facile, devi solo conoscere Node.js.

NodeOS ha un sacco di potenziale e penso che potrebbe diventare un ottimo sistema operativo una volta implementate funzionalità aggiuntive. Ha ancora bisogno di lavoro, ma a causa della popolarità dell'intero ecosistema basato su Node.js, non sarei sorpreso se diventasse rapidamente un sistema operativo popolare. Cosa ne pensi? Fatemi sapere nei commenti.