NodeOS操做系統

導讀 我想大多數人據說過 Node.js,可是你據說過 NodeOS 嗎?一個用 Node.js 寫的操做系統,NodeOS 用 Linux 內核來處理各類底層任務,好比硬件通信什麼的,可是除此以外,使用的都是 Node.js。NodeOS 的開發始於兩年前,建立者的目的很簡單,他只是好奇,「是否有可能僅使用 Node.js 建立一個操做系統?」咱們已經看到了 Node.js 在這幾年已經取得如此迅猛的發展,那麼咱們爲什麼不讓它更酷一些呢?用它作個操做系統。

NodeOS操做系統NodeOS操做系統

用戶自主的獨立文件系統html

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

Node.js 和 NPMlinux

你能夠想一想,若是一個操做系統使用 Node.js,那就意味着全部在 NPM 中可用的包同時也都是 NodeOS 的軟件包。在寫做本文時,已經有了超過 21 萬的軟件包,並且每分每秒都在不斷增加,若是幾年之後,NodeOS 有了一百萬應用,那也沒什麼好奇怪的。git

基於 Linux 內核github

這看起來並不算什麼,Linux 是大多數服務器所採用的操做系統。由於 NodeOS 是基於 Linux 內核的,因此你只須要不多的修改就可使用那些給其它的 Linux 發行版開發的應用了。docker

很差的消息shell

我很是但願 NodeOS 是一個已經完成的做品,可是,它如今還不是。它仍然缺乏一些服務器操做系統所必需的關鍵功能。好比,缺失完整的 BASH 工具集,包括 ps、tail、nano 和 grep 等都沒有。更糟糕的是,你也不能把它當成桌面操做系統使用,由於它沒有 GUI。固然,你能夠實現一些缺失的功能,只須要使用一點點 JavaScript,可是默認狀況下,這些功能如今都尚未,真糟糕。npm

好吧,那我能夠試試 NodeOS 嗎?json

使用 Docker 來體驗安全

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

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

當你安裝好 Docker 以後,運行一個 NodeOS 實例是很容易的。你只須要執行以下命令就能夠了, Docker 會爲你完成這一切:

sudo docker run -t -i nodeos/nodeos

NodeOS操做系統NodeOS操做系統

當你運行了上述命令,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 NodeOS 並 npm install。
  3. 執行 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 有一個集成的包管理器(相似apt或yum) ,叫作npkg,它是基於 Node 的 NPM 的,很容易使用。能夠經過以下命令很方便的安裝ifconfig :

npkg install bin-ifconfig

若是一切正常,ifconfig命令如今就能夠在shell中使用了。咱們再次試着執行一下,輸出相似以下:(我替換了其中的 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

若是你的輸出也相似如上,那說明它能夠工做了,你已經成功地安裝了你的第一個 NodeOS 應用:ifconfig。

它是能夠工做了,然而咱們能夠用這個操做系統作什麼呢?

若是咱們只能拿這個用 Node.js 寫的操做系統作到你在 Ubuntu 或其它 Linux 發行版上同樣的(或更少的)事情,那它有什麼價值?其實,整個事情中最有趣的地方是全部的東西都是 Node.js 開發的。這意味着咱們能夠只須要使用 Node.js 就能夠開發咱們的應用了。好比,NodeOS 裏沒有默認實現的 man 命令,它用於顯示其它命令的幫助信息。不用擔憂,實現它很簡單。

NodeOS操做系統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"
  }
}

這些參數 name、version、author、repository、license和description是其意自明的。這個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('fs');
var blessed = require('blessed');

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

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

man命令的標準行爲是若是沒有指定要查看的命令時,就顯示它本身的幫助信息。在咱們的代碼示例中也同樣:若是沒有給出第二個參數(第一個參數是 man 自己),那麼該參數的默認值是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文件存在,就將其內容保存到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(['escape', 'q', 'C-c'], function(ch, key) {
  return process.exit(0);
});

如今,讓咱們找個退出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 ,咱們在這裏建立和渲染全部內容。把上面編輯的這個文件存放到  /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技術教程書籍,爲開源技術愛好者努力作得更多更好:http://www.linuxprobe.com/

相關文章
相關標籤/搜索