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)。
筆者は、動作環境となる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も含まれている。