Bash on WindowsでNetBSD rumpkernelを動かす
Bash on WindowsのWindows Subsystem for Linux(WSL)は要するにLinuxなので普通にrumpkernelが動いた。まる。
rumpkernelはNetBSDのデバイスドライバやプロトコルスタック類を動作させるためのAPI( http://netbsd.gw.com/cgi-bin/man-cgi?rumpuser )を切ったもので、User Mode Linux的にプロセスとしてドライバやカーネルを動かすもの(rumpserver http://netbsd.gw.com/cgi-bin/man-cgi?rump_server )だけでなく、いわゆるUnikernelとしてベアメタルや仮想環境で動作させるためのrumprun( https://github.com/rumpkernel/rumprun )等が有る。...別にそれNetBSDで良いよね?
以下チュートリアル( https://github.com/rumpkernel/wiki/wiki/Tutorial%3A-Getting-Started )の引き写し。
ドライバやカーネル本体のビルド(rumpserver)
Bash on Windowsにgccやmake等をインストールしたら、そのままチュートリアル通りにビルドできる。
git clone http://repo.rumpkernel.org/buildrump.sh
cd buildrump.sh
./buildrump.sh
いくつかのテストは現時点では失敗するようだ。
ユーザランドのビルド(rumpctrl)
カーネルだけでは何もできないので、ユーザランドもビルドする。ただ、今のところ、このrumpkernelでshとかはできない(forkとかmmapが無い)。
git clone http://repo.rumpkernel.org/rumpctrl
cd rumpctrl
git submodule update --init
./buildnb.sh
これもチュートリアル通り。
rumpkernel内のIPv6スタックでlocalhostにpingしてみる
今のところ、Bash on Windowsからtapを使えないのでlocalhostしか使えない。
まず、buildump.shディレクトリにビルドされたカーネルを立ち上げる。
oku@STRIPE:~/repos/buildrump.sh$ ./rump/bin/rump_allserver unix:///tmp/rumpctrlsock WARNING: module error: builtin module `drvctl' failed to init, error 17 oku@STRIPE:~/repos/buildrump.sh$ ps auxw USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 0 0 ? Ss 2433 0:00 /init oku 2 0.0 0.0 0 0 ? Ss 2433 0:00 /bin/bash oku 22538 0.0 0.0 0 0 ? Ssl 2433 0:00 ./rump/bin/rump_allserver unix:///tmp/rumpctrlsock oku 22574 0.0 0.0 0 0 ? R 2433 0:00 ps auxw
error 17はどっちのerrnoなんだ。。まぁLinuxでもBSDでもEEXISTみたいだけど。
カーネルはソケットで待ち受けることになるので、そのソケットを指定してユーザランドのプロセスを起動する。rumpctrlのディレクトリで、
oku@STRIPE:~/repos/rumpctrl$ source rumpctrl.sh rumpctrl (NULL)$ export RUMP_SERVER=unix:///tmp/rumpctrlsock rumpctrl (unix:///tmp/rumpctrlsock)$ sysctl -a kern.ostype = NetBSD kern.osrelease = 7.99.34 kern.osrevision = 799003400 kern.version = NetBSD 7.99.34 (RUMP-ROAST) kern.hostname = rump-22538.STRIPE kern.clockrate: tick = 10000, tickadj = 40, hz = 100, profhz = 1, stathz = 1 kern.domainname = kern.rawpartition = 3 kern.msgbufsize = 16352 kern.mbuf.msize = 512 - snip - rumpctrl (unix:///tmp/rumpctrlsock)$ ifconfig -a lo0: flags=0x8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33624 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 inet 127.0.0.1 netmask 0xff000000 rumpctrl (unix:///tmp/rumpctrlsock)$ ping6 ::1 PING6(56=40+8+8 bytes) ::1 --> ::1 16 bytes from ::1, icmp_seq=0 hlim=64 time=10.000 ms 16 bytes from ::1, icmp_seq=1 hlim=64 time=0.000 ms 16 bytes from ::1, icmp_seq=2 hlim=64 time=10.000 ms ^C
実用的に使える可能性があるとすると、ファイルシステム類だろうか。。USBやEthernetはブリッジを書いてみるのも興味深いと思うけど。
もっと面白そうなのはWindowsへの移植だろう。ビルドシステムは壁になるが、ランタイムは静的リンクに限れば構造的に難しい点は無い、ように思える。LP64前提だったりすると不味い可能性は有るが。。