JavaScriptでx86のPCをエミュレートし、その上でLinuxを動作させるデモ「Javascript PC Emulator」(通称jslinux)が2011年5月16日に公開された。この不思議なソフトはどう実現されているのか、早速調べた。

 Javascript PC Emulatorは、Linuxのコンソールを真似るのではなく、実物のLinuxカーネルとユーザーランド(アプリケーション)が、JavaScriptで作った仮想PCで動くという驚きのソフトウエアである。

 作者は、仮想化ソフト「QEMU」の原作者であるFabrice Bellard氏だ。Bellard氏は、さまざまな動画や音声を変換できるツール「FFmpeg」や、コンパイル時間が短くてサイズの小さいCコンパイラ「TCC」など、CPUに近い部分の技術を生かしたソフトを作っている凄腕ハッカーだ。

 実際にWebサイト(http://bellard.org/jslinux/)にアクセスすると、誰でも試せる。アクセスするとWebブラウザ上に黒い四角の領域が表示され、Linuxの起動メッセージが表示されたあと、rootのプロンプトが表示される。ここで実際にコマンドを打ってLinux環境を利用できる(写真1)。

写真1 Javascript PC EmulatorにUbuntu 11.04のFirefox 4でアクセスしたところ 仮想コンソールに表示された起動メッセージの下にrootのプロンプトが表示されている
写真1 Javascript PC EmulatorにUbuntu 11.04のFirefox 4でアクセスしたところ 仮想コンソールに表示された起動メッセージの下にrootのプロンプトが表示されている
[画像のクリックで拡大表示]

 筆者は、動作環境となるWebブラウザとしてFirefox 4、Google Chrome/Chromium 11、Opera 11.11、Safari 5.0、Internet Explorer(IE) 9で動作することを確認した。ただし、Google Chrome 12 Betaでは起動途中で止まってしまったほか、IE8ではJavaScriptがエラーとなった。

 コマンドラインから確認すると、仮想PCのメモリーは16Mバイト、仮想ハードディスクは2Mバイトが見える。Linuxカーネルは2.6.20。ユーザーランドは「Buildroot」で組み立てられており、シェルを含む各種コマンドには、組み込み用途の「BusyBox」を利用。また、CコンパイラのTCCも用意されており、libcには「uClibc」が使われている。

 デバイスは最小限のみで、ネットワークカードもない。Bellard氏の解説によると、「仮想NIC自体はそれほど難しくないが、ほかのホストと通信するのが問題」とのことだ。仮想CPUも、FPU/MMX/SSEがないほか、リアルモードがないなど、最小限の仕様になっている。

 5月20日付けのバージョンでWebページのHTMLソースを確認すると、3つのJavaScriptファイルを呼び出していることが分かる。PCエミュレータの本体は「cpux86-ta.js」または「cpux86.js」で、WebブラウザがサポートするJavaScriptの機能を判断して、どちらを読み込むかを切り換えている。

 仮想コンソールを表示しているのが「term.js」で、Bellard氏の解説によると、既存の「termlib.js」を基に改造を加えたものだ。「jslinux.js」がPCエミュレータと仮想コンソールを初期化し、Linuxのカーネルや起動ディスクなどをサーバーから読み込んで、Linuxを起動している。

 jslinux.jsが読み込んでいるのは、Linuxカーネルの「vmlinux26.bin」、ext2のディスクイメージの「root.bin」、ブートローダーの「linuxstart.bin」の3つだ。root.binはLinuxから普通にループバックマウントできるため、root.binにソフトウエアを追加する改造も複数公開されている。

 なお、解説ページでは、カーネルへのパッチやブートローダーのソースなどが含まれたアーカイブが公開されている。実際にvmlinux26.binとlinuxstart.binを生成するためのMakefileも含まれている。