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/

相关文章
相关标签/搜索