jslinuxで遊んでみる

はじめに

javascriptlinuxが動くjslinuxが公開されて1ヶ月が経ちました.人の噂も75日とはよく言ったもので,すでに話題にもあがらなくなってきましたね.多少新鮮度は落ちたとはいえ,面白い物は面白いってことで,ちょっと遊んでみることにしました.

でっかくしてみる

小飼さんのブログでjslinuxと戯れる方法がでています.ここにも書いてあるんですが,デフォルトのkernelではroot.binのサイズを4096KBより大きくすることができません.そこで,倍のサイズのroot.binを動かすことを目標に試してみることにしました.まずは必要なリソースを集めます.小飼さんがブログを書いた時期からjslinuxはバージョンアップしているので,以下のファイルをローカルに落とします.例として~/jslinux/htdocs/配下に置くものとします.

次にroot.binを大きくします

$ mkdir mnt
$ mkdir roots
$ sudo mount -t ext2 -o loop root.bin mnt
$ dd if=/dev/zero of=roots/root.bin bs=1k count=8192
$ sudo /sbin/mke2fs roots/root.bin
$ sudo mount -t ext2 -o loop roots/root.bin mnt2
$ sudo cp -dpR mnt/* mnt2/
$ sudo umount mnt mnt2
$ mv root.bin roots/root.bin.org
$ cp roots/root.bin .

これで8MBのroot.binができました.

kernelのリコンパイル

jslinuxが4MBよりでかいRAMファイルシステムを扱えないのは,kernelのコンパイルオプションで

CONFIG_BLK_DEV_RAM_SIZE=4096

が指定してあるからです.これはjslinux用のパッチとかコンフィグファイルに含まれている,config_linux-2.6.20に記載されています.本来ならbootオプションでramdisk_sizeを指定すれば扱えるファイルシステムサイズは変えられると思ったのですが,うまくいかないようです.ここら辺はまたいつか詳しく調べてみたいと思っています.
さて,kernelを作ることにします.最初x86_64アーキテクチャのマシンで作ろうとしたのですが,x86用のkernelを作れませんでした.単にクロスコンパイルのやり方を忘れているだけなのですが,調べるのが面倒になったので><,以前作ってそのままになっていたcentos5.3 i386版を使ってみました.これのkernelバージョンは

$ uname -a
Linux fig 2.6.18-238.12.1.el5 #1 SMP Tue May 31 13:23:01 EDT 2011 i686 i686 i386 GNU/Linux

となっていました.ざっくりと作り方を書いてみると,

$ cd
$ curl -O http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.20.tar.gz
$ curl -O http://bellard.org/jslinux/linuxstart-20110526.tar.gz
$ tar xvfz linux-2.6.20.tar.gz
$ tar xvfz linuxstart-20110526.tar.gz
$ mv linux-2.6.20 linux-2.6.20.org
$ mv tmp/linuxstart-20110526 .
$ patch -p0 < linuxstart-20110526/patch_linux-2.6.20
$ cd linux-2.6.20.org
$ make mrproper
$ sudo yum install ncurses-devel ← curses.hが入ってなかった
$ make O=/home/kei/kernel/ menuconfig

とすると,kernel設定用のメニュー画面がでてきます.ここで"Load an Alternate Configuration File"コマンドを選択して"config_linux-2.6.20"を読み込み,メニューを終了します.これ使わずにコンフィグを読み込む方法があると思うのですが,まだ見つけていません.誰か知ってたら教えてくださいませ.んで,

$ make O=/home/kei/kernel
$ cd ~/kernel
$ object -O binary vmlinux vmlinux26.bin
$ cp vmlinux26.bin ~/jslinux/htdocs

とやればkernelの準備もできあがりです.そうそう,config_linux-2.6.20を読み込む前に

CONFIG_BLK_DEV_RAM_SIZE=16384

と変更しておくのを忘れずに.

準備

jslinux.jsで物理メモリサイズを

    /* memory size (in bytes) */
    params.mem_size = 16 * 1024 * 1024;

と定義しているので,これを

    /* memory size (in bytes) */
    params.mem_size = 32 * 1024 * 1024;

とかにしてメモリサイズを増やしておきます.ファイルサイズと同じ大きさじゃ動かないでしょうからね.最後に

use Plack::Builder;

builder {
	enable "Plack::Middleware::Static",
		path => qr{^/}, root => 'htdocs/';
	$app;
};

という内容のapp.psgiファイルを作って~/jslinuxディレクトリにおいて

$ sudo plackup --port 80

とやってアクセスしてみると…

RAMDISK: Loading 8192KiB [1 disk] into ram disk... done.
VFS: Mounted root (ext2 filesystem).
Freeing unused kernel memory: 128k freed
Booted in 12.678 s
Welcome to JS/Linux
~ #

となってうまく動きました.

次は

デバイスドライバを作ってwebsocketでサーバと通信するようにしてみたいですね.もうデバイスドライバの作り方なんてすっかり忘れているので,いつできるかさっぱりわからないですけど…