見出し画像

WebVM: ブラウザでサーバーレスのx86仮想マシン

TL;DR - 変更されていないDebianバイナリをブラウザで実行するサーバレスの仮想Linux環境を作りました。これは、WebAssembly仮想化プラットフォームCheerpXで動いています。気軽に試してバグを報告してください: https://webvm.io

WebVM - HTML5/WebAssemblyで完全にクライアントサイドで動作するサーバーレス仮想Linux環境。
Webプラットフォームは、アプリケーション・ディストリビューションのための支配的なプラットフォームへの道を順調に進んでいる。WebAssemblyは、すべてのモダンブラウザでサポートされ、大規模なWebアプリケーションのパフォーマンスニーズを満たすように設計された新しいプログラミング言語です。

WebAssemblyは、視点と責任の転換とともに、ブラウザの世界に真の革新をもたらします。

エンジンは従来、人間が書いたJavaScriptから(潜在的に貧弱な)パフォーマンスを絞り出すことを期待されていました。一方、WebAssemblyはコンパイルの対象として設計されています。高いレベルの実行時パフォーマンスを達成することは、主にそれを生成するコンパイラの責任です。WebAssemblyを実行するとき、エンジンは高価なチェックを避け、高品質のネイティブ・コードを素早く生成することができます。最終的には、これによってWeb経由でより複雑なアプリケーションを提供できるようになります。

WebAssemblyを生成するツールチェーンの大部分はネイティブであり、前もって使用されますが、これは必須条件ではありません。実際のところ、JITコンパイルされたWebAssemblyは、ブラウザであらゆるアプリケーションを実行するというビジョンを実現するための真の鍵であると、私たちは信じています。

Leaning Technologiesの使命は、既存のアプリケーションを変更せずに実行できるようにすることです:

・修正なし;
・再コンパイルなし;
・完全にクライアントサイドで

数ヶ月前、私たちはREPLのデモを公開し、私たちのCheerpX x86-to-WebAssembly仮想化技術を使えば、言語固有の介入なしに、ブラウザ上で複数の異なるREPLを実行できることを証明しました。

本日、私たちのビジョンの実現に向けた大きな一歩を発表できることを誇りに思います: WebVMは、CheerpXによって実現された、ブラウザ上で動作する完全なDebianベースの仮想マシンです。

では、CheerpXとは何か?

CheerpXは、C++で書かれ、CheerpコンパイラでJavaScriptとWebAssemblyの組み合わせにコンパイルされたx86仮想マシンです。

CheerpXは3年以上前から開発されており、レガシーなAdobe Flashコンテンツを実行するためのエンタープライズ向けソリューションであるCheerpX for Flashの一部として、すでに本番環境で使用されています。

CheerpXの主な構成は以下の通りです。

・めったに実行されないコードを実行し、JITコンパイルを導くためにホットコードの構造を発見するために使用されるx86用の効率的なインタプリタ

・ホットなx86コードから新しいWebAssemblyモジュールをオンザフライで生成する、洗練されたx86-to-Wasm JITコンパイラ。JITコンパイラはx86に特化したロジックを持っていますが、ほとんどターゲットに依存しません。

Linux syscallsエミュレーション・レイヤーは、未修正のx86バイナリとWeb環境とのギャップを埋めるために使用されます。

・Ext2ベースのブロックベースのファイルシステムバックエンド。ディスクイメージは、HTTPとCloudFlare CDNを介して配布される静的リソースです。Ext2は実績のある設計と拡張性から選ばれ、全面的な書き換えをしなくても、よりモダンなExt3やExt4フォーマットと互換性を持つように、時間をかけて簡単に機能を拡張することができます。

・IndexedDBをベースとした、変更されたブロックのプライバシーを保護するストレージ。このクライアントサイドのみの技術により、ファイルシステムに加えられた変更はブラウザに対してのみ永続化されます。私たちはあなたのデータを見たり保存したりしません。

CheerpXは、多くの可動部分を持つ非常に複雑なシステムです。自己修正コード、マルチスレッド、マルチプロセシング、プロセス間通信などのトリッキーな状況を正しく処理します。この複雑さにもかかわらず、CheerpXはすでに高い安定性に達している。

今こそ、最も複雑なデモをリリースする絶好のタイミングだと感じています: WebVMです。

では、WebVMとは何か?

もしあなたが以前のREPLデモを見たことがあるなら、WebVMが概念的にあまり変わっていないことに気づくかもしれません。同じコア・コンポーネントが使われています:

実行エンジンとして CheerpX。JavaScriptのAPI、特にcx.run(...)は、bashプロセスを起動する(必要であれば再起動する)ために使われます。

メインUIコンポーネントとしてのXterm.js。Xterm.jsは、vimなどのアプリケーションで使われるターミナル・エスケープを解釈し、ユーザー入力をCheerpXに送り返します。入力は、アプリケーションの標準入力ファイル記述子を介して利用可能になります。

ext2フォーマットで、たくさんのパッケージがインストールされたDebianバスターディスクイメージ。これは、スケーラビリティを最大化するためにCDN経由で配布されます。

WebVMは事実上サーバーレスで、アクティブなサーバー側コンポーネントを持たない。すべてのユーザーがCDNから同じディスクイメージにアクセスし、個々の変更はブラウザにローカルに保存される。これは、最小限のコストとリソースで、数百万人の同時ユーザーをサポートできることを意味する。

これまでのデモは、CheerpXの進歩のスナップショットであり、技術の可能性を示すものでした。WebVMは、時間をかけて進化させていく生きたデモだと考えている点で異なります。バグ報告やフィードバックは、複数のチャンネルで大歓迎です:

GitHub issues: https://github.com/leaningtech/webvm/issues

Gitterチャット:https://gitter.im/leaningtech/cheerpx

CheerpXは今のところ、比較的コントロールされた形でしかユーザーに公開されていません。一度に一つのアプリケーションを。WebVMは、私たちが本当に広く一般にコントロールを提供する最初の機会であり、問題が発生することを期待しています。しかし、一般からのフィードバックによって、より多くのバグを発見することが可能になり、最終的には、より堅牢なソリューションを提供することができます。

今、WebVMで何ができますか?

デモをご覧いただければお分かりになると思います。不安な場合は、こちらをお試しください:

# Run a short python program
python3 examples/python3/fibonacci.py# Compile a small C example using gcc
gcc -o helloworld examples/c/helloworld.c# Run it!
./helloworld# Dump the code, to verify this is actually an x86 binary
objdump -d ./helloworld# Edit the helloworld.c file, and try again
vim examples/c/helloworld.c

さまざまな言語のサンプルファイルがexamplesディレクトリにあります。何らかの理由でgccを使いたくない場合は、clangも自由に試してください!

どこで実行できますか?

WebVMとCheerpXは、デスクトップ(Chrome/Chromium、Edge、Firefox、Safari)、モバイル(Chrome、Safari)の両方で、SABのサポートがあり、デバイスに十分なメモリがあれば、どのブラウザとも互換性があります。

これで全部ですか?

WebVMのこのリリースは、本当に最初のステップに過ぎません。私たちはWebVMを時間をかけて改善し、進化させることを計画しており、ユーザーからのフィードバックが私たちの努力の指針となります。

短期的には、WebVMとCheerpXの次の機能のパイプラインはこんな感じです:

HTTPサーバー(マイクロサービス): サービスワーカーと仮想化TCPソケットを組み合わせることで、WebVM内のHTTPサーバーにブラウザからアクセスできるようにします。JavaScriptのAPIが公開され、iframeを内部サーバーに接続できるようになる。これは、現在のデモページでは公開されていませんが、すでにほぼサポートされています。サービスワーカーもフェッチ/XHRリクエストを処理するので、同様のソリューションはRESTマイクロサービスをサポートするためにも使用できる

グラフィカルなLinuxアプリケーション: CheerpXは間もなく、XorgアプリケーションをWebVMで実行できるようにする。Xorgは、すでにサポートされているUNIXソケットを介してXクライアントと通信します。実際にグラフィックを表示するには、Xorgが通信できるLinuxデバイスをエミュレートする必要があります。最良の解決策はKMSデバイスを使うことだと思われる。Xorgが使用できるフレームバッファを割り当てて、それをHTML5 canvasにブライトして表示させるだけです。

Windowsアプリケーションとゲーム: Windows APIライブラリのバイナリ互換再実装であるWINEを使用。Xorgと同様に、WINEはUNIXソケットを使用して、Windowsカーネルとほぼ同等のwineserverとアプリケーションを連携させます。CheerpXのサポートに関しては、WINEはプロセスのアドレス空間を注意深く制御する必要があるため、我々のmmap実装には微調整が必要かもしれません。UNIXソケットのいくつかの特殊な機能、例えばファイルディスクリプタの受け渡しなどについても、いくつかの作業が必要になるかもしれません。それでも、これらは全て既存のインフラに対する小さな改善でしょう。

私たちと同じようにWebVMをエキサイティングなものだと感じていただけることを願っています。

私たちのテクノロジーに最適なユースケースをお持ちですか?お気軽にご連絡ください:

Email::info@leaningtech.com | alessandro@leaningtech.com

X (Twitter):: https://twitter.com/leaningtech | https://twitter.com/alexpignotti

チャットサポート: https://github.com/leaningtech/cheerpx

Webhttps://leaningtech.com/cheerpx

引用元

https://leaningtech.com/legacy-modernisation-jp/


いいなと思ったら応援しよう!