NodeOS: JavaScript Tabanlı İşletim Sistemi
Yayınlanan: 2022-03-11Çoğu programcının Node.js'yi duyduğuna eminim, peki ya NodeOS? Evet, NodeOS, Node.js ile yazılmış bir işletim sistemi. Şey, bir nevi. NodeOS, örneğin donanım etkileşimleri gibi performans açısından kritik olan çoğu şey için Linux çekirdeğini kullanır, ancak diğer her şey için Node.js kullanır. NodeOS geliştirmesi iki yıl önce başladı ve basit ama merak uyandıran bir fikri paylaşan kişiler tarafından oluşturuldu: "Yalnızca Node.js kullanarak bir işletim sistemi oluşturmak mümkün mü?"
Önemli olan ne?
Her şeyden önce, Node.js'nin bulunduğu kısa sürede kaydettiği ilerlemeyi düşünün. Şimdi, aynı şeyin bir işletim sistemiyle gerçekleştiğini düşünün. Daha sonra üzerine güzel şeyler ekleyelim.
Kullanıcı başına bağımsız ve yalıtılmış kök dosya sistemi
NodeOS ilginç bir paradigma ortaya koydu: Tüm kullanıcıların yalıtılmış bir dosya sistemi varsa, bu onlara çalışacakları basit bir dosya sistemi hiyerarşisi verir. “Ana klasörleri” aslında kendi dosya sistemi hiyerarşilerinin kökü olduğundan, paketleri özel izinler gerektirmeden global olarak kurabilirler ve varsayılan olarak ana dizinlerine yüklendiklerinden herhangi bir yapılandırmaya ihtiyaç duymazlar. Ayrıca, oldukça fazla güvenlik sağlar; Bir bilgisayar korsanı işletim sistemindeki belirli bir hesaba girmenin bir yolunu bulursa, erişebileceği tek bölüm o kullanıcının bölümüdür. Sonuç olarak, hacker tüm sistemi tehlikeye atamaz.
Node.js ve NPM
Bunu düşünürseniz, Node.js kullanan bir işletim sistemi, NPM'de bulunan herhangi bir paketin aynı zamanda bir NodeOS paketi olduğu anlamına gelir. Yazma sırasında 210.735 paket var; NPM paketlerinin sayısı her dakika arttığından, birkaç yıl içinde NodeOS'un bir milyon uygulaması olması garip olmazdı.
Linux çekirdeğine dayanmaktadır
Bu çok önemli görünmeyebilir, ancak Linux en çok kullanılan sunucu işletim sistemidir. NodeOS, Linux çekirdeğini temel aldığından, diğer Linux dağıtımları için yazılmış her uygulamayı minimum değişiklikle çalıştırabilirsiniz.
Dezavantajları
Bitmiş bir NodeOS'u ne kadar istesem de, henüz orada değil. Bir sunucu işletim sistemi için hala birçok önemli işlevi kaçırıyor. Örneğin, ps, tail, nano ve grep dahil olmak üzere tüm BASH araç seti eksik. Ayrıca, GUI'si olmadığı için masaüstü işletim sistemi olarak çalıştıramazsınız. Elbette, biraz JavaScript kullanarak bazı eksik özellikleri oldukça kolay bir şekilde uygulayabilirsiniz, ancak belirtilen tüm özelliklerin varsayılan olarak mevcut olmaması iyi değil.
Peki, NodeOS'u nasıl deneyebilirim?
Docker'ı kullanma
NodeOS'u denemenin en kolay ve en hızlı yolu aşağıdakileri kullanmaktır:
- Mac OSX veya Linux yüklü bir bilgisayar. Windows ile çalışabilir, ancak denemedim.
- Liman işçisi.
Docker'ı yükledikten sonra, bir NodeOS örneğini çalıştırmak kolaydır. Tek yapmanız gereken aşağıdaki komutu yürütmek ve Docker tüm sihri yapıyor:
sudo docker run -t -i nodeos/nodeos
Yukarıda belirtilen komutu çalıştırdığınızda Docker, NodeOS için disk görüntüsünü bir havuzdan otomatik olarak indirir ve NodeOS kurulumunu sanal bir makine içinde gerçekleştirir. Kurulum tamamlandığında, NodeOS kabuğuna bir SSH oturumu açar.
liman işçisi olmadan
Docker'ı kullanmaktan kaçınmak istemenizin bazı nedenleri vardır ve bunlardan biri en son NodeOS sürümüdür. Yazma sırasında, NodeOS'un Docker görüntüsündeki son değişiklik iki ay önce gerçekleştirilirken, geliştirme sürümü altı gün önce güncellendi. Bu nedenle, en son sürümü kullanmak istiyorsanız kesinlikle kaynak kodunu almalısınız. Bu çok zor değil, ama uzun zaman alıyor. İhtiyacın olacak:
- Linux'lu bir bilgisayar. OS X'te derleyebilirsiniz, ancak çapraz derleme yapması gerektiğinden daha uzun sürer. Aynı şey Windows için de geçerli.
- Linux derleme yardımcı programları (make, g++, gcc, autoconf).
- Kemu.
- Zaman. Cidden, çok.
Her şeye sahip olduğunuzda, kaynak kod derlemesine devam edebilirsiniz:
- Proje kaynak kodunu indirin:
bash git clone [email protected]:NodeOS/NodeOS.git
. - Aşağıdaki komutları çalıştırarak derleyin:
cd NodeOS
venpm install
. - Resmi belgelerden kelimesi kelimesine alıntı yapacağım: "Biraz mikrodalgada patlamış mısır al ve bir film izlemeye git. Hayır, gerçekten, yap." . Evet, o kadar zaman alacak, o yüzden bu arada ilginç bir şeyler yap.
- NodeOS'u Qemu içinde çalıştırmak için
bash npm start
çalıştırın.
Çalışıyormu?
Kurulum tamamlandıktan sonra, NodeOS kabuğunun içinde ls
komutunu çalıştırarak çalışıp çalışmadığını kontrol edebiliriz. Bunun gibi bir çıktı görünmelidir:
[ 'etc', 'lib', 'lib64', 'root', 'bin', 'sys', 'usr', 'share', 'proc' ]
Varsa, bazı temel komutların çalıştığı anlamına gelir. Ancak, ağ kartının IP adresini görüntülemek istersek ne olur? Linux altında ifconfig
adında ve tam da bunu yapan bir komut vardır; Hadi deneyelim:
command not found: ifconfig
ifconfig
komutu eksik gibi görünüyor. Bunun nedeni, NodeOS'un varsayılan bir ifconfig
komutuna sahip olmamasıdır. Şimdi ne olacak? Eh, bu basit; NodeOS, npkg
temel alan ve kullanımı kolay npkg adlı entegre bir paket yöneticisine ( apt
veya yum
gibi) sahiptir. ifconfig
yüklemek, aşağıdaki komutu çalıştırmak kadar basittir:
npkg install bin-ifconfig
Her şey yolunda giderse, ifconfig
komutu artık kabukta mevcut olmalıdır. Tekrar çalıştırmayı denersek, şöyle bir çıktı ortaya çıkıyor (bariz sebeplerden dolayı rastgele bir MAC adresi ve IP adresi koydum):
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
Çıktınız buna benziyorsa, o zaman çalışıyor. İlk NodeOS uygulamanızı başarıyla yüklediniz: ifconfig
.
Çalışıyor. Ancak, şimdi işletim sistemi ile ne yapıyoruz?
Ubuntu'da veya başka herhangi bir Linux dağıtımında yapabileceğiniz aynı şeyleri (veya daha az şeyi) yapabiliyorsanız, Node.js'de yazılmış bir işletim sistemine sahip olmanın anlamı nedir? Bütün mesele şu ki, her şey Node.js'den başka bir şey kullanılarak geliştirilmiyor. Ayrıca uygulamalarımızı Node.js'den başka bir şey kullanmadan geliştirebileceğimiz anlamına gelir. Örneğin, NodeOS, Linux'ta diğer komutların manuel sayfalarını görüntülemek için kullanılan man
komutu için varsayılan bir uygulamaya sahip değildir. Korkmayın, uygulamak kolaydır. Nasıl, sorduğunu duydum? Basit.

İlk olarak, Hipster adlı bir metin düzenleyici kuralım, böylece aşağıdaki komutu yürüterek dosyaları oluşturup düzenleyebiliriz: npm install -g [email protected]
. Bu dosya düzenleyici basit ve kesinlikle başka bir şey için düzenleyici olarak kullanacağım bir şey değil, ancak bu durumda yeterince iyi. Hipster ile dosya oluşturmak gerçekten basittir, sadece hip package.json
hip filename
dosyasını çalıştırın; kaydetmek için Ctrl + s
basın ve çıkmak için Ctrl + q
basın. Bu örnek için, ana NodeOS geliştiricilerinden biri tarafından geliştirilen bir kodu kullanacağım, aslında kendim uygulamadım. Örneğimizin orijinal kodu node-bin-man Git deposunda bulunabilir.
İlk NodeOS uygulamamızı oluşturmaya geri dönelim. Her Node.js uygulamasında (veya NPM paketinde) olduğu gibi, aşağıdaki örnekte olduğu gibi bir package.json
dosyası oluşturarak başlıyoruz:
{ "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" } }
name
, version
, author
, repository
, license
ve description
parametreleri kendiliğinden açıklayıcıdır. bin
koleksiyonu, komut adını ve ilişkili bir JavaScript dosyasını içeren bir JSON anahtar/değer nesnesidir. Örneğimizde man
komutu, man.js
dosyasıyla ilişkilendirilmiştir. Koleksiyon, dependencies
, bu uygulamayı kullanmak için gereken NPM paketlerinin bir listesini içerir. Örneğimizde, kodun yazarı, Node.js için üst düzey bir terminal arayüzü API'sine sahip, lanetlere benzer bir kitaplık olan Blessed'i içeriyordu.
Şimdi asıl kısma, asıl koda geçelim.
#!/usr/bin/env node
Bu kısma “şebang” denir. Aslında NodeOS tarafından gerekli değildir, ancak bir işletim sistemine aşağıdaki kodu nasıl çalıştıracağını söyler. Bizim durumumuzda, yorumlayıcıya her şeyin /usr/bin/env node
komutuyla yürütülmesi gerektiğini söyler.
var fs = require('fs'); var blessed = require('blessed');
Node.js'de olduğu gibi, request require()
işlevi seçilen paketi belleğe yükler ve belirtilen değişkene kaydeder.
var arg = process.argv[2] || 'bin-man';
Bir man
komutunun standart davranışı, başka bir komut belirtilmemişse bir kılavuza kendisi hakkında bilgi vermektir. Bizim kod örneğimiz de aynı şeyi yapıyor: İkinci parametre için (birincisi man'ın kendisidir) herhangi bir argüman belirtilmemişse, varsayılan olarak bin-man olur.
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); }
Bu noktada program, verilen uygulama için bir benioku dosyası olup olmadığını kontrol eder. NodeOS'ta, her uygulamanın kurulum yolu ana dizindir (veya /
), ardından lib/node_modules
dizini gelir. README.md
dosyası varsa, içeriğini readme
değişkeninin içine kaydeder. Aksi takdirde, bir hata gösterir ve işlemden çıkar.
// 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'ın gerçekten basit bir API'si var; bir dosyanın içeriğini göstermek, ona bir box
oluşturmasını söylemek ve içeriği yüklemek kadar kolaydır.
screen.key(['escape', 'q', 'C-c'], function(ch, key) { return process.exit(0); });
Şimdi man
uygulamasından çıkmak için bir yol oluşturalım. İşlemden çıkmak için escape
, q
tuşlarını veya Cc
emacs stili kombinasyonunu birleştiririz.
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(); });
Bir satır yukarı veya aşağı kaydırmak için yön tuşlarını ve bir sayfayı aşağı kaydırmak için space
, f
, j
veya n
tuşlarını kullanırız (ekranda ne kadar satır varsa o kadar). Tersini yapmak için b
, k
veya p
kullanın.
box.focus(); screen.render();
Son olarak uygulamaya oluşturduğumuz box
odaklanmasını ve tamamını render etmesini söylüyoruz. Bu dosyaları /lib/node_modules/bin-man
dizinine koyalım ve şöyle basit bir README.md
:
# Man Author: @groundwater ## Install npkg install bin-man ## Usage ``` Usage: man PKGNAME Display a packages README.md file ```
NodeOS için ilk özel uygulamamızı bitirmek üzereyiz. Sadece son bir küçük adım kaldı; NodeOS uygulamaları için bir gereklilik olduğu için bir yapılandırma dosyası oluşturmamız gerekiyor. Bu, /etc/bin-man/config.json
yolunda şu içeriğe sahip bir dosya oluşturmak kadar basittir: {}
, boş bir JSON nesnesi. Artık yeni uygulamamızı deneyebiliriz. NodeOS kabuğunun içinde çalışan man
, daha önce oluşturduğumuz benioku dosyasını göstermelidir.
Çözüm
Basit kod örneğimizde görebileceğiniz gibi, NodeOS'ta herhangi bir şeyi uygulamak kolay bir iştir, yalnızca Node.js'yi bilmeniz yeterlidir.
NodeOS'un çok fazla potansiyeli var ve ek özellikler uygulandığında harika bir işletim sistemi olabileceğini düşünüyorum. Hala çalışması gerekiyor, ancak tüm Node.js tabanlı ekosistemin popülaritesinin bir sonucu olarak, hızla popüler bir işletim sistemi haline gelirse şaşırmam. Bu konu hakkında ne düşünüyorsun? Yorumlarda bana bildirin.