NodeOS作業系統
導讀 | 我想大多數人聽說過 Node.js,但是你聽說過 NodeOS 嗎?一個用 Node.js 寫的作業系統,NodeOS 用 Linux 核心來處理各種底層任務,比如硬體通訊什麼的,但是除此之外,使用的都是 Node.js。NodeOS 的開發始於兩年前,建立者的目的很簡單,他只是好奇,“是否有可能僅使用 Node.js 建立一個作業系統?”我們已經看到了 Node.js 在這幾年已經取得如此迅猛的發展,那麼我們為何不讓它更酷一些呢?用它做個作業系統。 |
NodeOS 引入了一個有趣的特性:所有的使用者都有一個獨立的檔案系統,他們在一個簡單的檔案系統中完成各種工作。因為他們的“主目錄”事實上就是他們自己的檔案系統的根(root),所以他們可以不需要任何超級許可權就可以將軟體包安裝到系統中,也不需要配置什麼,因為軟體包預設就安裝在他們自己的主目錄裡面。此外,這樣也提供了良好的安全性,如果駭客攻入到了某個賬戶,那麼只能訪問到該使用者所在的部分,最終的結果就是駭客並不能由此影響到整個系統。
你可以想想,如果一個作業系統使用 Node.js,那就意味著所有在 NPM 中可用的包同時也都是 NodeOS 的軟體包。在寫作本文時,已經有了超過 21 萬的軟體包,而且每分每秒都在不斷增長,如果幾年以後,NodeOS 有了一百萬應用,那也沒什麼好奇怪的。
這看起來並不算什麼,Linux 是大多數伺服器所採用的作業系統。因為 NodeOS 是基於 Linux 核心的,所以你只需要很少的修改就可以使用那些給其它的 Linux 發行版開發的應用了。
我非常希望 NodeOS 是一個已經完成的作品,但是,它現在還不是。它仍然缺少一些伺服器作業系統所必需的關鍵功能。比如,缺失完整的 BASH 工具集,包括 ps、tail、nano 和 grep 等都沒有。更糟糕的是,你也不能把它當成桌面作業系統使用,因為它沒有 GUI。當然,你可以實現一些缺失的功能,只需要使用一點點 JavaScript,但是預設情況下,這些功能現在都還沒有,真糟糕。
最容易、最快捷的體驗 NodeOS 的方法如下:
- 一臺執行 Mac OSX 或 Linux 計算機,也許 Windows 也可以,但是我沒試過。
- Docker。
當你安裝好 Docker 之後,執行一個 NodeOS 例項是很容易的。你只需要執行如下 就可以了, Docker 會為你完成這一切:
sudo docker run -t -i nodeos/nodeos
當你執行了上述 ,Docker 會自動從倉庫下載 NodeOS 的映象,並將其安裝到一個虛擬環境中,安裝好之後,會開啟一個連線到 NodeOS 的 SSH 會話。
有些情況下你也許不能使用 Docker 來體驗,或者是你想體驗一下最新版本的 NodeOS 。在寫作本文時,NodeOS 的映象已經是兩個月前生成的了,而開發版本則是六天前更新的。所以,如果你希望使用最新版本,你應該從原始碼開始。這也不算很難,但是要花費一些時間。你需要:
- 一臺執行 Linux 的計算機。你可以在 OS X 上編譯它,但是跨平臺編譯需要花費很多時間,對於 Windows 也如此。
- Linux 編譯構建相關的工具(make、g++、gcc、autoconf)。
- Qemu。
- 時間,真的需要很多。
如果萬事俱備,你就可以從原始碼開始編譯了:
- 下載專案原始碼:bash git clone git@github.com:NodeOS/NodeOS.git。
- 使用下列命令編譯: cd NodeOS 並 npm install。
- 執行 bash npm start來在 Qemu 中執行 NodeOS。
當安裝完成後,我們可以透過在 NodeOS 的 中執行 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 命令,它用於顯示其它命令的幫助資訊。不用擔心,實現它很簡單。
首先讓我們來安裝一個叫做 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": " "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 生態系統興盛發展的形勢下,萬一哪天它很快地成為一個流行的作業系統也沒什麼好驚奇的。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2904965/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 作業系統(1)——作業系統概述作業系統
- 作業系統(一):作業系統概述作業系統
- 作業系統(二):作業系統結構作業系統
- 作業系統 作業5作業系統
- 作業系統2—作業系統概論(下)作業系統
- 作業系統1—作業系統概論(上)作業系統
- 《作業系統》作業系統
- [作業系統]作業系統
- 作業系統作業系統
- 計算機作業系統|作業系統引論計算機作業系統
- 作業系統: Unix作業系統演進簡史作業系統
- 作業系統-1.1_2作業系統四個特徵作業系統特徵
- 作業系統原理作業系統
- Linux 作業系統Linux作業系統
- 作業系統概念作業系統
- Linux作業系統Linux作業系統
- 作業系統是什麼?Linux是什麼作業系統?作業系統Linux
- 10.19:xshell、作業系統、系統命令作業系統
- 作業系統複習作業系統
- 作業系統說明作業系統
- 作業系統(自己理解)作業系統
- 軟體作業系統作業系統
- 作業系統總結作業系統
- 作業系統學習作業系統
- 作業系統篇-cpu作業系統
- [作業系統]程序同步作業系統
- [作業系統]死鎖作業系統
- 作業系統筆記作業系統筆記
- Windows作業系統教程Windows作業系統
- 作業系統與Linux作業系統Linux
- 【linux】Linux作業系統Linux作業系統
- 【一】作業系統原理作業系統
- 作業系統結構作業系統
- 作業系統-程式管理作業系統
- Linux作業系統概述Linux作業系統
- 作業系統作業單元考核(附答案)作業系統
- 【作業系統2】作業系統啟動過程與異常/中斷,系統呼叫作業系統
- 作業系統體系結構作業系統