NodeOS:JavaScriptベースのオペレーティングシステム
公開: 2022-03-11ほとんどのプログラマーはNode.jsについて聞いたことがあると思いますが、NodeOSについてはどうでしょうか。 はい、NodeOS、Node.jsで記述されたオペレーティングシステムです。 まあ、ちょっと。 NodeOSは、ハードウェアの相互作用など、パフォーマンスが重要なほとんどの処理にLinuxカーネルを使用しますが、それ以外の場合はNode.jsを使用します。 NodeOSの開発は2年前に始まり、 「Node.jsだけを使用してオペレーティングシステムを作成することは可能ですか?」というシンプルで興味深いアイデアを共有する人々によって作成されました。
大したことは何ですか?
まず、Node.jsが短期間で進歩したことを考えてみてください。 ここで、オペレーティングシステムで起こっているのと同じことを考えてみてください。 次に、それにいくつかのクールなものを追加しましょう。
ユーザーごとに独立した分離されたルートファイルシステム
NodeOSは、興味深いパラダイムを導入しました。すべてのユーザーが分離されたファイルシステムを持っている場合、それはユーザーに操作するための単純なファイルシステム階層を提供します。 実際、「ホームフォルダ」は独自のファイルシステム階層のルートであるため、特別な権限を必要とせずにパッケージをグローバルにインストールでき、デフォルトでホームディレクトリにインストールされるため、何も設定する必要はありません。 また、かなりのセキュリティを提供します。 ハッカーがオペレーティングシステムの特定のアカウントに侵入する方法を見つけた場合、ハッカーがアクセスできる唯一のパーティションはそのユーザーのパーティションです。 その結果、ハッカーはシステム全体を危険にさらすことはできません。
Node.jsとNPM
考えてみれば、Node.jsを使用するオペレーティングシステムは、NPMで利用可能なすべてのパッケージが同時にNodeOSパッケージでもあることを意味します。 これを書いている時点では、210,735個のパッケージがあります。 NPMパッケージの数は毎分増えるので、数年以内にNodeOSに100万のアプリケーションがあったとしても不思議ではありません。
Linuxカーネルに基づいています
これは大したことではないように思われるかもしれませんが、Linuxは最も使用されているサーバーオペレーティングシステムです。 NodeOSはLinuxカーネルに基づいているため、最小限の変更で他のLinuxディストリビューション用に作成されたすべてのアプリケーションを実行できます。
欠点
完成したNodeOSが欲しいのですが、まだありません。 サーバーオペレーティングシステムの多くの重要な機能がまだ不足しています。 たとえば、ps、tail、nano、grepを含むBASHツールセット全体が欠落しています。 さらに、GUIがないため、デスクトップオペレーティングシステムとして実行することはできません。 確かに、JavaScriptを少し使用して、不足している機能の一部をかなり簡単に実装できますが、前述のすべての機能がデフォルトで使用できないという事実は良くありません。
では、どうすればNodeOSを試すことができますか?
Dockerの使用
NodeOSを試す最も簡単で迅速な方法は、次を使用することです。
- MacOSXまたはLinuxのいずれかを搭載したコンピューター。 Windowsでも動作するかもしれませんが、試してみませんでした。
- Docker。
Dockerをインストールすると、NodeOSのインスタンスを簡単に実行できます。 次のコマンドを実行するだけで、Dockerがすべての魔法を実行します。
sudo docker run -t -i nodeos/nodeos
前述のコマンドを実行すると、DockerはNodeOSのディスクイメージをリポジトリから自動的にダウンロードし、仮想マシン内にNodeOSのインストールを実行します。 インストールが完了すると、NodeOSシェルへのSSHセッションが開きます。
Dockerなし
Dockerの使用を避けたい理由はいくつかあり、そのうちの1つは最新のNodeOSバージョンです。 執筆時点では、NodeOSのDockerイメージへの最後の変更は2か月前に行われ、開発バージョンは6日前に更新されました。 したがって、最新バージョンを使用する場合は、必ずソースコードを入手する必要があります。 それほど難しいことではありませんが、時間がかかります。 必要になるだろう:
- Linuxを搭載したコンピューター。 OS Xでコンパイルできますが、クロスコンパイルする必要があるため、時間がかかります。 同じことがWindowsにも当てはまります。
- Linuxビルドユーティリティ(make、g ++、gcc、autoconf)。
- Qemu。
- 時間。 真剣に、たくさん。
すべてが揃ったら、ソースコードのコンパイルに進むことができます。
- プロジェクトのソースコードをダウンロードします:
bash git clone [email protected]: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には、ノードのNPMに基づいており、使いやすいnpkg
と呼ばれる統合パッケージマネージャー( apt
やyum
など)があります。 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には、他のコマンドのマニュアルページを表示するためにLinuxで使用されるコマンドman
のデフォルトの実装がありません。 恐れることはありません。実装は簡単です。 どのように、私はあなたが尋ねるのを聞きますか? 単純。

まず、Hipsterというテキストエディタをインストールして、次のコマンドを実行してファイルを作成および編集できるようにします: npm install -g [email protected]
。 このファイルエディタはシンプルで、他のエディタとして使用するものではありませんが、この場合は十分です。 Hipsterを使用したファイルの作成は非常に簡単で、 hip filename
のようにhip package.json
を実行するだけです。 保存するにはCtrl + s
を押し、終了するにはCtrl + q
を押します。 この例では、主要なNodeOS開発者の1人によって開発されたコードを使用しますが、実際には実装していません。 この例の元のコードは、node-bin-manGitリポジトリにあります。
最初の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" } }
パラメータのname
、 version
、 author
、 repository
、 license
、およびdescription
は一目瞭然です。 bin
コレクションは、コマンド名と関連するJavaScriptファイルを含むJSONキー/値オブジェクトです。 この例では、 man
コマンドはファイルman.js
に関連付けられています。 コレクションのdependencies
には、このアプリケーションを使用するために必要なNPMパッケージのリストが含まれています。 この例では、コードの作成者に、Node.js用の高レベルのターミナルインターフェイスAPIを備えた呪いのようなライブラリであるBlessedが含まれています。
それでは、主要部分である実際のコードに移りましょう。
#!/usr/bin/env node
この部分は「シバン」と呼ばれます。 NodeOSでは実際には必要ありませんが、オペレーティングシステムに次のコードの実行方法を指示します。 この場合、コマンド/usr/bin/env node
ですべてを実行する必要があることをインタープリターに通知します。
var fs = require('fs'); var blessed = require('blessed');
Node.jsの場合と同様に、関数require()
は、選択されたパッケージをメモリにロードし、指定された変数に保存します。
var arg = process.argv[2] || 'bin-man';
man
コマンドの標準的な動作は、他のコマンドが指定されていない場合に、それ自体についてマニュアルに通知することです。 コード例も同じことをしています。2番目のパラメーター(最初は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); }
この時点で、プログラムは指定されたアプリケーションのreadmeファイルが存在するかどうかを確認します。 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があります。 ファイルのコンテンツを表示するのは、 box
を作成してコンテンツをロードするように指示するのと同じくらい簡単です。
screen.key(['escape', 'q', 'C-c'], function(ch, key) { return process.exit(0); });
それでは、 man
アプリケーションを終了する方法を作成しましょう。 キーescape
、 q
、またはemacsスタイルの組み合わせCc
を組み合わせて、プロセスを終了します。
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(); });
方向キーを使用して1行上または下にスクロールし、キーspace
、 f
、 j
、またはn
を使用してページを下にスクロールします(画面上の行数と同じ数)。 逆を行うには、 b
、 k
、またはp
を使用します。
box.focus(); screen.render();
最後に、作成したbox
に焦点を合わせて全体をレンダリングするようにアプリケーションに指示します。 これらのファイルをディレクトリ/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の最初のカスタムアプリケーションはほぼ完成しました。 最後の小さなステップは1つだけ残っています。 NodeOSアプリケーションの要件であるため、構成ファイルを作成する必要があります。 パス/etc/bin-man/config.json
に次の内容のファイルを作成するのと同じくらい簡単です: {}
、空のJSONオブジェクト。 これで、新しいアプリケーションを試すことができます。 NodeOSシェル内でman
を実行すると、前に作成したreadmeファイルが表示されます。
結論
簡単なコード例でわかるように、NodeOSに何かを実装するのは簡単な作業であり、Node.jsを知っていれば十分です。
NodeOSには多くの可能性があり、追加機能が実装されれば、NodeOSは優れたオペレーティングシステムになる可能性があると思います。 まだ作業が必要ですが、Node.jsベースのエコシステム全体が人気を博しているため、すぐに人気のあるオペレーティングシステムになっても驚かないでしょう。 あなたはそれについてどう思いますか? コメントで教えてください。