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

我想大多数人听说过 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 会为你完成这魔法般的一切。


  1. 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.下载项目源代码:bash git clone git@github.com:NodeOS/NodeOS.git。

2.使用下列命令编译: cd NodeOS 并 npm install。

3.我逐字引用了其官方文档的话:“拿上爆米花去看场电影吧,不开玩笑,真的。”,是的,它需要很多时间,做些有意思的事情去吧!

4.执行 bash npm start 来在 Qemu 中运行 NodeOS。

可以工作了吗?

当安装完成后,我们可以通过在 NodeOS 的 shell 中执行 ls命令来看看它是否工作了。输出类似如下:


  1. [ 'etc', 'lib', 'lib64', 'root', 'bin', 'sys', 'usr', 'share', 'proc' ] 

如果显示如上,说明一些基本的命令可以工作了。但是如果我们想要知道网卡地址呢?在 Linux 下,这个命令是 ifconfig ,让我们试试:


  1. command not found: ifconfig 

看起来没有 ifconfig 命令。这是因为 NodeOS 默认没有 ifconfig命令。现在怎么办?很简单,NodeOS 有一个集成的包管理器(类似 apt 或 yum) ,叫做 npkg,它是基于 Node 的 NPM 的,很容易使用。可以通过如下命令很方便的安装 ifconfig :


  1. npkg install bin-ifconfig 

如果一切正常, ifconfig 命令现在就可以在 shell 中使用了。我们再次试着执行一下,输出类似如下(我替换了其中的 MAC 地址):


  1. eth0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 
  2.   ether 01:23:45:67:89:ab  
  3.   inet6 f0cd::ef01:0203:0405:181%en1 prefixlen 64 scopeid 0x5  
  4.   inet 192.168.0.21 netmask 0xffffff00 broadcast 192.168.0.21 
  5.   nd6 options=1<PERFORMNUD> 
  6.   media: autoselect 
  7.   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 文件开始,内容如下:


  1.   "name": "bin-man", 
  2.   "version": "0.0.1", 
  3.   "description": "Format and display manual pages", 
  4.   "bin": { 
  5.     "man": "man.js" 
  6.   }, 
  7.   "repository": "https://github.com/groundwater/node-bin-man", 
  8.   "author": "groundwater", 
  9.   "license": "MIT", 
  10.   "dependencies": { 
  11.     "blessed": "~0.0.22" 
  12.   } 

这些参数 name、version、 author、 repository、 license和 description 是其意自明的。这个 bin 集合是一个 JSON 的键值对象,包含了命令名及其关联的 JavaScript 文件。在我们的例子中, man 命令关联到 man.js文件。而 dependencies集合包含了这个应用所需要的 NPM 包的列表。在我们的例子中,代码的作者包含了 Blessed 包,这是一个类 curses 的库,可以让 Node.js 支持高级终端界面的 API。

现在,我们进入了主要的部分,实际的代码。


  1. #!/usr/bin/env node 

这个部分叫做释伴shebang。NodeOS 实际上并不需要它,但是它用于告诉操作系统如何执行下面的代码。在这里的意思是,它告诉系统下面的每行代码都需要通过 /usr/bin/env node命令来解释执行。


  1. var fs = require('fs'); 
  2. var blessed = require('blessed'); 

像在 Node.js 中一样, require() 函数加载选定的包到内存中,并将其保存为特定的变量。


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

man 命令的标准行为是如果没有指定要查看的命令时,就显示它自己的帮助信息。在我们的代码示例中也一样:如果没有给出第二个参数(第一个参数是 man 本身),那么该参数的默认值是 bin-man。


  1. var path = process.env.HOME + "/lib/node_modules/" + arg + "/README.md"; 
  2. try{ 
  3.   var readme = fs.readFileSync(path, 'utf-8'); 
  4. }catch(e){ 
  5.   console.log('No README.md for Package ',arg); 
  6.   process.exit(-1); 

在这里,程序检查给定的应用是否有一个 readme 文件。在 NodeOS 中,每个应用的安装路径是其主目录(/)下的 lib/node_modules。如果 README.md 文件存在,就将其内容保存到 readme变量中。否则,显示一个错误信息并退出。


  1. // Create a screen object. 
  2. var screen = blessed.screen(); 
  3.  
  4. var box = blessed.box({ 
  5.   content: readme, 
  6.   alwaysScroll:true, 
  7.   scrollable: true, 
  8. }); 
  9.  
  10. // Append our box to the screen. 
  11. screen.append(box); 

Blessed 有一个非常简单的 API,要显示一个文件的内容很容易,只需要创建一个 box ,然后载入内容即可。


  1. screen.key(['escape', 'q', 'C-c'], function(ch, key) { 
  2. return process.exit(0); 
  3. }); 

现在,让我们找个退出 man 应用的方法。我们组合了 escape、 q 或 emacs 风格的 C-c 来退出应用。


  1. screen.key(['space','f','j','n'], function(ch, key) { 
  2.   box.scroll(box.height); 
  3.   screen.render(); 
  4. }); 
  5.  
  6. screen.key(['down'], function(ch, key) { 
  7.   box.scroll(1); 
  8.   screen.render(); 
  9. }); 
  10.  
  11. screen.key(['up'], function(ch, key) { 
  12.   box.scroll(-1); 
  13.   screen.render(); 
  14. }); 
  15.  
  16. screen.key(['b','k','p'], function(ch, key) { 
  17.   box.scroll(-box.height); 
  18.   screen.render(); 
  19. }); 

我们使用方向键来上滚和下滚,用 space、 f、 j 或 n 向下翻页,b、 k 或 p 向上翻页。


  1. box.focus(); 
  2. screen.render(); 

最后,我们让应用将输入焦点放到 box ,我们在这里创建和渲染所有内容。

把上面编辑的这个文件存放到 /lib/node_modules/bin-man 目录下(名字是 man.js),并加一个简单的 README.md ,类似如下:


  1. # Man 
  2.  
  3. Author: @groundwater 
  4.  
  5. ## Install 
  6.  
  7. npkg install bin-man 
  8.  
  9. ## Usage 
  10.  
  11. ``` 
  12. Usage: man PKGNAME 
  13.  
  14. Display a packages README.md file 
  15. ``` 

我们已经基本完成了我们的第一个 NodeOS 定制应用。最后剩下一小步了,我们需要创建一个 NodeOS 应用需要的配置文件。很简单,把它创建到 /etc/bin-man/config.json ,内容只是一个空的 JSON 对象: {}。

现在,我们可以试试我们的新应用了。在 NodeOS 中运行 man ,它将展示我们之前创建的 readme 文件。

总结

如你所见,在 NodeOS 中实现任何东西都很简单,你只需要懂得 Node.js 即可。

NodeOS 很有潜力,我认为当实现了更多的功能之后,它会成为一个伟大的操作系统。目前仍然需要很多工作,但是在整个Node.js 生态系统兴盛发展的形势下,万一哪天它很快地成为一个流行的操作系统也没什么好惊奇的。

你怎么看?发表你的评论让我们知道。

作者:Danny Morabito

来源:51CTO

时间: 2025-01-31 05:36:16

你听说过基于JavaScript的操作系统NodeOS吗?的相关文章

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

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

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

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

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

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

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

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

使用Node.js开发一个基于JavaScript的RESTful应用

REST 风格几乎是为 HTTP 协议量身定做的,在 HTTP 协议中用 URI 来标识唯一的资源,用 GET.PUT.POST.DELETE 等动词来操作资源,HTTP 协议是无状态协议,可以通过 Cache 来提高性能.本文将使用 http://www.aliyun.com/zixun/aggregation/13375.html">Node.js 开发一个基于 JavaScript 的 RESTful 应用. 在 Web2.0 盛行的今天,作为一种可以运行在浏览器客户端的轻量级脚本语

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

这个代码放在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的REST客户端框架

现在REST是一个比较热门的概念,REST已经成为一个在Web上越来越常用的应用,基于REST的Web服务越来越多,包括Twitter在内的微博客都是用REST做为对外的API,先前我曾经介绍过"基于REST架构的Web Service设计",并给出了一些服务器端和客户端代码,随着JavaScript的广泛应用,我这里就给出一个轻量级的基于JavaScript的REST客户端框架. 这个JavaScript客户端主要使用了XMLHttpRequest对象来实现通过HTTP对服务器操作G

基于JavaScript实现轮播图代码_javascript技巧

一.要点: 1.页面加载时,图片重合,叠在一起[绝对定位]; 2.第一张显示,其它隐藏; 3.设置下标,给下标设置颜色让它随图片移动; 4.鼠标移动到图片上去,显示左右移动图标,鼠标移走,继续轮播; 二.实现代码: html代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type"

基于JavaScript语言的快速物联网开发架构

随 JavaScript 语言的流行,及物联网领域的崛起,我们能看到它们结合的可能性,同时也发现它特别适合于物联网开发.因此,在这篇文章里,笔者将主要从以下三个方面进行介绍: 典型的物联网架构,及多种语言带来的问题: 只使用 JavaScript 语言的物联网架构: 详解基于 JavaScript 语言的物联网不同层级结构. 那么,先让我们看看典型的物联网架构是怎样的吧. 典型的物联网架构 我们甚至还可以认为,物联网只是对互联网的扩展.与传统的 C/S 架构相比,它多了一个"数据采集层"