当前位置: 首页 > 科技观察

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

时间:2023-03-13 11:34:52 科技观察

我想你们大多数人都听说过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内核  这可能看起来不多,Linux是大多数服务器使用的操作系统。由于NodeOS基于Linux内核,您可以使用为其他Linux发行版开发的应用程序,只需进行最小的修改。  坏消息  我非常希望NodeOS成为一个成品,然而,现在还没有。它仍然缺少服务器操作系统所必需的一些关键功能。例如,缺少完整的BASH工具集,包括ps、tail、nano和grep。更糟糕的是,您也不能将它用作桌面操作系统,因为它没有GUI。当然,您可以只用一点点JavaScript来实现一些缺少的功能,但遗憾的是这些功能在默认情况下都不存在。  好!那我可以试试NodeOS吗?  使用Docker体验  最简单快捷的NodeOS体验方法如下:  1.一台运行MacOSX或Linux的电脑,也许Windows也可以,但我没试过。  2。码头工人。  一旦安装了Docker,运行NodeOS实例就很容易了。你只需要执行下面的命令,Docker就会为你完成所有的魔法。sudodockerrun-t-inodeos/nodeos  体验NodeOS最简单快捷的方式就是通过Docker  当你运行上面的命令时,Docker会自动从仓库下载NodeOS镜像并安装到虚拟环境中。安装后,它会打开一个到NodeOS的SSH会话。  不会用docker吗?  在某些情况下,你可能无法使用Docker来体验,或者你想体验最新版本的NodeOS。在撰写本文时,NodeOS镜像是两个月前构建的,开发版本是六天前更新的。所以,如果你想使用最新的版本,你应该从源代码开始。这不是太困难,但需要一些时间。你需要:  1。运行Linux的计算机。你可以在OSX上编译它,但是跨平台编译需要很多时间,Windows也是如此。  2。Linux编译构建相关工具(make、g++、gcc、autoconf)。  3。Qemu。  4。时间,真的需要很多。  万事俱备,就可以从源码开始编译了:  1.下载项目源码:bashgitclonegit@github.com:NodeOS/NodeOS.git。  2。使用以下命令编译:cdNodeOS和npminstall。  3。我从它的官方文档中逐字引用:“拿点爆米花去看电影,不开玩笑,真的。”,是的,这需要很多时间,去做一些有趣的事情吧!  4。执行bashnpmstart以在Qemu中运行NodeOS。  有用吗?  安装完成后,我们可以通过在NodeOSshell中执行ls命令来检查它是否有效。输出类似如下:['etc','lib','lib64','root','bin','sys','usr','share','proc']  如果是显示如上,解释一下Basiccommandsworknow.但是如果我们想知道网卡地址呢?在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('blessed');  像在Node.js中一样,require()函数将选定的包加载到内存中并将其保存为特定变量。vararg=process.argv[2]||'bin-man';  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);  BlessedYes一个非常简单的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);屏幕.render();});  我们使用箭头键上下滚动,空格键,f,j或n向下翻页,b,k或p向上翻页。box.focus();  screen.render();  *****,我们让应用程序将输入集中在我们创建和渲染所有内容的框上。  将上面编辑好的文件存放在/lib/node_modules/bin-man目录下(命名为man.js),添加一个简单的README.md,类似如下:#Man  作者:@groundwater  ##安装  npkginstallbin-man  ##用法  ```  用法:manPKGNAME  DisplayapackagesREADME.mdfile  ```  我们几乎完成了我们的第一个NodeOS定制应用程序。***还有一小步,我们需要创建一个NodeOS应用程序需要的配置文件。很简单,将其创建到/etc/bin-man/config.json中,内容只是一个空的JSON对象:{}。  现在,我们可以试用我们的新应用程序了。在NodeOS中运行man,它将显示我们之前创建的自述文件。  总结  如你所见,在NodeOS中实现任何东西都很容易,你只需要知道Node.js。  NodeOS具有很大的潜力,我认为当实现更多功能时它将成为一个很棒的操作系统。还有很多工作要做,但随着整个Node.js生态系统的蓬勃发展,如果有一天它很快成为一个流行的操作系统也就不足为奇了。  你怎么看?发表您的评论并让我们知道。