我想你们大多数人都听说过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,000个包,并且每分钟都在增长。几年后NodeOS拥有百万应用程序也就不足为奇了。基于大多数服务器使用的操作系统Linux内核,这可能看起来不太像。由于NodeOS基于Linux内核,您可以使用为其他Linux发行版开发的应用程序,只需进行最小的修改。坏消息我非常希望NodeOS成为一个成品,然而,现在还没有。它仍然缺少服务器操作系统所必需的一些关键功能。例如,缺少完整的BASH工具集,包括ps、tail、nano和grep。更糟糕的是,您也不能将它用作桌面操作系统,因为它没有GUI。当然,您可以只用一点点JavaScript来实现一些缺少的功能,但遗憾的是这些功能在默认情况下都不存在。好的,我可以试试NodeOS吗?使用Docker体验NodeOS最简单快捷的方法如下:运行MacOSX或Linux的计算机,也可能是Windows,但我没有尝试过。码头工人。一旦安装了Docker,运行NodeOS实例就很容易了。你只需要执行下面的命令,Docker就会为你完成所有的魔法:sudodockerrun-t-inodeos/nodeos体验NodeOS最简单和最快的方法是通过Docker。当您运行上述命令时,Docker会自动从存储库下载NodeOS映像并将其安装到虚拟环境中。安装后,打开与NodeOS的SSH会话。没有docker怎么办?在某些情况下,你可能无法使用Docker来体验,或者你想体验最新版本的NodeOS。在撰写本文时,NodeOS镜像是两个月前构建的,开发版本是六天前更新的。所以,如果你想使用最新的版本,你应该从源代码开始。这不是太困难,但需要一些时间。您需要:一台运行Linux的计算机。你可以在OSX上编译它,但是跨平台编译需要很多时间,Windows也是如此。Linux编译构建相关工具(make、g++、gcc、autoconf)。Qemu。时间,真的很费时间。如果一切就绪,就可以从源码开始编译了:下载项目源码:bashgitclonegit@github.com:NodeOS/NodeOS.git。使用以下命令编译:cdNodeOS和npminstall。我是从官方文档中逐字引用的:“拿点爆米花去看电影,不是开玩笑,真的。”,是的,这需要很多时间,去做一些有趣的事情。执行bashnpmstart以在Qemu中运行NodeOS。准备好工作了?安装完成后,我们可以在NodeOSshell中执行ls命令查看是否有效。输出类似如下:['etc','lib','lib64','root','bin','sys','usr','share','proc']如果显示为以上,解释了一些准备工作的基本命令。但是如果我们想知道网卡地址呢?在Linux下,这个命令是ifconfig,我们试试:commandnotfound:ifconfig貌似没有ifconfig命令。这是因为NodeOS默认没有ifconfig命令。我们现在应该做什么?很简单,NodeOS有一个集成的包管理器(类似于apt或yum),叫做npkg,它基于Node的NPM并且易于使用。可以使用以下命令轻松安装ifconfig:npkginstallbin-ifconfig如果一切顺利,现在可以在shell中使用ifconfig命令。我们再尝试执行一下,输出类似如下:(我换了MAC地址):eth0:flags=8863mtu1500ether01:23:45:67:89:abinet6f0cd::ef01:0203:0405:181%en1prefixlen64scopeid0x5inet192.168.0.21netmask0xffffff00broadcast192.168.0.21nd6options=1media:autoselectstatus:active如果您的输出与上面类似,则它正在运行。您已经成功安装了您的第一个NodeOS应用程序:ifconfig。它可以工作,但是我们可以用这个操作系统做什么呢?如果我们只能用这个用Node.js编写的操作系统做你可以用Ubuntu或其他Linux发行版做的相同(或更少)的事情,那有什么价值呢?实际上,整个事情最有趣的部分是一切都是在Node.js中开发的。这意味着我们可以仅使用Node.js开发我们的应用程序。例如,NodeOS中没有默认实现的man命令,用于显示其他命令的帮助信息。别担心,实现起来很简单。使用Node.js构建NodeOS应用程序首先让我们安装一个名为Hipster的文本编辑器,以便我们可以创建和编辑文件。执行以下命令:npminstall-ghipster@0.15.0。这个文本编辑器非常简单,除了文本编辑什么也做不了,但是对我们来说已经足够了。使用Hipster创建文件非常简单,只需运行hipfilename,例如:hippackage.json。要保存文件,请按Ctrl+s,要退出,请按Ctrl+q。在这里,我们使用的是一位主要NodeOS开发人员开发的代码,我实际上并没有自己开发应用程序。我们示例的原始代码可以在node-bin-manGit存储库中找到。让我们回过头来创建我们的第一个NodeOS应用程序。像每个Node.js应用程序(或NPM包)一样,我们首先创建一个包含以下内容的package.json文件:{"name":"bin-man","version":"0.0.1","description":"Formatanddisplaymanualpages","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/envnode这部分称为shebang。NodeOS实际上并不需要它,但它用于告诉操作系统如何执行下面的代码。这里的意思是告诉系统下面的每一行代码都需要通过/usr/bin/envnode命令来解释执行。varfs=require('fs');varblessed=require('祝福');与在Node.js中一样,require()函数将选定的包加载到内存中并将其保存为特定变量。vararg=process.argv[2]||'bin-man';如果没有指定命令,man命令的标准行为是显示它自己的帮助。在我们的代码示例中也是如此:如果没有给出第二个参数(第一个参数是man本身),那么该参数的默认值为bin-man。varpath=process.env.HOME+"/lib/node_modules/"+arg+"/README.md";try{varreadme=fs.readFileSync(path,'utf-8');}catch(e){console.log('NoREADME.mdforPackage',arg);process.exit(-1);}这里,程序检查给定的应用程序是否有自述文件。在NodeOS中,各个应用程序的安装路径是其主目录(/)下的lib/node_modules。如果README.md文件存在,将其内容存储在readme变量中。否则,显示错误信息并退出。//Createascreenobject.varscreen=blessed.screen();varbox=blessed.box({content:readme,alwaysScroll:true,scrollable:true,});//Appendourboxtothescreen.screen.append(box);Blessed有一个非常简单的API,显示文件内容非常容易,只需创建一个框并加载内容即可。screen.key(['escape','q','C-c'],function(ch,key){returnprocess.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);屏幕。使成为();});我们使用箭头键上下滚动,使用空格键、f、j或n向下翻页,使用b、k或p向上翻页。box.focus();screen.render();***,我们让应用程序将输入集中在我们创建和渲染所有内容的框上。将上面编辑好的文件存放在/lib/node_modules/bin-man目录下(名为man.js),添加一个简单的README.md,类似如下:#ManAuthor:@groundwater##Installnpkginstallbin-man##Usage```用法:manPKGNAMEDisplayapackagesREADME.mdfile```我们几乎完成了我们的第一个NodeOS自定义应用程序。***还有一小步,我们需要创建一个NodeOS应用程序需要的配置文件。很简单,创建到/etc/bin-man/config.json,内容就是一个空的JSON对象:{}。现在我们可以试用我们的新应用程序了。在NodeOS中运行man,它将显示我们之前创建的自述文件。总结如您所见,在NodeOS中实现任何东西都很容易,您只需要了解Node.js。NodeOS有很大的潜力,我认为当实现更多功能时,它将成为一个很棒的操作系统。还有很多工作要做,但随着整个Node.js生态系统的蓬勃发展,如果有一天它很快成为一个流行的操作系统也就不足为奇了。你怎么认为?通过发表您的评论让我们知道。