ほとんどのプログラマーは聞いたことがあると思います Node.js 、しかしどうですか NodeOS ?はい、NodeOS、Node.jsで記述されたオペレーティングシステムです。まあ、ちょっと。 NodeOSは、ハードウェアの相互作用など、パフォーマンスが重要なほとんどの処理にLinuxカーネルを使用しますが、それ以外のすべての処理にはNode.jsを使用します。 NodeOSの開発は2年前に始まり、シンプルでありながら興味をそそるアイデアを共有した人々によって作成されました。 「Node.jsのみを使用してオペレーティングシステムを作成することは可能ですか?」
ソフトウェア製品の価格設定方法
まず、Node.jsが短期間で進歩したことを考えてみてください。ここで、オペレーティングシステムで起こっているのと同じことを考えてみましょう。次に、いくつかのクールなものを追加しましょう。
NodeOSは、興味深いパラダイムを導入しました。すべてのユーザーが分離されたファイルシステムを持っている場合、それはユーザーに操作するための単純なファイルシステム階層を提供します。実際、「ホームフォルダー」は独自のファイルシステム階層のルートであるため、特別なアクセス許可を必要とせずにグローバルにパッケージをインストールでき、デフォルトでホームディレクトリにインストールされるため、何も構成する必要はありません。また、かなりのセキュリティを提供します。ハッカーがオペレーティングシステムの特定のアカウントに侵入する方法を見つけた場合、ハッカーがアクセスできる唯一のパーティションはそのユーザーのパーティションです。最終結果はハッカーです できません システム全体を危険にさらします。
あなたがそれについて考えるならば、Node.jsを使用するオペレーティングシステムは、NPMで利用可能なすべてのパッケージが同時にNodeOSパッケージでもあることを意味します。これを書いている時点では、210,735個のパッケージがあります。 NPMパッケージの数は毎分増加するため、数年以内にNodeOSに100万のアプリケーションがあったとしても不思議ではありません。
これは大したことではないように思われるかもしれませんが、Linuxは最も使用されているサーバーオペレーティングシステムです。 NodeOSはLinuxカーネルに基づいているため、最小限の変更で他のLinuxディストリビューション用に作成されたすべてのアプリケーションを実行できます。
完成したNodeOSが欲しいのですが、まだありません。サーバーオペレーティングシステムの多くの重要な機能がまだ不足しています。たとえば、ps、tail、nano、grepを含むBASHツールセット全体が欠落しています。さらに、GUIがないため、デスクトップオペレーティングシステムとして実行することはできません。確かに、JavaScriptを少し使用すれば、不足している機能のいくつかをかなり簡単に実装できますが、前述のすべての機能がデフォルトで使用できるわけではないという事実は良くありません。
NodeOSを試す最も簡単で迅速な方法は、次を使用することです。
Dockerをインストールすると、NodeOSのインスタンスを簡単に実行できます。次のコマンドを実行するだけで、Dockerがすべての魔法を実行します。
sudo docker run -t -i nodeos/nodeos
前述のコマンドを実行すると、DockerはNodeOSのディスクイメージをリポジトリから自動的にダウンロードし、仮想マシン内にNodeOSのインストールを実行します。インストールが完了すると、NodeOSシェルへのSSHセッションが開きます。
Dockerの使用を避けたい理由はいくつかあり、そのうちの1つは最新のNodeOSバージョンです。これを書いている時点では、NodeOSのDockerイメージへの最後の変更は2か月前に行われ、開発バージョンは6日前に更新されました。したがって、最新バージョンを使用する場合は、必ずソースコードを入手する必要があります。それほど難しいことではありませんが、時間がかかります。必要になるだろう:
すべてが揃ったら、ソースコードのコンパイルに進むことができます。
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には、apt
と呼ばれる統合パッケージマネージャー(yum
やnpkg
など)があります。これは、NodeのNPMに基づいており、使いやすいです。インストールifconfig
次のコマンドを実行するのと同じくらい簡単です。
npkg install bin-ifconfig
すべてがうまくいけば、コマンドifconfig
これでシェルで使用できるようになります。もう一度実行しようとすると、次のような出力が表示されます(明らかな理由でランダムなMACアドレスとIPアドレスを入力しました)。
eth0: flags=8863 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 media: autoselect status: active
出力がそのように見える場合は、機能しています。これで、最初のNodeOSアプリケーションifconfig
が正常にインストールされました。
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スタイルの組み合わせ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(); });
方向キーを使用して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オブジェクト。これで、新しいアプリケーションを試すことができます。実行中man
NodeOSシェル内には、前に作成したreadmeファイルが表示されます。
簡単なコード例でわかるように、NodeOSに何かを実装するのは簡単な作業であり、Node.jsを知っているだけで済みます。
NodeOSには多くの可能性があり、追加機能が実装されれば、NodeOSは優れたオペレーティングシステムになる可能性があると思います。まだ作業が必要ですが、Node.jsベースのエコシステム全体が人気を博しているため、すぐに人気のあるオペレーティングシステムになっても驚かないでしょう。あなたはそれについてどう思いますか?コメントで教えてください。