基于JavaScript的操作系统你听说过吗?

我想大多数人听说过 Node.js,但是你听说过 NodeOS 吗?没错,NodeOS,一个用 Node.js 写的操作系统。好吧,实话说,NodeOS 用 Linux 内核来处理各种底层任务,比如硬件通讯什么的,但是除此之外,使用的都是 Node.js。NodeOS 的开发始于两年前,创建者的目的很简单,他只是好奇,“是否有可能仅使用 Node.js 创建一个操作系统呢?”

是否有可能仅使用 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、使用下列命令编译: cd NodeOS 并 npm install。
2、我逐字引用了其官方文档的话:“拿上爆米花去看场电影吧,不开玩笑,真的。”,是的,它需要很多时间,做些有意思的事情去吧。
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 命令,它用于显示其它命令的帮助信息。不用担心,实现它很简单。

使用 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"
 }
}

这些参数 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 生态系统兴盛发展的形势下,万一哪天它很快地成为一个流行的操作系统也没什么好惊奇的。

(0)

相关推荐

  • 封装好的js判断操作系统与浏览器代码分享

    摘要: 对于前端开发我们最重要的工作就是兼容性,系统的兼容性,浏览器的兼容性等等.今天分享一个我在项目中封装的判断操作系统与浏览器的方法. 操作系统: var os = (function() { var UserAgent = navigator.userAgent.toLowerCase(); return { isIpad : /ipad/.test(UserAgent), isIphone : /iphone os/.test(UserAgent), isAndroid : /andro

  • jsp 获取客户端的浏览器和操作系统信息

    string agent = request.getheader("user-agent"); stringtokenizer st = new stringtokenizer(agent,";"); st.nexttoken(); //得到用户的浏览器名 string userbrowser = st.nexttoken(); //得到用户的操作系统名 string useros = st.nexttoken(); 取得本机的信息也可以这样: 操作系统信息 sys

  • 疯掉了,尽然有js写的操作系统

    http://www.masswerk.at/jsuix/ // JS/UIX v0.44 // (c) mass:werk (N.Landsteiner) 2003 // all rights reserved // term gui var conf_term_x=102; var conf_term_y=34; var conf_kbd_offset=34; var termImgPath='jsuix_support/'; var termDiv='termDiv'; var termB

  • JS获得浏览器版本和操作系统版本的例子

    于是,我们可以写出下面的代码: 复制代码 代码如下: <script type="text/javascript"> var Sys = {}; var ua = navigator.userAgent.toLowerCase(); var s;  (s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] :  (s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] :  (s

  • 利用Javascript判断操作系统的类型实现不同操作系统下的兼容性

    在通过Javascript实现客户端和服务端的交互时,有时候需要对操作系统进行判断,以便实现不同操作系统下的兼容性,比如:我们有一个网站, 在Windows XP下浏览效果良好,但是到了Ubuntu下,由于许多特性不同,会造成在浏览上的细微差异,甚至会影响到良好的用户体验.这个时候我们就需要利用 Javascript对操作系统的类型以及某些特性进行判断,分而治之,从而实现网站在跨平台浏览时候保持良好的用户体验. 下边的代码实现对Windows.Mac.Linux.Unix擦作系统的判断: 复制代

  • JavaScript 获取用户客户端操作系统版本

    下午去了趟用户现场,感觉此问题确实比较蹊跷,最后发现出问题的电脑是WIN 2000的操作系统,感觉问题症结可能就在此处,上网google一下,发现原来Media Player 11不支持Win2000系统,需要针对用户操作系统版本判断用户下载播放器版本,让Win2000用户下载Media Player 9即可. 好了,问题原因找到了,解决问题就是很简单的事情了. 下面主要说一下用JavaScript如何判断用户操作系统及版本. 关键部分: window.navigator.userAgent :

  • JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js

    检测浏览器的方式 1.对象特征检测法:判断浏览器能力的通用方法.如果更关注浏览器的能力而不在乎它的实际身份,就可以使用这种检测方法.常见的原生Ajax写法中就用这种方法来创建XMLHttpRequest: 复制代码 代码如下: IXHR: function(){ if(window.ActiveXObject){ XHR=new ActiveXObject('Microsoft.XMLHTTP'); }else if(window.XMLHttpRequest){ XHR=new XMLHttp

  • JavaScript 检测浏览器和操作系统的脚本

    Web编程中,识别用户的浏览器以及操作系统非常重要.因为它们对HTML和JavaScript的支持程度有所不同.一般应用在系统登陆页面或者首页中. 具体应用如下: 复制代码 代码如下: <html> <head> <title>Login</title> <script type="text/javascript" src="detect.js"></script> <script typ

  • js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)

    复制代码 代码如下: //获得客户端操作系统(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008) function GetOSInfo(){ var _pf = navigator.platform; var appVer = navigator.userAgent; if(_pf == "Win32" || _pf == "Windows") { if(appVer.indexOf("WOW64")>

  • 基于JavaScript的操作系统你听说过吗?

    我想大多数人听说过 Node.js,但是你听说过 NodeOS 吗?没错,NodeOS,一个用 Node.js 写的操作系统.好吧,实话说,NodeOS 用 Linux 内核来处理各种底层任务,比如硬件通讯什么的,但是除此之外,使用的都是 Node.js.NodeOS 的开发始于两年前,创建者的目的很简单,他只是好奇,"是否有可能仅使用 Node.js 创建一个操作系统呢?" 是否有可能仅使用 Node.js 创建一个操作系统呢? 这个主意怎么样? 我们已经看到了 Node.js 在这

  • 基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统

    废话不多说了,直接给大家贴js代码了,代码附有注释,感兴趣的朋友一起学习吧. /** * Author: laixiangran. * Created by laixiangran on 2015/12/02. * 检测访问网页的浏览器呈现引擎.平台.Windows操作系统.移动设备和游戏系统 * ******************************************************************** * 各版本浏览器在windows10.0下的用户代理字符串:

  • 基于JavaScript代码实现pc与手机之间的跳转

    这个代码放在PC模板的代码里面 <script type="text/javascript"> //平台.设备和操作系统 var system ={ win : false, mac : false, xll : false }; //检测平台 var p = navigator.platform; system.win = p.indexOf("Win") == 0; system.mac = p.indexOf("Mac") ==

  • 基于JavaScript的数据结构队列动画实现示例解析

    ###一 摘要 今天给大家介绍一个基于数据结构中的队列的一个动画,在实现这个动画之前呢,还是给大家讲讲,在JavaScript中我们如何实现一个队列. ###二 队列 队列是一种列表,不同的是队列只能在末尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据.先进先出.这点和栈不一样,在栈中,最后入栈的元素反被优先处理.可以将队列想象成银行排队办理业务的人,排队在第一个的人先办理业务,其它人只能排着,直到轮到他们为止. 队列是一种先进先出(FIFO)的数据结构.队列被用在很多地方.比如提交操作

  • 基于JavaScript实现表单密码的隐藏和显示出来

    为了网站的安全性,很多朋友都把密码设的比较复杂,但是如何密码不能明显示,不知道输的是对是错,为了安全起见可以把密码显示的,那么基于js代码如何实现的呢? 当用户输入时密码显示为圆点或者星号, 为了确保用户输入的正确, 用户可以点击让密码显示的按钮. 直接就先看节目效果. 界面结构, 一个外层的pass-box, 然后内层加入input 和 一个 i 标签, 且给他们加入相应的class名称. <div class="pass-box"> <input type=&qu

  • 基于JavaScript表单脚本(详解)

    什么是表单? 一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法. 表单域:包含了文本框.密码框.隐藏域.多行文本框.复选框.单选框.下拉选择框和文件上传框等. 表单按钮:包括提交按钮.复位按钮和一般按钮:用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作. JavaScript与表单间的关系:JS最初的应用就是用于分担服务器处理表单的责任,打破依赖服务器的局面,尽管目前web和jav

  • 基于JavaScript实现动态创建表格和增加表格行数

    在工作,项目需求中,有时候表格的行数不能够满足我们的需求,这时需要我们动态的增加表格的行数,下面小编通过一段代码实例给大家介绍js创建表格和增加表格的行数的方法,并且还实现了隔行变色功能.对此感兴趣的朋友可以参考一下代码: js代码如下所示: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>动态操作表格</title> </head>

  • 基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)

    表单序列化类型的数据是指url传递的数据的格式,形如"key=value&key=value&key=value"这样的key/value的键值对.一般来说使用jQuery的$.fn.serialize函数能达到这样的效果.如何将这样的格式转化为对象? 我们知道使用jQuery的$.fn.serializeArray函数得到的是一个如下结构的对象 [ { name: "startTime" value: "2015-12-02 00:00:

  • 基于JavaScript实现跳转提示页面

    先给大家展示下效果图,如果大家感觉还不错,请参考实现代码: 网页布局 <p>操作成功</p> <strong>5</strong><span>秒后回到主页</span><a href="javascript:history.back();">返回</a> 任务: 1.打开网页后,如果不做任何操作则返回到一个新的页面 var num=document.getElementsByTagName(

  • 基于JavaScript实现评论框展开和隐藏功能

    1.效果图如下所示, 点击评论会在对应的评论区域展开评论输入框,点击取消会取消对应的评论输入框 2.html代码:需要引入jQuery.js <div class="nr-comment"> <div class="nr-comment-con"> <div class="nr-comment-nav"> <div class="comment-number"> <span

随机推荐