NodeOS: system operacyjny oparty na JavaScript
Opublikowany: 2022-03-11Jestem pewien, że większość programistów słyszała o Node.js, ale co z NodeOS? Tak, NodeOS, system operacyjny napisany w Node.js. Cóż, tak jakby. NodeOS używa jądra Linuksa do większości krytycznych dla wydajności rzeczy, takich jak na przykład interakcje sprzętowe, ale do wszystkiego innego używa Node.js. Rozwój NodeOS rozpoczął się dwa lata temu i został stworzony przez ludzi, którzy podzielili prosty, ale intrygujący pomysł: „Czy można stworzyć system operacyjny przy użyciu samego Node.js?”
Co to jest wielka sprawa?
Przede wszystkim pomyśl o postępie, jaki poczynił Node.js w krótkim czasie. Pomyśl teraz o tym samym, co dzieje się z systemem operacyjnym. Następnie dodajmy do tego kilka fajnych rzeczy.
Niezależny i izolowany główny system plików dla każdego użytkownika
NodeOS wprowadził interesujący paradygmat: jeśli wszyscy użytkownicy mają izolowany system plików, zapewnia im prostą hierarchię systemów plików do pracy. Ponieważ ich „folder domowy” jest w rzeczywistości katalogiem głównym ich własnej hierarchii systemów plików, mogą instalować pakiety globalnie bez konieczności posiadania specjalnych uprawnień i nie muszą niczego konfigurować, ponieważ są one domyślnie instalowane w ich katalogu domowym. Zapewnia również duże bezpieczeństwo; jeśli haker znajdzie sposób na wejście do konkretnego konta w systemie operacyjnym, jedyną partycją, do której ma dostęp, jest partycja tego użytkownika. Efektem końcowym jest to, że haker nie może naruszyć całego systemu.
Node.js i NPM
Jeśli się nad tym zastanowić, system operacyjny wykorzystujący Node.js oznacza, że każdy pakiet dostępny w NPM jest jednocześnie pakietem NodeOS. W chwili pisania tego tekstu istnieje 210 735 paczek; skoro liczba pakietów NPM rośnie z minuty na minutę, nie byłoby dziwne, gdyby za kilka lat NodeOS miał milion aplikacji.
Opiera się na jądrze Linux
To może nie wydawać się wielkim problemem, ale Linux jest najczęściej używanym systemem operacyjnym dla serwerów. Ponieważ NodeOS jest oparty na jądrze Linuksa, możesz uruchomić każdą aplikację napisaną dla innych dystrybucji Linuksa przy minimalnych zmianach.
Wady
O ile chciałbym ukończonego NodeOS, to jeszcze go nie ma. Nadal brakuje wielu kluczowych funkcji dla systemu operacyjnego serwera. Na przykład brakuje całego zestawu narzędzi BASH, w tym ps, tail, nano i grep. Co więcej, nie można go uruchomić jako komputerowego systemu operacyjnego, ponieważ nie ma GUI. Oczywiście, możesz dość łatwo zaimplementować niektóre brakujące funkcje, używając trochę JavaScriptu, ale fakt, że wszystkie wymienione funkcje nie są domyślnie dostępne, nie jest dobry.
Jak więc wypróbować NodeOS?
Korzystanie z Dockera
Najłatwiejszym i najszybszym sposobem wypróbowania NodeOS jest użycie:
- Komputer z systemem Mac OSX lub Linux. Może działać z systemem Windows, ale nie próbowałem.
- Doker.
Po zainstalowaniu Dockera uruchomienie instancji NodeOS jest łatwe. Wszystko, co musisz zrobić, to wykonać następujące polecenie, a Docker wykona całą magię:
sudo docker run -t -i nodeos/nodeos
Po uruchomieniu powyższego polecenia Docker automatycznie pobiera obraz dysku dla NodeOS z repozytorium i wykonuje instalację NodeOS na maszynie wirtualnej. Po zakończeniu instalacji otwiera sesję SSH w powłoce NodeOS.
Bez dokera
Jest kilka powodów, dla których chciałbyś uniknąć korzystania z Dockera, a jednym z nich jest najnowsza wersja NodeOS. W chwili pisania tego tekstu ostatnia zmiana obrazu Dockera w NodeOS została przeprowadzona dwa miesiące temu, podczas gdy wersja rozwojowa została zaktualizowana sześć dni temu. Tak więc, jeśli chcesz korzystać z najnowszej wersji, zdecydowanie powinieneś otrzymać kod źródłowy. Nie jest to trudne, ale zajmuje dużo czasu. Będziesz potrzebować:
- Komputer z Linuksem. Możesz go skompilować na OS X, ale zajmie to więcej czasu, ponieważ musi wykonać kompilację krzyżową. To samo dotyczy systemu Windows.
- Narzędzia do budowania Linuksa (make, g++, gcc, autoconf).
- Qemu.
- Czas. Poważnie, dużo.
Gdy już masz wszystko, możesz przystąpić do kompilacji kodu źródłowego:
- Pobierz kod źródłowy projektu:
bash git clone [email protected]:NodeOS/NodeOS.git
. - Skompiluj go, uruchamiając następujące polecenia:
cd NodeOS
inpm install
. - Zacytuję słowo po słowie oficjalną dokumentację: „Zbierz trochę popcornu do mikrofali i idź obejrzeć film. Nie, naprawdę, zrób to. . Tak, zajmie to tyle czasu, więc w międzyczasie zrób coś ciekawego.
- Uruchom
bash npm start
, aby uruchomić NodeOS w Qemu.
Czy to działa?
Po zakończeniu instalacji możemy sprawdzić, czy działa, wykonując w powłoce NodeOS polecenie ls
. Powinien pojawić się taki wynik:
[ 'etc', 'lib', 'lib64', 'root', 'bin', 'sys', 'usr', 'share', 'proc' ]
Jeśli tak, oznacza to, że działają niektóre podstawowe polecenia. Ale co, jeśli chcemy wyświetlić adres IP karty sieciowej? W Linuksie istnieje polecenie o nazwie ifconfig
, które właśnie to robi; Spróbujmy:
command not found: ifconfig
Wygląda na to, że brakuje polecenia ifconfig
. Dzieje się tak, ponieważ NodeOS nie ma domyślnego polecenia ifconfig
. Co teraz? Cóż, to jest proste; NodeOS ma zintegrowanego menedżera pakietów (takiego jak apt
lub yum
), o nazwie npkg
, który jest oparty na NPM Node i jest łatwy w użyciu. Instalacja ifconfig
jest tak prosta, jak uruchomienie następującego polecenia:
npkg install bin-ifconfig
Jeśli wszystko poszło dobrze, polecenie ifconfig
powinno być teraz dostępne w powłoce. Jeśli spróbujemy wykonać go ponownie, pojawi się taki wynik (z oczywistych powodów wstawiam losowy adres MAC i adres IP):
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
Jeśli twoje wyjście wygląda tak, to działa. Pomyślnie zainstalowałeś swoją pierwszą aplikację NodeOS: ifconfig
.
To działa. Co jednak teraz zrobimy z systemem operacyjnym?
Jaki jest sens posiadania systemu operacyjnego napisanego w Node.js, jeśli możesz robić to samo (lub nawet mniej), co na Ubuntu lub dowolnej innej dystrybucji Linuksa? Cóż, chodzi o to, że wszystko jest rozwijane przy użyciu tylko Node.js. Oznacza to również, że możemy tworzyć nasze aplikacje przy użyciu wyłącznie Node.js. Na przykład NodeOS nie ma domyślnej implementacji polecenia man
, które jest używane w systemie Linux do wyświetlania stron podręcznika innych poleceń. Nie obawiaj się, wdrożenie go jest łatwe. Jak, słyszę, jak pytasz? Prosty.

Najpierw zainstalujmy edytor tekstu o nazwie Hipster, abyśmy mogli tworzyć i edytować pliki, wykonując następujące polecenie: npm install -g [email protected]
. Ten edytor plików jest prosty i zdecydowanie nie jest czymś, czego użyłbym jako edytor do czegokolwiek innego, ale w tym przypadku jest wystarczająco dobry. Tworzenie plików za pomocą Hipstera jest naprawdę proste, wystarczy uruchomić hip filename
, np. hip package.json
; aby zapisać naciśnij Ctrl + s
i aby wyjść naciśnij Ctrl + q
. W tym przykładzie użyję kodu opracowanego przez jednego z głównych programistów NodeOS, sam go nie zaimplementowałem. Oryginalny kod naszego przykładu można znaleźć w repozytorium Git node-bin-man.
Wróćmy do stworzenia naszej pierwszej aplikacji NodeOS. Jak w przypadku każdej aplikacji Node.js (lub pakietu NPM), zaczynamy od utworzenia pliku package.json
, jak w poniższym przykładzie:
{ "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" } }
Parametry name
, version
, author
, repository
, license
i description
nie wymagają wyjaśnień. Kolekcja bin
to obiekt klucz/wartość JSON zawierający nazwę polecenia i powiązany plik JavaScript. W naszym przykładzie polecenie man
jest powiązane z plikiem man.js
. Kolekcja dependencies
zawiera listę pakietów NPM potrzebnych do korzystania z tej aplikacji. W naszym przykładzie autor kodu zawarł Błogosławioną, podobną do curses bibliotekę z interfejsem API wysokiego poziomu dla Node.js.
Przejdźmy teraz do głównej części, aktualnego kodu.
#!/usr/bin/env node
Ta część nazywa się „shebang”. W rzeczywistości nie jest to wymagane przez NodeOS, ale mówi systemowi operacyjnemu, jak wykonać następujący kod. W naszym przypadku mówi interpreterowi, że wszystko musi zostać wykonane za pomocą polecenia /usr/bin/env node
.
var fs = require('fs'); var blessed = require('blessed');
Podobnie jak w Node.js, funkcja require()
ładuje wybrany pakiet do pamięci i zapisuje go w określonej zmiennej.
var arg = process.argv[2] || 'bin-man';
Standardowym zachowaniem polecenia man
jest poinformowanie podręcznika o sobie, jeśli nie podano innego polecenia. Nasz przykład kodu robi to samo: jeśli nie podano argumentu dla drugiego parametru (pierwszy to sam man), domyślnie jest to 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); }
W tym momencie program sprawdza, czy dla danej aplikacji istnieje plik readme. W NodeOS ścieżką instalacji każdej aplikacji jest katalog domowy (lub /
), po którym następuje katalog lib/node_modules
. Jeśli plik README.md
istnieje, zapisuje swoją zawartość wewnątrz zmiennej readme
. W przeciwnym razie pokazuje błąd i kończy 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);
Błogosławiony ma naprawdę proste API; pokazanie zawartości pliku jest tak proste, jak polecenie utworzenia box
i wczytanie zawartości.
screen.key(['escape', 'q', 'C-c'], function(ch, key) { return process.exit(0); });
Teraz stwórzmy sposób na wyjście z aplikacji man
. Łączymy klawisze escape
, q
lub kombinację Cc
w stylu emacsa, aby zakończyć 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(); });
Używamy klawiszy kierunkowych do przewijania w górę lub w dół o jeden wiersz, a klawiszy space
, f
, j
lub n
do przewijania strony w dół (tyle wierszy, ile jest na ekranie). Użyj b
, k
lub p
, aby wykonać odwrotną procedurę.
box.focus(); screen.render();
Na koniec mówimy aplikacji, aby skupiła się na stworzonym przez nas box
i wyrenderowała całość. Umieśćmy te pliki w katalogu /lib/node_modules/bin-man
i dodajmy prosty README.md
, coś takiego:
# Man Author: @groundwater ## Install npkg install bin-man ## Usage ``` Usage: man PKGNAME Display a packages README.md file ```
Prawie skończyliśmy z naszą pierwszą niestandardową aplikacją dla NodeOS. Pozostaje tylko ostatni mały krok; musimy utworzyć plik konfiguracyjny, ponieważ jest to wymagane dla aplikacji NodeOS. Wystarczy utworzyć plik w ścieżce /etc/bin-man/config.json
o następującej treści: {}
, pusty obiekt JSON. Teraz możemy wypróbować naszą nową aplikację. Uruchomienie man
w powłoce NodeOS powinno pokazać utworzony wcześniej plik readme.
Wniosek
Jak widać na naszym prostym przykładzie kodu, implementacja czegokolwiek w NodeOS jest łatwym zadaniem, wystarczy znać Node.js.
NodeOS ma duży potencjał i myślę, że może stać się świetnym systemem operacyjnym po zaimplementowaniu dodatkowych funkcji. Nadal wymaga pracy, ale w związku z popularnością całego ekosystemu opartego na Node.js nie zdziwiłbym się, gdyby szybko stał się popularnym systemem operacyjnym. Co o tym myślisz? Daj znać w komentarzach.