溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

基于JavaScript 的操作系統(tǒng)是怎樣的

發(fā)布時(shí)間:2021-11-17 10:06:54 來(lái)源:億速云 閱讀:98 作者:柒染 欄目:web開(kāi)發(fā)

這篇文章給大家介紹基于JavaScript 的操作系統(tǒng)是怎樣的,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

我想大多數(shù)人聽(tīng)說(shuō)過(guò) Node.js,但是你聽(tīng)說(shuō)過(guò) NodeOS 嗎?沒(méi)錯(cuò),NodeOS,一個(gè)用 Node.js  寫(xiě)的操作系統(tǒng)。好吧,實(shí)話說(shuō),NodeOS 用 Linux 內(nèi)核來(lái)處理各種底層任務(wù),比如硬件通訊什么的,但是除此之外,使用的都是  Node.js。NodeOS 的開(kāi)發(fā)始于兩年前,創(chuàng)建者的目的很簡(jiǎn)單,他只是好奇,“是否有可能僅使用 Node.js 創(chuàng)建一個(gè)操作系統(tǒng)呢?”

是否有可能僅使用 Node.js 創(chuàng)建一個(gè)操作系統(tǒng)呢?

這個(gè)主意怎么樣?

我們已經(jīng)看到了 Node.js 在這幾年已經(jīng)取得如此迅猛的發(fā)展,那么我們?yōu)楹尾蛔屗嵋恍┠兀勘热缬盟鰝€(gè)操作系統(tǒng)。

用戶自主的獨(dú)立文件系統(tǒng)

NodeOS  引入了一個(gè)有趣的特性:所有的用戶都有一個(gè)獨(dú)立的文件系統(tǒng),他們?cè)谝粋€(gè)簡(jiǎn)單的文件系統(tǒng)中完成各種工作。因?yàn)樗麄兊摹爸髂夸洝笔聦?shí)上就是他們自己的文件系統(tǒng) 的根(root),所以他們可以不需要任何超級(jí)權(quán)限就可以將軟件包安裝到系統(tǒng)中,也不需要配置什么,因?yàn)檐浖J(rèn)就安裝在他們自己的主目錄里面。此外, 這樣也提供了良好的安全性,如果黑客攻入到了某個(gè)賬戶,那么只能訪問(wèn)到該用戶所在的部分,最終的結(jié)果就是黑客并不能由此影響到整個(gè)系統(tǒng)。

Node.js 和 NPM

你可以想想,如果一個(gè)操作系統(tǒng)使用 Node.js,那就意味著所有在 NPM 中可用的包同時(shí)也都是 NodeOS  的軟件包。在寫(xiě)作本文時(shí),已經(jīng)有了超過(guò) 21 萬(wàn)的軟件包,而且每分每秒都在不斷增長(zhǎng)。如果幾年以后,NodeOS  有了一百萬(wàn)應(yīng)用,那也沒(méi)什么好奇怪的。

基于 Linux 內(nèi)核

這看起來(lái)并不算什么,Linux 是大多數(shù)服務(wù)器所采用的操作系統(tǒng)。因?yàn)?NodeOS 是基于 Linux 內(nèi)核的,所以你只需要很少的修改就可以使用那些給其它的 Linux 發(fā)行版開(kāi)發(fā)的應(yīng)用了。

不好的消息

我非常希望 NodeOS 是一個(gè)已經(jīng)完成的作品,但是,它現(xiàn)在還不是。它仍然缺少一些服務(wù)器操作系統(tǒng)所必需的關(guān)鍵功能。比如,缺失完整的  BASH 工具集,包括 ps、tail、nano 和 grep 等都沒(méi)有。更糟糕的是,你也不能把它當(dāng)成桌面操作系統(tǒng)使用,因?yàn)樗鼪](méi)有  GUI。當(dāng)然,你可以實(shí)現(xiàn)一些缺失的功能,只需要使用一點(diǎn)點(diǎn) JavaScript,但是默認(rèn)情況下,這些功能現(xiàn)在都還沒(méi)有,真糟糕。

好吧,那我可以試試 NodeOS 嗎?

 

使用 Docker 來(lái)體驗(yàn)

最容易、最快捷的體驗(yàn) NodeOS 的方法如下:

  1. 一臺(tái)運(yùn)行 Mac OSX 或 Linux 計(jì)算機(jī),也許 Windows 也可以,但是我沒(méi)試過(guò)。

  2. Docker。

當(dāng)你安裝好 Docker 之后,運(yùn)行一個(gè) NodeOS 實(shí)例是很容易的。你只需要執(zhí)行如下命令就可以了, Docker 會(huì)為你完成這魔法般的一切:

sudo docker run -t -i nodeos/nodeos

最容易、最快捷的體驗(yàn) NodeOS 的方法是通過(guò) Docker。

當(dāng)你運(yùn)行了上述命令,Docker 會(huì)自動(dòng)從倉(cāng)庫(kù)下載 NodeOS 的鏡像,并將其安裝到一個(gè)虛擬環(huán)境中。安裝好之后,會(huì)打開(kāi)一個(gè)連接到 NodeOS 的 SSH 會(huì)話。

不用 docker 呢?

有些情況下你也許不能使用 Docker 來(lái)體驗(yàn),或者是你想體驗(yàn)一下***版本的 NodeOS 。在寫(xiě)作本文時(shí),NodeOS  的鏡像已經(jīng)是兩個(gè)月前生成的了,而開(kāi)發(fā)版本則是六天前更新的。所以,如果你希望使用***版本,你應(yīng)該從源代碼開(kāi)始。這也不算很難,但是要花費(fèi)一些時(shí)間。你 需要:

  1. 一臺(tái)運(yùn)行 Linux 的計(jì)算機(jī)。你可以在 OS X 上編譯它,但是跨平臺(tái)編譯需要花費(fèi)很多時(shí)間,對(duì)于 Windows 也如此。

  2. Linux 編譯構(gòu)建相關(guān)的工具(make、g++、gcc、autoconf)。

  3. Qemu。

  4. 時(shí)間,真的需要很多。

如果萬(wàn)事俱備,你就可以從源代碼開(kāi)始編譯了:

  1. 下載項(xiàng)目源代碼:bash git clone git@github.com:NodeOS/NodeOS.git。

  2. 使用下列命令編譯: cd NodeOS 并 npm install。

  3. 我逐字引用了其官方文檔的話:“拿上爆米花去看場(chǎng)電影吧,不開(kāi)玩笑,真的?!保堑?,它需要很多時(shí)間,做些有意思的事情去吧。

  4. 執(zhí)行 bash npm start 來(lái)在 Qemu 中運(yùn)行 NodeOS。

可以工作了嗎?

當(dāng)安裝完成后,我們可以通過(guò)在 NodeOS 的 shell 中執(zhí)行  ls命令來(lái)看看它是否工作了。輸出類似如下:

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

如果顯示如上,說(shuō)明一些基本的命令可以工作了。但是如果我們想要知道網(wǎng)卡地址呢?在 Linux 下,這個(gè)命令是  ifconfig ,讓我們?cè)囋嚕?/p>

command not found: ifconfig

看起來(lái)沒(méi)有 ifconfig 命令。這是因?yàn)?NodeOS 默認(rèn)沒(méi)有  ifconfig命令。現(xiàn)在怎么辦?很簡(jiǎn)單,NodeOS  有一個(gè)集成的包管理器(類似 apt 或 yum) ,叫做 npkg,它是基于 Node 的 NPM  的,很容易使用。可以通過(guò)如下命令很方便的安裝 ifconfig :

npkg install bin-ifconfig

如果一切正常, ifconfig 命令現(xiàn)在就可以在 shell 中使用了。我們?cè)俅卧囍鴪?zhí)行一下,輸出類似如下:(我替換了其中的 MAC 地址):

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

如果你的輸出也類似如上,那說(shuō)明它可以工作了。你已經(jīng)成功地安裝了你的***個(gè) NodeOS 應(yīng)用: ifconfig。

它是可以工作了,然而我們可以用這個(gè)操作系統(tǒng)做什么呢?

如果我們只能拿這個(gè)用 Node.js 寫(xiě)的操作系統(tǒng)做到你在 Ubuntu 或其它 Linux  發(fā)行版上一樣的(或更少的)事情,那它有什么價(jià)值?其實(shí),整個(gè)事情中最有趣的地方是所有的東西都是 Node.js 開(kāi)發(fā)的。這意味著我們可以只需要使用  Node.js 就可以開(kāi)發(fā)我們的應(yīng)用了。比如,NodeOS 里沒(méi)有默認(rèn)實(shí)現(xiàn)的 man 命令,它用于顯示其它命令的幫助信息。不用擔(dān)心,實(shí)現(xiàn)它很簡(jiǎn)單。

基于JavaScript 的操作系統(tǒng)是怎樣的

使用 Node.js 構(gòu)建一個(gè) NodeOS 應(yīng)用

首先讓我們來(lái)安裝一個(gè)叫做 Hipster 的文本編輯器,以便我們可以創(chuàng)建和編輯文件。執(zhí)行如下命令: npm install -g hipster@0.15.0。這個(gè)文本編輯器很簡(jiǎn)單,除了用作文本編輯之外啥也干不了,不過(guò)對(duì)于我們來(lái)說(shuō)足夠了。

用 Hipster 創(chuàng)建文件很簡(jiǎn)單,運(yùn)行 hip filename即可,如: hip package.json。要保存文件請(qǐng)按下 Ctrl + s ,退出按下 Ctrl + q。

在這里,我們使用了一個(gè) NodeOS 的主開(kāi)發(fā)人員所開(kāi)發(fā)的代碼,我自己并沒(méi)有真的去開(kāi)發(fā)這個(gè)應(yīng)用。我們例子中的原始代碼可以在 node-bin-man Git 倉(cāng)庫(kù)中找到。

讓我們回過(guò)頭來(lái)創(chuàng)建我們的***個(gè) NodeOS 應(yīng)用。像每個(gè) Node.js 應(yīng)用(或 NPM 包)一樣,我們從創(chuàng)建一個(gè) package.json 文件開(kāi)始,內(nèi)容如下:

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

這些參數(shù) name、version、 author、 repository、 license和 description 是其意自明的。這個(gè)  bin 集合是一個(gè) JSON 的鍵值對(duì)對(duì)象,包含了命令名及其關(guān)聯(lián)的 JavaScript 文件。在我們的例子中, man 命令關(guān)聯(lián)到   man.js文件。而  dependencies集合包含了這個(gè)應(yīng)用所需要的 NPM 包的列表。在我們的例子中,代碼的作者包含了 Blessed  包,這是一個(gè)類 curses 的庫(kù),可以讓 Node.js 支持高級(jí)終端界面的 API。

現(xiàn)在我們進(jìn)入了主要的部分,實(shí)際的代碼。

#!/usr/bin/env node

這個(gè)部分叫做釋伴(shebang)。NodeOS 實(shí)際上并不需要它,但是它用于告訴操作系統(tǒng)如何執(zhí)行下面的代碼。在這里的意思是,它告訴系統(tǒng)下面的每行代碼都需要通過(guò)  /usr/bin/env node命令來(lái)解釋執(zhí)行。

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

像在 Node.js 中一樣, require() 函數(shù)加載選定的包到內(nèi)存中,并將其保存為特定的變量。

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

man 命令的標(biāo)準(zhǔn)行為是如果沒(méi)有指定要查看的命令時(shí),就顯示它自己的幫助信息。在我們的代碼示例中也一樣:如果沒(méi)有給出第二個(gè)參數(shù)(***個(gè)參數(shù)是 man 本身),那么該參數(shù)的默認(rèn)值是 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); }

在這里,程序檢查給定的應(yīng)用是否有一個(gè) readme 文件。在 NodeOS  中,每個(gè)應(yīng)用的安裝路徑是其主目錄(/)下的 lib/node_modules。如果 README.md 文件存在,就將其內(nèi)容保存到  readme變量中。否則,顯示一個(gè)錯(cuò)誤信息并退出。

// 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 有一個(gè)非常簡(jiǎn)單的 API,要顯示一個(gè)文件的內(nèi)容很容易,只需要?jiǎng)?chuàng)建一個(gè)  box ,然后載入內(nèi)容即可。

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

現(xiàn)在,讓我們找個(gè)退出  man 應(yīng)用的方法。我們組合了  escape、 q 或 emacs 風(fēng)格的 C-c 來(lái)退出應(yīng)用。

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

我們使用方向鍵來(lái)上滾和下滾,用 space、 f、 j 或 n 向下翻頁(yè),b、 k 或 p 向上翻頁(yè)。

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

我們讓?xiě)?yīng)用將輸入焦點(diǎn)放到  box ,我們?cè)谶@里創(chuàng)建和渲染所有內(nèi)容。

把上面編輯的這個(gè)文件存放到  /lib/node_modules/bin-man 目錄下(名字是 man.js),并加一個(gè)簡(jiǎn)單的  README.md ,類似如下:

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

我們已經(jīng)基本完成了我們的***個(gè) NodeOS 定制應(yīng)用。***剩下一小步了,我們需要?jiǎng)?chuàng)建一個(gè) NodeOS 應(yīng)用需要的配置文件。很簡(jiǎn)單,把它創(chuàng)建到 /etc/bin-man/config.json ,內(nèi)容只是一個(gè)空的 JSON 對(duì)象: {}。

現(xiàn)在我們可以試試我們的新應(yīng)用了。在 NodeOS 中運(yùn)行 man ,它將展示我們之前創(chuàng)建的 readme 文件。

如你所見(jiàn),在 NodeOS 中實(shí)現(xiàn)任何東西都很簡(jiǎn)單,你只需要懂得 Node.js 即可。

NodeOS 很有潛力,我認(rèn)為當(dāng)實(shí)現(xiàn)了更多的功能之后它會(huì)成為一個(gè)偉大的操作系統(tǒng)。目前仍然需要很多工作,但是在整個(gè)Node.js 生態(tài)系統(tǒng)興盛發(fā)展的形勢(shì)下,萬(wàn)一哪天它很快地成為一個(gè)流行的操作系統(tǒng)也沒(méi)什么好驚奇的。

關(guān)于基于JavaScript 的操作系統(tǒng)是怎樣的就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI