Bash on WindowsでNetBSD rumpkernelを動かす

Bash on WindowsWindows 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 Windowsgccや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スタックでlocalhostpingしてみる

今のところ、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前提だったりすると不味い可能性は有るが。。