NodeOS: Sistemul de operare bazat pe JavaScript

Publicat: 2022-03-11

Sunt sigur că majoritatea programatorilor au auzit de Node.js, dar cum rămâne cu NodeOS? Da, NodeOS, un sistem de operare scris în Node.js. Ceva de genul. NodeOS folosește nucleul Linux pentru majoritatea lucrurilor critice de performanță, cum ar fi, de exemplu, interacțiuni hardware, dar pentru orice altceva folosește Node.js. Dezvoltarea NodeOS a început în urmă cu doi ani și a fost creată de oameni care au împărtășit o idee simplă, dar intrigantă: „Este posibil să creezi un sistem de operare folosind doar Node.js?”

Diagrama de evoluție a lui Darwin

Este posibil să creați un sistem de operare folosind numai Node.js?
Tweet

Care este mare lucru?

În primul rând, gândiți-vă la progresul pe care l-a făcut Node.js în scurtul timp în care există. Acum, gândiți-vă la același lucru care se întâmplă cu un sistem de operare. Apoi, hai să adăugăm niște chestii cool.

Sistem de fișiere rădăcină independent și izolat pentru fiecare utilizator

NodeOS a introdus o paradigmă interesantă: dacă toți utilizatorii au un sistem de fișiere izolat, le oferă o ierarhie simplă a sistemului de fișiere cu care să lucreze. Deoarece „dosarul lor de acasă” este, de fapt, rădăcina propriei ierarhii a sistemului de fișiere, ei pot instala pachete la nivel global fără a necesita permisiuni speciale și nu trebuie să configureze nimic, deoarece sunt instalate implicit în directorul lor principal. De asemenea, oferă o bună cantitate de securitate; dacă un hacker găsește o modalitate de a intra într-un anumit cont în sistemul de operare, singura partiție pe care o poate accesa este partiția acelui utilizator. Rezultatul final este că hackerul nu poate compromite întregul sistem.

Node.js și NPM

Dacă te gândești bine, un sistem de operare care folosește Node.js înseamnă că orice pachet disponibil în NPM este, în același timp, și un pachet NodeOS. La momentul redactării acestui articol, există 210.735 de pachete; întrucât numărul pachetelor NPM crește în fiecare minut, nu ar fi ciudat dacă, în câțiva ani, NodeOS are un milion de aplicații.

Se bazează pe nucleul Linux

S-ar putea să nu pară mare lucru, dar Linux este cel mai folosit sistem de operare pentru server. Deoarece NodeOS se bazează pe nucleul Linux, puteți rula orice aplicație scrisă pentru alte distribuții Linux cu modificări minime.

Dezavantajele

Oricât de mult mi-aș dori un NodeOS terminat, nu există încă. Încă îi lipsesc multe funcții cheie pentru un sistem de operare server. De exemplu, lipsește întregul set de instrumente BASH, inclusiv ps, tail, nano și grep. În plus, nu îl puteți rula ca sistem de operare desktop, deoarece nu are GUI. Sigur, puteți implementa unele dintre caracteristicile lipsă destul de ușor folosind un pic de JavaScript, dar faptul că toate caracteristicile menționate nu sunt disponibile implicit, nu este bine.

Deci, cum pot încerca NodeOS?

Folosind Docker

Cel mai simplu și rapid mod de a încerca NodeOS este să utilizați următoarele:

  1. Un computer cu Mac OSX sau Linux. S-ar putea să funcționeze cu Windows, dar nu am încercat.
  2. Docher.

Odată ce ați instalat Docker, rularea unei instanțe a NodeOS este ușoară. Tot ce trebuie să faceți este să executați următoarea comandă, iar Docker face toată magia:

 sudo docker run -t -i nodeos/nodeos 

Cel mai simplu și rapid mod de a încerca NodeOS este folosirea Docker

Cel mai simplu și rapid mod de a încerca NodeOS este folosirea Docker.
Tweet

Când rulați comanda menționată mai sus, Docker descarcă automat imaginea de disc pentru NodeOS dintr-un depozit și efectuează instalarea NodeOS într-o mașină virtuală. Odată ce instalarea este finalizată, deschide o sesiune SSH în shell-ul NodeOS.

Fără docker

Există câteva motive pentru care ați dori să evitați utilizarea Docker, iar unul este cea mai recentă versiune NodeOS. La momentul redactării acestui articol, ultima modificare a imaginii Docker a NodeOS a fost efectuată în urmă cu două luni, în timp ce versiunea de dezvoltare a fost actualizată în urmă cu șase zile. Deci, dacă doriți să utilizați cea mai recentă versiune, cu siguranță ar trebui să obțineți codul sursă. Nu este prea greu, dar durează mult. Vei avea nevoie:

  1. Un computer cu Linux. Îl puteți compila pe OS X, dar va dura mai mult deoarece trebuie să facă o compilare încrucișată. Același lucru este valabil și pentru Windows.
  2. Utilitare de compilare Linux (make, g++, gcc, autoconf).
  3. Qemu.
  4. Timp. Serios, multe.

După ce aveți totul, puteți continua cu compilarea codului sursă:

  1. Descărcați codul sursă al proiectului: bash git clone [email protected]:NodeOS/NodeOS.git .
  2. Compilați-l rulând următoarele comenzi: cd NodeOS și npm install .
  3. Am să citez, cuvânt cu cuvânt, documentația oficială: „Alege niște floricele de porumb la microunde și mergi să vezi un film. Nu, într-adevăr, fă-o.” . Da, va dura atât de mult timp, așa că fă ceva interesant între timp.
  4. Rulați bash npm start pentru a rula NodeOS în Qemu.

Functioneaza?

Odată finalizată instalarea, putem verifica dacă funcționează executând în interiorul shell-ului NodeOS comanda ls . O ieșire ca aceasta ar trebui să apară:

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

Dacă o face, înseamnă că unele comenzi de bază funcționează. Dar dacă vrem să afișăm adresa IP a plăcii de rețea? Sub Linux, există o comandă numită ifconfig care face exact asta; Hai sa incercam:

 command not found: ifconfig

Se pare că comanda ifconfig lipsește. Asta pentru că NodeOS nu are o comandă implicită ifconfig . Acum ce? Ei bine, este simplu; NodeOS are un manager de pachete integrat (cum ar fi apt sau yum ), numit npkg , care se bazează pe NPM-ul Node și este ușor de utilizat. Instalarea ifconfig este la fel de simplă ca și rularea următoarei comenzi:

 npkg install bin-ifconfig

Dacă totul a mers bine, comanda ifconfig ar trebui să fie acum disponibilă în shell. Dacă încercăm să o executăm din nou, apare o ieșire ca aceasta (am pus o adresă MAC aleatorie și o adresă IP din motive evidente):

 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

Dacă rezultatul dvs. arată cam așa, atunci funcționează. Ați instalat cu succes prima aplicație NodeOS: ifconfig .

Functioneaza. Totuși, ce facem acum cu sistemul de operare?

Ce rost are să ai un sistem de operare scris în Node.js dacă poți face aceleași lucruri (sau chiar mai puține lucruri) pe care le poți face pe Ubuntu sau orice altă distribuție Linux? Ei bine, ideea este că totul este dezvoltat folosind nimic mai mult decât Node.js. De asemenea, înseamnă că ne putem dezvolta aplicațiile folosind nimic mai mult decât Node.js. De exemplu, NodeOS nu are o implementare implicită pentru comanda man , care este folosită pe Linux pentru a afișa paginile manuale ale altor comenzi. Nu vă temeți, implementarea ei este ușoară. Cum, am auzit că întrebi? Simplu.

Construirea unei aplicații NodeOS cu Node.js

Mai întâi, să instalăm un editor de text numit Hipster, astfel încât să putem crea și edita fișiere executând următoarea comandă: npm install -g [email protected] . Acest editor de fișiere este simplu și cu siguranță nu este ceva pe care l-aș folosi ca editor pentru orice altceva, dar este suficient de bun în acest caz. Crearea fișierelor cu Hipster este foarte simplă, doar rulați hip filename , cum ar fi hip package.json ; pentru a salva apăsați Ctrl + s și pentru a ieși apăsați Ctrl + q . Pentru acest exemplu, voi folosi un cod dezvoltat de unul dintre principalii dezvoltatori NodeOS, nu l-am implementat eu însumi. Codul original pentru exemplul nostru poate fi găsit în depozitul Git node-bin-man.

Să revenim la crearea primei noastre aplicații NodeOS. Ca și în cazul oricărei aplicații Node.js (sau pachet NPM), începem prin a crea un fișier package.json , ca în exemplul următor:

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

Parametrii name , version , author , repository , license și description se explică de la sine. Colecția bin este un obiect cheie/valoare JSON care conține numele comenzii și un fișier JavaScript asociat. În exemplul nostru, comanda man este asociată cu fișierul man.js . Colecția, dependencies , conține o listă de pachete NPM care sunt necesare pentru a utiliza această aplicație. În exemplul nostru, autorul codului a inclus Blessed, o bibliotecă asemănătoare blestemelor cu un API de interfață terminal de nivel înalt pentru Node.js.

Acum să trecem la partea principală, codul real.

 #!/usr/bin/env node

Această parte se numește „shebang”. De fapt, nu este cerut de NodeOS, dar îi spune unui sistem de operare cum să execute următorul cod. În cazul nostru, îi spune interpretului că totul trebuie să fie executat cu comanda /usr/bin/env node .

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

La fel ca în Node.js, funcția require() încarcă pachetul selectat în memorie și îl salvează în variabila specificată.

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

Comportamentul standard al unei comenzi man este de a spune unui manual despre sine dacă nu este specificată nicio altă comandă. Exemplul nostru de cod procedează la fel: dacă nu este specificat niciun argument pentru al doilea parametru (primul fiind man însuși), acesta este implicit 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); }

În acest moment, programul verifică dacă există un fișier readme pentru aplicația dată. În NodeOS, calea de instalare a fiecărei aplicații este directorul principal (sau / ) urmat de directorul lib/node_modules . Dacă fișierul README.md există, acesta își salvează conținutul în variabila readme . În caz contrar, arată o eroare și iese din proces.

 // 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 are un API foarte simplu; a arăta conținutul unui fișier este la fel de ușor ca să îi spui să creeze o box și să încarce conținutul.

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

Acum, să creăm o modalitate de a părăsi aplicația man . Combinăm tastele escape , q sau combinația în stil emacs Cc pentru a ieși din proces.

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

Folosim tastele direcționale pentru a derula în sus sau în jos un rând și tastele space , f , j sau n pentru a derula în jos o pagină (atâte rânduri sunt pe ecran). Folosiți b , k sau p pentru a face invers.

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

În cele din urmă, îi spunem aplicației să se concentreze pe box pe care am creat-o și să redea totul. Să punem acele fișiere în directorul /lib/node_modules/bin-man și să adăugăm un simplu README.md , cam așa:

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

Aproape am terminat cu prima noastră aplicație personalizată pentru NodeOS. Mai rămâne doar un ultim pas; trebuie să creăm un fișier de configurare, deoarece este o cerință pentru aplicațiile NodeOS. Este la fel de simplu ca și crearea unui fișier în calea /etc/bin-man/config.json cu următorul conținut: {} , un obiect JSON gol. Acum, putem încerca noua noastră aplicație. Rularea man în interiorul shell-ului NodeOS ar trebui să arate fișierul readme pe care l-am creat mai devreme.

Concluzie

După cum puteți vedea cu exemplul nostru de cod simplu, implementarea oricărui lucru în NodeOS este o sarcină ușoară, trebuie doar să cunoașteți Node.js.

NodeOS are o mulțime de potențial și cred că ar putea deveni un sistem de operare grozav odată ce sunt implementate funcții suplimentare. Mai are nevoie de lucru, dar ca urmare a popularității întregului ecosistem bazat pe Node.js, nu m-aș mira dacă va deveni rapid un sistem de operare popular. Ce crezi despre asta? Anunță-mă în comentarii.