NodeOS:基于JavaScript的操作系统

本文概述

我相信大多数程序员都听说过Node.js, 但是NodeOS呢?是的, NodeOS, 一个用Node.js编写的操作系统。好吧, 有点。 NodeOS将Linux内核用于大多数对性能至关重要的工作, 例如硬件交互, 但对于其他所有功能, 它都使用Node.js。 NodeOS的开发始于两年前, 它是由一个有着共同但有趣的想法的人们创建的:”是否可以仅使用Node.js创建操作系统?”

达尔文的进化图

是否可以仅使用Node.js创建操作系统?

鸣叫

有什么大不了的?

首先, 考虑一下Node.js在短时间内取得的进展。现在, 考虑一下操作系统发生的相同情况。然后, 让我们添加一些有趣的东西。

每用户独立的隔离根文件系统

NodeOS引入了一个有趣的范例:如果所有用户都具有隔离的文件系统, 那么它将为他们提供一个简单的文件系统层次结构。实际上, 由于它们的”主文件夹”是其自己的文件系统层次结构的根, 因此它们可以全局安装软件包而无需特殊权限, 并且由于默认情况下将其安装在其主目录中, 因此无需进行任何配置。而且, 它提供了很多安全性;如果黑客找到进入操作系统中特定帐户的方法, 则他/他可以访问的唯一分区是该用户的分区。最终结果是黑客无法破坏整个系统。

Node.js和NPM

如果考虑一下, 使用Node.js的操作系统意味着NPM中可用的任何程序包同时也是NodeOS程序包。在撰写本文时, 有210, 735个软件包;由于NPM软件包的数量每分钟都在增加, 因此如果NodeOS在几年内拥有一百万个应用程序, 这并不奇怪。

它基于Linux内核

这似乎没什么大不了, 但是Linux是最常用的服务器操作系统。由于NodeOS基于Linux内核, 因此你只需很少的更改就可以运行为其他Linux发行版编写的每个应用程序。

缺点

就我想要完成的NodeOS而言, 它还不存在。它仍然缺少服务器操作系统的许多关键功能。例如, 缺少整个BASH工具集, 包括ps, tail, nano和grep。此外, 由于它没有GUI, 因此不能将其作为桌面操作系统运行。当然, 你可以使用一些JavaScript轻松实现一些缺少的功能, 但是默认情况下所有提到的功能都不可用, 这是不好的。

那么, 如何试用NodeOS?

使用Docker

试用NodeOS的最简单, 最快的方法是使用以下命令:

  1. 具有Mac OSX或Linux的计算机。它可能适用于Windows, 但我没有尝试。
  2. 码头工人

安装Docker后, 运行NodeOS实例很容易。你所需要做的就是执行以下命令, Docker发挥了所有作用:

sudo docker run -t -i nodeos/nodeos
试用NodeOS的最简单,最快的方法是使用Docker

试用NodeOS的最简单, 最快的方法是使用Docker。

鸣叫

当你运行上述命令时, Docker会自动从存储库下载NodeOS的磁盘映像, 并在虚拟机内部执行NodeOS的安装。安装完成后, 它将打开与NodeOS Shell的SSH会话。

没有码头工人

出于某些原因, 你想要避免使用Docker, 其中一个是最新的NodeOS版本。在撰写本文时, 对NodeOS的Docker映像的最后更改是在两个月前执行的, 而开发版本是在六天前更新的。因此, 如果你想使用最新版本, 则绝对应该获取源代码。不太困难, 但是要花很长时间。你会需要:

  1. 装有Linux的计算机。你可以在OS X上对其进行编译, 但是由于它需要进行交叉编译, 因此将花费更长的时间。 Windows也是如此。
  2. Linux构建实用程序(make, g ++, gcc, autoconf)。
  3. e
  4. 时间。说真的, 很多。

掌握所有内容后, 即可继续进行源代码编译:

  1. 下载项目源代码:bash git clone [电子邮件保护]:NodeOS / NodeOS.git。
  2. 通过运行以下命令对其进行编译:cd NodeOS和npm install。
  3. 我要逐字引用官方文件:”摘些微波爆米花去看电影。不, 确实如此。”是的, 这将花费很多时间, 因此在此期间做一些有趣的事情。
  4. 运行bash npm start以在Qemu中运行NodeOS。

工作正常吗?

安装完成后, 我们可以通过在NodeOS外壳内部执行命令ls来检查安装是否正常。这样的输出应显示:

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

如果确实如此, 则意味着一些基本命令正在运行。但是, 如果我们要显示网卡的IP地址怎么办?在Linux下, 有一个名为ifconfig的命令可以执行此操作;让我们尝试一下:

command not found: ifconfig

看起来好像缺少ifconfig命令。这是因为NodeOS没有默认的ifconfig命令。怎么办?好吧, 这很简单; NodeOS有一个集成的软件包管理器(如apt或yum), 称为npkg, 它基于Node的NPM, 并且易于使用。安装ifconfig就像运行以下命令一样简单:

npkg install bin-ifconfig

如果一切顺利, 则命令ifconfig现在应该在外壳中可用。如果我们尝试再次执行它, 将显示以下输出(出于明显的原因, 我放置了随机的MAC地址和IP地址):

eth0: flags=8863<UP, BROADCAST, SMART, RUNNING, SIMPLEX, MULTICAST> 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<PERFORMNUD>
  media: autoselect
  status: active

如果你的输出看起来像那样, 那么它正在工作。你已经成功安装了第一个NodeOS应用程序:ifconfig。

这是工作。但是, 我们现在如何使用OS?

如果你可以做与Ubuntu或任何其他Linux发行版相同的事情(甚至更少的事情), 那么用Node.js编写操作系统的意义何在?好吧, 总的来说, 所有事情都是通过使用Node.js开发的。这也意味着我们可以仅使用Node.js来开发应用程序。例如, NodeOS没有命令man的默认实现, 该默认实现在Linux上用于显示其他命令的手册页。不要害怕, 实现起来很容易。怎么, 我听到你问?简单。

使用Node.js构建NodeOS应用程序

首先, 让我们安装一个名为Hipster的文本编辑器, 以便我们可以通过执行以下命令来创建和编辑文件:npm install -g [电子邮件保护]。这个文件编辑器很简单, 绝对不是我可以用作其他任何东西的编辑器, 但是在这种情况下它已经足够了。使用Hipster创建文件非常简单, 只需运行hip文件名, 例如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"
  }
}

参数名称, 版本, 作者, 存储库, 许可证和描述是不言自明的。 bin集合是一个JSON键/值对象, 其中包含命令名称和关联的JavaScript文件。在我们的示例中, man命令与文件man.js关联。集合(依赖项)包含使用此应用程序所需的NPM软件包的列表。在我们的示例中, 代码的作者包括Blessed, 这是一个类似于curses的库, 具有针对Node.js的高级终端接口API。

现在, 转到主要部分, 即实际代码。

#!/usr/bin/env node

这部分称为” shebang”。 NodeOS实际上并不需要它, 但是它告诉操作系统如何执行以下代码。在我们的例子中, 它告诉解释器, 需要使用命令/ usr / bin / env节点执行所有操作。

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);
}

此时, 程序将检查给定应用程序是否存在自述文件。在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;显示文件内容就像告诉它创建一个盒子并加载内容一样容易。

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

现在, 让我们创建一种退出man应用程序的方法。我们结合使用逃逸键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();
});

我们使用方向键向上或向下滚动一行, 并使用空格键f, j或n向下滚动一页(与屏幕上的行数一样)。使用b, k或p进行相反操作。

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

最后, 我们告诉应用程序将重点放在我们创建的盒子上并渲染整个东西。让我们将这些文件放在目录/ lib / node_modules / bin-man中, 然后添加一个简单的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外壳中运行的人应该显示我们之前创建的自述文件。

总结

如我们的简单代码示例所示, 在NodeOS中实现任何操作都是一件容易的事, 你只需要了解Node.js。

NodeOS具有巨大的潜力, 我认为一旦实现附加功能, 它就可以成为出色的操作系统。它仍然需要工作, 但是由于整个基于Node.js的生态系统的普及, 如果它迅速迅速成为流行的操作系统, 我不会感到惊讶。你怎么看待这件事?在评论中让我知道。

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?