Linux中國

基於 JavaScript 的操作系統你聽說過嗎?

是否有可能僅使用 Node.js 創建一個操作系統呢?

這個主意怎麼樣?

我們已經看到了 Node.js 在這幾年已經取得如此迅猛的發展,那麼我們為何不讓它更酷一些呢?比如用它做個操作系統。

用戶自主的獨立文件系統

NodeOS 引入了一個有趣的特性:所有的用戶都有一個獨立的文件系統,他們在一個簡單的文件系統中完成各種工作。因為他們的「主目錄」事實上就是他們自己的文件系統的根(root),所以他們可以不需要任何超級許可權就可以將軟體包安裝到系統中,也不需要配置什麼,因為軟體包默認就安裝在他們自己的主目錄裡面。此外,這樣也提供了良好的安全性,如果黑客攻入到了某個賬戶,那麼只能訪問到該用戶所在的部分,最終的結果就是黑客並不能由此影響到整個系統。

Node.js 和 NPM

你可以想想,如果一個操作系統使用 Node.js,那就意味著所有在 NPM 中可用的包同時也都是 NodeOS 的軟體包。在寫作本文時,已經有了超過 21 萬的軟體包,而且每分每秒都在不斷增長。如果幾年以後,NodeOS 有了一百萬應用,那也沒什麼好奇怪的。

基於 Linux 內核

這看起來並不算什麼,Linux 是大多數伺服器所採用的操作系統。因為 NodeOS 是基於 Linux 內核的,所以你只需要很少的修改就可以使用那些給其它的 Linux 發行版開發的應用了。

不好的消息

我非常希望 NodeOS 是一個已經完成的作品,但是,它現在還不是。它仍然缺少一些伺服器操作系統所必需的關鍵功能。比如,缺失完整的 BASH 工具集,包括 ps、tail、nano 和 grep 等都沒有。更糟糕的是,你也不能把它當成桌面操作系統使用,因為它沒有 GUI。當然,你可以實現一些缺失的功能,只需要使用一點點 JavaScript,但是默認情況下,這些功能現在都還沒有,真糟糕。

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

使用 Docker 來體驗

最容易、最快捷的體驗 NodeOS 的方法如下:

  1. 一台運行 Mac OSX 或 Linux 計算機,也許 Windows 也可以,但是我沒試過。
  2. Docker。

當你安裝好 Docker 之後,運行一個 NodeOS 實例是很容易的。你只需要執行如下命令就可以了, Docker 會為你完成這魔法般的一切:

sudo docker run -t -i nodeos/nodeos

最容易、最快捷的體驗 NodeOS 的方法是通過 Docker。

當你運行了上述命令,Docker 會自動從倉庫下載 NodeOS 的鏡像,並將其安裝到一個虛擬環境中。安裝好之後,會打開一個連接到 NodeOS 的 SSH 會話。

不用 docker 呢?

有些情況下你也許不能使用 Docker 來體驗,或者是你想體驗一下最新版本的 NodeOS 。在寫作本文時,NodeOS 的鏡像已經是兩個月前生成的了,而開發版本則是六天前更新的。所以,如果你希望使用最新版本,你應該從源代碼開始。這也不算很難,但是要花費一些時間。你需要:

  1. 一台運行 Linux 的計算機。你可以在 OS X 上編譯它,但是跨平台編譯需要花費很多時間,對於 Windows 也如此。
  2. Linux 編譯構建相關的工具(make、g++、gcc、autoconf)。
  3. Qemu。
  4. 時間,真的需要很多。

如果萬事俱備,你就可以從源代碼開始編譯了:

  1. 下載項目源代碼:bash git clone git@github.com:NodeOS/NodeOS.git
  2. 使用下列命令編譯: cd NodeOSnpm install
  3. 我逐字引用了其官方文檔的話:「拿上爆米花去看場電影吧,不開玩笑,真的。」,是的,它需要很多時間,做些有意思的事情去吧。
  4. 執行 bash npm start 來在 Qemu 中運行 NodeOS。

可以工作了嗎?

當安裝完成後,我們可以通過在 NodeOS 的 shell 中執行 ls命令來看看它是否工作了。輸出類似如下:

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

如果顯示如上,說明一些基本的命令可以工作了。但是如果我們想要知道網卡地址呢?在 Linux 下,這個命令是 ifconfig ,讓我們試試:

command not found: ifconfig

看起來沒有 ifconfig 命令。這是因為 NodeOS 默認沒有 ifconfig命令。現在怎麼辦?很簡單,NodeOS 有一個集成的包管理器(類似 aptyum) ,叫做 npkg,它是基於 Node 的 NPM 的,很容易使用。可以通過如下命令很方便的安裝 ifconfig

npkg install bin-ifconfig

如果一切正常, ifconfig 命令現在就可以在 shell 中使用了。我們再次試著執行一下,輸出類似如下:(我替換了其中的 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

如果你的輸出也類似如上,那說明它可以工作了。你已經成功地安裝了你的第一個 NodeOS 應用: ifconfig

它是可以工作了,然而我們可以用這個操作系統做什麼呢?

如果我們只能拿這個用 Node.js 寫的操作系統做到你在 Ubuntu 或其它 Linux 發行版上一樣的(或更少的)事情,那它有什麼價值?其實,整個事情中最有趣的地方是所有的東西都是 Node.js 開發的。這意味著我們可以只需要使用 Node.js 就可以開發我們的應用了。比如,NodeOS 里沒有默認實現的 man 命令,它用於顯示其它命令的幫助信息。不用擔心,實現它很簡單。

使用 Node.js 構建一個 NodeOS 應用

首先讓我們來安裝一個叫做 Hipster 的文本編輯器,以便我們可以創建和編輯文件。執行如下命令: npm install -g hipster@0.15.0。這個文本編輯器很簡單,除了用作文本編輯之外啥也幹不了,不過對於我們來說足夠了。

用 Hipster 創建文件很簡單,運行 hip filename即可,如: hip package.json。要保存文件請按下 Ctrl + s ,退出按下 Ctrl + q

在這裡,我們使用了一個 NodeOS 的主開發人員所開發的代碼,我自己並沒有真的去開發這個應用。我們例子中的原始代碼可以在 node-bin-man Git 倉庫中找到。

讓我們回過頭來創建我們的第一個 NodeOS 應用。像每個 Node.js 應用(或 NPM 包)一樣,我們從創建一個 package.json 文件開始,內容如下:

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

這些參數 nameversionauthorrepositorylicensedescription 是其意自明的。這個 bin 集合是一個 JSON 的鍵值對對象,包含了命令名及其關聯的 JavaScript 文件。在我們的例子中, man 命令關聯到 man.js文件。而 dependencies集合包含了這個應用所需要的 NPM 包的列表。在我們的例子中,代碼的作者包含了 Blessed 包,這是一個類 curses 的庫,可以讓 Node.js 支持高級終端界面的 API。

現在我們進入了主要的部分,實際的代碼。

#!/usr/bin/env node

這個部分叫做 釋伴 shebang 。NodeOS 實際上並不需要它,但是它用於告訴操作系統如何執行下面的代碼。在這裡的意思是,它告訴系統下面的每行代碼都需要通過 /usr/bin/env node命令來解釋執行。

var fs = require(&apos;fs&apos;);
var blessed = require(&apos;blessed&apos;);

像在 Node.js 中一樣, require() 函數載入選定的包到內存中,並將其保存為特定的變數。

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

man 命令的標準行為是如果沒有指定要查看的命令時,就顯示它自己的幫助信息。在我們的代碼示例中也一樣:如果沒有給出第二個參數(第一個參數是 man 本身),那麼該參數的默認值是 bin-man。

var path = process.env.HOME + "/lib/node_modules/" + arg + "/README.md";

try{
  var readme = fs.readFileSync(path, &apos;utf-8&apos;);
}catch(e){
  console.log(&apos;No README.md for Package &apos;,arg);
  process.exit(-1);
}

在這裡,程序檢查給定的應用是否有一個 readme 文件。在 NodeOS 中,每個應用的安裝路徑是其主目錄(/)下的 lib/node_modules。如果 README.md 文件存在,就將其內容保存到 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,要顯示一個文件的內容很容易,只需要創建一個 box ,然後載入內容即可。

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

現在,讓我們找個退出 man 應用的方法。我們組合了 escapeq 或 emacs 風格的 C-c 來退出應用。

screen.key([&apos;space&apos;,&apos;f&apos;,&apos;j&apos;,&apos;n&apos;], function(ch, key) {
  box.scroll(box.height);
  screen.render();
});

screen.key([&apos;down&apos;], function(ch, key) {
  box.scroll(1);
  screen.render();
});

screen.key([&apos;up&apos;], function(ch, key) {
  box.scroll(-1);
  screen.render();
});

screen.key([&apos;b&apos;,&apos;k&apos;,&apos;p&apos;], function(ch, key) {
  box.scroll(-box.height);
  screen.render();
});

我們使用方向鍵來上滾和下滾,用 spacefjn 向下翻頁,bkp 向上翻頁。

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

最後,我們讓應用將輸入焦點放到 box ,我們在這裡創建和渲染所有內容。

把上面編輯的這個文件存放到 /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

我們已經基本完成了我們的第一個 NodeOS 定製應用。最後剩下一小步了,我們需要創建一個 NodeOS 應用需要的配置文件。很簡單,把它創建到 /etc/bin-man/config.json ,內容只是一個空的 JSON 對象: {}

現在我們可以試試我們的新應用了。在 NodeOS 中運行 man ,它將展示我們之前創建的 readme 文件。

總結

如你所見,在 NodeOS 中實現任何東西都很簡單,你只需要懂得 Node.js 即可。

NodeOS 很有潛力,我認為當實現了更多的功能之後它會成為一個偉大的操作系統。目前仍然需要很多工作,但是在整個Node.js 生態系統興盛發展的形勢下,萬一哪天它很快地成為一個流行的操作系統也沒什麼好驚奇的。

你怎麼看?發表你的評論讓我們知道。


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國