基于JavaScript的操作系統(tǒng)你聽說過嗎?
我想大多數(shù)人聽說過 Node.js,但是你聽說過 NodeOS 嗎?沒錯,NodeOS,一個用 Node.js 寫的操作系統(tǒng)。好吧,實話說,NodeOS 用 Linux 內(nèi)核來處理各種底層任務,比如硬件通訊什么的,但是除此之外,使用的都是 Node.js。NodeOS 的開發(fā)始于兩年前,創(chuàng)建者的目的很簡單,他只是好奇,“是否有可能僅使用 Node.js 創(chuàng)建一個操作系統(tǒng)呢?”
是否有可能僅使用 Node.js 創(chuàng)建一個操作系統(tǒng)呢?
這個主意怎么樣?
我們已經(jīng)看到了 Node.js 在這幾年已經(jīng)取得如此迅猛的發(fā)展,那么我們?yōu)楹尾蛔屗嵋恍┠??比如用它做個操作系統(tǒng)。
用戶自主的獨立文件系統(tǒng)
NodeOS 引入了一個有趣的特性:所有的用戶都有一個獨立的文件系統(tǒng),他們在一個簡單的文件系統(tǒng)中完成各種工作。因為他們的“主目錄”事實上就是他們自己的文件系統(tǒng) 的根(root),所以他們可以不需要任何超級權(quán)限就可以將軟件包安裝到系統(tǒng)中,也不需要配置什么,因為軟件包默認就安裝在他們自己的主目錄里面。此外, 這樣也提供了良好的安全性,如果黑客攻入到了某個賬戶,那么只能訪問到該用戶所在的部分,最終的結(jié)果就是黑客并不能由此影響到整個系統(tǒng)。
Node.js 和NPM
你可以想想,如果一個操作系統(tǒng)使用 Node.js,那就意味著所有在 NPM 中可用的包同時也都是 NodeOS 的軟件包。在寫作本文時,已經(jīng)有了超過 21 萬的軟件包,而且每分每秒都在不斷增長。如果幾年以后,NodeOS 有了一百萬應用,那也沒什么好奇怪的。
基于Linux 內(nèi)核
這看起來并不算什么,Linux 是大多數(shù)服務器所采用的操作系統(tǒng)。因為 NodeOS 是基于 Linux 內(nèi)核的,所以你只需要很少的修改就可以使用那些給其它的 Linux 發(fā)行版開發(fā)的應用了。
不好的消息
我非常希望 NodeOS 是一個已經(jīng)完成的作品,但是,它現(xiàn)在還不是。它仍然缺少一些服務器操作系統(tǒng)所必需的關(guān)鍵功能。比如,缺失完整的 BASH 工具集,包括 ps、tail、nano 和 grep 等都沒有。更糟糕的是,你也不能把它當成桌面操作系統(tǒng)使用,因為它沒有 GUI。當然,你可以實現(xiàn)一些缺失的功能,只需要使用一點點 JavaScript,但是默認情況下,這些功能現(xiàn)在都還沒有,真糟糕。
好吧,那我可以試試 NodeOS 嗎?
使用 Docker 來體驗
最容易、最快捷的體驗 NodeOS 的方法如下:
1、一臺運行 Mac OSX 或 Linux 計算機,也許 Windows 也可以,但是我沒試過。
2、Docker。
當你安裝好 Docker 之后,運行一個 NodeOS 實例是很容易的。你只需要執(zhí)行如下命令就可以了, Docker 會為你完成這魔法般的一切:
sudo docker run -t -i nodeos/nodeos
最容易、最快捷的體驗 NodeOS 的方法是通過 Docker。
當你運行了上述命令,Docker 會自動從倉庫下載 NodeOS 的鏡像,并將其安裝到一個虛擬環(huán)境中。安裝好之后,會打開一個連接到 NodeOS 的 SSH 會話。
不用 docker 呢?
有些情況下你也許不能使用 Docker 來體驗,或者是你想體驗一下最新版本的 NodeOS 。在寫作本文時,NodeOS 的鏡像已經(jīng)是兩個月前生成的了,而開發(fā)版本則是六天前更新的。所以,如果你希望使用最新版本,你應該從源代碼開始。這也不算很難,但是要花費一些時間。你 需要:
1、一臺運行 Linux 的計算機。你可以在 OS X 上編譯它,但是跨平臺編譯需要花費很多時間,對于 Windows 也如此。
2、Linux 編譯構(gòu)建相關(guān)的工具(make、g++、gcc、autoconf)。
3、Qemu。
4、時間,真的需要很多。
如果萬事俱備,你就可以從源代碼開始編譯了:
1、使用下列命令編譯: cd NodeOS 并 npm install。
2、我逐字引用了其官方文檔的話:“拿上爆米花去看場電影吧,不開玩笑,真的?!?,是的,它需要很多時間,做些有意思的事情去吧。
3、執(zhí)行 bash npm start 來在 Qemu 中運行 NodeOS。
可以工作了嗎?
當安裝完成后,我們可以通過在 NodeOS 的 shell 中執(zhí)行 ls命令來看看它是否工作了。輸出類似如下:
[ 'etc', 'lib', 'lib64', 'root', 'bin', 'sys', 'usr', 'share', 'proc' ]
如果顯示如上,說明一些基本的命令可以工作了。但是如果我們想要知道網(wǎng)卡地址呢?在 Linux 下,這個命令是 ifconfig ,讓我們試試:
command not found: ifconfig
看起來沒有 ifconfig 命令。這是因為 NodeOS 默認沒有 ifconfig命令?,F(xiàn)在怎么辦?很簡單,NodeOS 有一個集成的包管理器(類似 apt 或 yum) ,叫做 npkg,它是基于 Node 的 NPM 的,很容易使用??梢酝ㄟ^如下命令很方便的安裝 ifconfig :
npkg install bin-ifconfig
如果一切正常, ifconfig 命令現(xiàn)在就可以在 shell 中使用了。我們再次試著執(zhí)行一下,輸出類似如下:(我替換了其中的 MAC 地址):
eth0: flags=8863 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 media: autoselect status: active
如果你的輸出也類似如上,那說明它可以工作了。你已經(jīng)成功地安裝了你的第一個 NodeOS 應用: ifconfig。
它是可以工作了,然而我們可以用這個操作系統(tǒng)做什么呢?
如果我們只能拿這個用 Node.js 寫的操作系統(tǒng)做到你在 Ubuntu 或其它 Linux 發(fā)行版上一樣的(或更少的)事情,那它有什么價值?其實,整個事情中最有趣的地方是所有的東西都是 Node.js 開發(fā)的。這意味著我們可以只需要使用 Node.js 就可以開發(fā)我們的應用了。比如,NodeOS 里沒有默認實現(xiàn)的 man 命令,它用于顯示其它命令的幫助信息。不用擔心,實現(xiàn)它很簡單。
使用 Node.js 構(gòu)建一個 NodeOS 應用
首先讓我們來安裝一個叫做 Hipster 的文本編輯器,以便我們可以創(chuàng)建和編輯文件。執(zhí)行如下命令: npm install -g hipster@0.15.0。這個文本編輯器很簡單,除了用作文本編輯之外啥也干不了,不過對于我們來說足夠了。
用 Hipster 創(chuàng)建文件很簡單,運行 hip filename即可,如: hip package.json。要保存文件請按下 Ctrl + s ,退出按下 Ctrl + q。
在這里,我們使用了一個 NodeOS 的主開發(fā)人員所開發(fā)的代碼,我自己并沒有真的去開發(fā)這個應用。我們例子中的原始代碼可以在 node-bin-man Git 倉庫中找到。
讓我們回過頭來創(chuàng)建我們的第一個 NodeOS 應用。像每個 Node.js 應用(或 NPM 包)一樣,我們從創(chuàng)建一個 package.json 文件開始,內(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 是其意自明的。這個 bin 集合是一個 JSON 的鍵值對對象,包含了命令名及其關(guān)聯(lián)的 JavaScript 文件。在我們的例子中, man 命令關(guān)聯(lián)到 man.js文件。而 dependencies集合包含了這個應用所需要的 NPM 包的列表。在我們的例子中,代碼的作者包含了 Blessed 包,這是一個類 curses 的庫,可以讓 Node.js 支持高級終端界面的 API。
現(xiàn)在我們進入了主要的部分,實際的代碼。
#!/usr/bin/env node
這個部分叫做釋伴(shebang)。NodeOS 實際上并不需要它,但是它用于告訴操作系統(tǒng)如何執(zhí)行下面的代碼。在這里的意思是,它告訴系統(tǒng)下面的每行代碼都需要通過 /usr/bin/env node命令來解釋執(zhí)行。
var fs = require('fs'); var blessed = require('blessed');
像在 Node.js 中一樣, require() 函數(shù)加載選定的包到內(nèi)存中,并將其保存為特定的變量。
var arg = process.argv[2] || 'bin-man';
man 命令的標準行為是如果沒有指定要查看的命令時,就顯示它自己的幫助信息。在我們的代碼示例中也一樣:如果沒有給出第二個參數(shù)(第一個參數(shù)是 man 本身),那么該參數(shù)的默認值是 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); }
在這里,程序檢查給定的應用是否有一個 readme 文件。在 NodeOS 中,每個應用的安裝路徑是其主目錄(/)下的 lib/node_modules。如果 README.md 文件存在,就將其內(nèi)容保存到 readme變量中。否則,顯示一個錯誤信息并退出。
// 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 有一個非常簡單的 API,要顯示一個文件的內(nèi)容很容易,只需要創(chuàng)建一個 box ,然后載入內(nèi)容即可。
screen.key(['escape', 'q', 'C-c'], function(ch, key) { return process.exit(0); });
現(xiàn)在,讓我們找個退出 man 應用的方法。我們組合了 escape、 q 或 emacs 風格的 C-c 來退出應用。
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(); });
我們使用方向鍵來上滾和下滾,用 space、 f、 j 或 n 向下翻頁,b、 k 或 p 向上翻頁。
box.focus(); screen.render();
最后,我們讓應用將輸入焦點放到 box ,我們在這里創(chuàng)建和渲染所有內(nèi)容。
把上面編輯的這個文件存放到 /lib/node_modules/bin-man 目錄下(名字是 man.js),并加一個簡單的 README.md ,類似如下:
# Man Author: @groundwater ## Install npkg install bin-man ## Usage ``` Usage: man PKGNAME Display a packages README.md file ```
我們已經(jīng)基本完成了我們的第一個 NodeOS 定制應用。最后剩下一小步了,我們需要創(chuàng)建一個 NodeOS 應用需要的配置文件。很簡單,把它創(chuàng)建到 /etc/bin-man/config.json ,內(nèi)容只是一個空的 JSON 對象: {}。
現(xiàn)在我們可以試試我們的新應用了。在 NodeOS 中運行 man ,它將展示我們之前創(chuàng)建的 readme 文件。
總結(jié)
如你所見,在 NodeOS 中實現(xiàn)任何東西都很簡單,你只需要懂得 Node.js 即可。
NodeOS 很有潛力,我認為當實現(xiàn)了更多的功能之后它會成為一個偉大的操作系統(tǒng)。目前仍然需要很多工作,但是在整個Node.js 生態(tài)系統(tǒng)興盛發(fā)展的形勢下,萬一哪天它很快地成為一個流行的操作系統(tǒng)也沒什么好驚奇的。
- 瘋掉了,盡然有js寫的操作系統(tǒng)
- JavaScript 檢測瀏覽器和操作系統(tǒng)的腳本
- jsp 獲取客戶端的瀏覽器和操作系統(tǒng)信息
- JavaScript 獲取用戶客戶端操作系統(tǒng)版本
- js下獲得客戶端操作系統(tǒng)的函數(shù)代碼(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
- JavaScript高級程序設計閱讀筆記(十六) javascript檢測瀏覽器和操作系統(tǒng)-detect.js
- 利用Javascript判斷操作系統(tǒng)的類型實現(xiàn)不同操作系統(tǒng)下的兼容性
- JS獲得瀏覽器版本和操作系統(tǒng)版本的例子
- 封裝好的js判斷操作系統(tǒng)與瀏覽器代碼分享
相關(guān)文章
微信小程序 wx.getUserInfo引導用戶授權(quán)問題實例分析
這篇文章主要介紹了微信小程序 wx.getUserInfo引導用戶授權(quán)問題,結(jié)合實例形式分析了微信小程序使用wx.getUserInfo引導用戶授權(quán)問題的具體操作步驟與實現(xiàn)方法,需要的朋友可以參考下2020-03-03跟我學習javascript的var預解析與函數(shù)聲明提升
跟我學習javascript的var預解析與函數(shù)聲明提升,小編對var預解析與函數(shù)聲明提升知識點也不甚了解,和大家一起學習本篇文章。2015-11-11Layui數(shù)據(jù)表格跳轉(zhuǎn)到指定頁的實現(xiàn)方法
今天小編就為大家分享一篇Layui數(shù)據(jù)表格跳轉(zhuǎn)到指定頁的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09BootStrap 圖標icon符號圖標glyphicons不正常顯示的快速解決辦法
這篇文章主要介紹了BootStrap 圖標icon符號圖標glyphicons不正常顯示的快速解決辦法,需要的朋友可以參考下2016-12-12利用XMLHTTP傳遞參數(shù)在另一頁面執(zhí)行并刷新本頁
利用XMLHTTP傳遞參數(shù)在另一頁面執(zhí)行并刷新本頁...2006-10-10如何用JS實現(xiàn)簡單的數(shù)據(jù)監(jiān)聽
這篇文章主要介紹了如何用JS實現(xiàn)簡單的數(shù)據(jù)監(jiān)聽,對數(shù)據(jù)監(jiān)聽感興趣的同學,可以參考一下2021-05-05