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

![webvmio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486144/e5ef1e03-7da0-8273-cb00-0c9a2819340c.png)

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

![1_en0eK_11xULHPZftaG7aPQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486144/4ccf809a-afdc-e09d-8e9c-000d1d3ce1fc.png)

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

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

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

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

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

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

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

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

**では、CheerpXとは何か？**

[CheerpX](https://leaningtech.com/cheerpx/)は、C++で書かれ、[Cheerp](https://leaningtech.com/cheerp/)コンパイラでJavaScriptとWebAssemblyの組み合わせにコンパイルされたx86仮想マシンです。

CheerpXは3年以上前から開発されており、レガシーなAdobe Flashコンテンツを実行するためのエンタープライズ向けソリューションである[CheerpX for Flash](https://leaningtech.com/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で何ができますか？**

[デモ](https://webvm.io/)をご覧いただければお分かりになると思います。不安な場合は、こちらをお試しください：
![スクリーンショット 2023-08-21 105118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486144/55d1b22b-6e40-0df0-47f2-7b4287b77461.png)

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

**どこで実行できますか？**

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

**これで全部ですか？**

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

**Web**：https://leaningtech.com/cheerpx

[引用元](https://leaningtech.com/webvm-server-less-x86-virtual-machines-in-the-browser/)

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