导读 | 我想大多数人据说过 Node.js,可是你据说过 NodeOS 吗?一个用 Node.js 写的操做系统,NodeOS 用 Linux 内核来处理各类底层任务,好比硬件通信什么的,可是除此以外,使用的都是 Node.js。NodeOS 的开发始于两年前,建立者的目的很简单,他只是好奇,“是否有可能仅使用 Node.js 建立一个操做系统?”咱们已经看到了 Node.js 在这几年已经取得如此迅猛的发展,那么咱们为什么不让它更酷一些呢?用它作个操做系统。 |
用户自主的独立文件系统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 的方法以下:
当你安装好 Docker 以后,运行一个 NodeOS 实例是很容易的。你只须要执行以下命令就能够了, Docker 会为你完成这一切:
sudo docker run -t -i nodeos/nodeos
当你运行了上述命令,Docker 会自动从仓库下载 NodeOS 的镜像,并将其安装到一个虚拟环境中,安装好以后,会打开一个链接到 NodeOS 的 SSH 会话。
不用Docker呢?
有些状况下你也许不能使用 Docker 来体验,或者是你想体验一下最新版本的 NodeOS 。在写做本文时,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 命令,它用于显示其它命令的帮助信息。不用担忧,实现它很简单。
首先让咱们来安装一个叫作 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/