本文概述
我相信大多数程序员都听说过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的最简单, 最快的方法是使用以下命令:
- 具有Mac OSX或Linux的计算机。它可能适用于Windows, 但我没有尝试。
- 码头工人
安装Docker后, 运行NodeOS实例很容易。你所需要做的就是执行以下命令, Docker发挥了所有作用:
sudo docker run -t -i nodeos/nodeos
试用NodeOS的最简单, 最快的方法是使用Docker。
鸣叫
当你运行上述命令时, Docker会自动从存储库下载NodeOS的磁盘映像, 并在虚拟机内部执行NodeOS的安装。安装完成后, 它将打开与NodeOS Shell的SSH会话。
没有码头工人
出于某些原因, 你想要避免使用Docker, 其中一个是最新的NodeOS版本。在撰写本文时, 对NodeOS的Docker映像的最后更改是在两个月前执行的, 而开发版本是在六天前更新的。因此, 如果你想使用最新版本, 则绝对应该获取源代码。不太困难, 但是要花很长时间。你会需要:
- 装有Linux的计算机。你可以在OS X上对其进行编译, 但是由于它需要进行交叉编译, 因此将花费更长的时间。 Windows也是如此。
- Linux构建实用程序(make, g ++, gcc, autoconf)。
- e
- 时间。说真的, 很多。
掌握所有内容后, 即可继续进行源代码编译:
- 下载项目源代码:bash git clone [电子邮件保护]:NodeOS / NodeOS.git。
- 通过运行以下命令对其进行编译:cd NodeOS和npm install。
- 我要逐字引用官方文件:”摘些微波爆米花去看电影。不, 确实如此。”是的, 这将花费很多时间, 因此在此期间做一些有趣的事情。
- 运行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上用于显示其他命令的手册页。不要害怕, 实现起来很容易。怎么, 我听到你问?简单。
首先, 让我们安装一个名为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的生态系统的普及, 如果它迅速迅速成为流行的操作系统, 我不会感到惊讶。你怎么看待这件事?在评论中让我知道。