RumpはNetBSD Runnable Userspace Meta Programの略である[1].
BSDCan 2009の論文を読むとRumpはNetBSDのカーネルをユーザランドにもってきて,
例えばネットワークをカーネルスタックをバイパスしてユーザランドにもってきた
スタックで処理してスループットを上げたりするもの,と解釈していた.
しかし,調べるとどうやら,単にユーザランドで使えるLibraryOSとしてだけではなく,
Type1ハイパーバイザ上で直接動作するコンテナとしても使えるLibraryOSのようだ.
Xen PVやVirtioのドライバが実装されているらしい.
そこで,Rump Kernelを使ってみたメモ.
experimentalなものらしいが,rumprunというのを使ってみる.
これをつかうと簡単にRump Kernelを含むイメージファイルの作成・起動ができるらしい.
build-rr.shにhw以外を渡してクロスビルドもできるっぽい.
ここでは,x86_64なLinuxの上で作業したと仮定します.
次に環境設定.
では次はアプリケーションをビルドしてみよう.
ただし,images/data.ffsとしてファイルシステムイメージが UFSで作られるので,事前にNetBSD由来のmakefs(8)が必要.
次に,これを仮想環境が読めるイメージファイルに変換する.
EC2 AMIイメージをサクっと作れてしまう.
それに,rumprun-pacagesレポジトリはMySQLだけじゃなくてnginxやらなんやら結構充実している.memcachedやLevelDBもあるようだ.
ここまでで思ったのは,rumprun-pacagesのアプリの種類だとか,
複数のVMMで起動できたりEC2 AMIがカンタンに作れたり,
とってもこれOSvに近くない?
という感想を抱いた.
なんというか,おもったより実用に近いもののようだ.
これからどういう方向に進んでいくのかもちょっと気になるなあというところ.
P.S.
関連でLKLを使おうとしてるけどビルドがコケて悲しい
参考文献:
^[1]: KANTEE, A. Environmental Independence: BSD Kernel TCP/IP in Userspace. In Proc. of AsiaBSD-Con (2009), pp.71–80.
BSDCan 2009の論文を読むとRumpはNetBSDのカーネルをユーザランドにもってきて,
例えばネットワークをカーネルスタックをバイパスしてユーザランドにもってきた
スタックで処理してスループットを上げたりするもの,と解釈していた.
しかし,調べるとどうやら,単にユーザランドで使えるLibraryOSとしてだけではなく,
Type1ハイパーバイザ上で直接動作するコンテナとしても使えるLibraryOSのようだ.
Xen PVやVirtioのドライバが実装されているらしい.
そこで,Rump Kernelを使ってみたメモ.
experimentalなものらしいが,rumprunというのを使ってみる.
これをつかうと簡単にRump Kernelを含むイメージファイルの作成・起動ができるらしい.
準備
$ git clone http://github.com/rumpkernel/rumprunこれでrump kernelのツール一式とライブラリがビルドされる.
$ cd rumprun
$ git submodule update --init
$ ./build-rr.sh hw
build-rr.shにhw以外を渡してクロスビルドもできるっぽい.
ここでは,x86_64なLinuxの上で作業したと仮定します.
次に環境設定.
$ export PATH="${PATH}/$(pwd)/rumprun/bin"これで,x86_64-rumprun-netbsd-gccなどRump kernelをlinkしてビルドしてくれるツールチェインへのPATHが通る.
$ export RUMPRUN_TOOLCHAIN_TUPLE=x86_64-rumprun-netbsd
では次はアプリケーションをビルドしてみよう.
アプリケーションビルド
$ git clone http://github.com/rumpkernel/rumprun-packagesbin/mysqldとしてビルドしたアプリケーションが置かれる.
$ cd mysql
$ make
ただし,images/data.ffsとしてファイルシステムイメージが UFSで作られるので,事前にNetBSD由来のmakefs(8)が必要.
# apt-get install makefs私はArchLinuxユーザなのでdebtapを用いてmakefsの.debをArchLinuxパッケージに変換した.
次に,これを仮想環境が読めるイメージファイルに変換する.
$ rumprun-bake hw_virtio bin/mysqld.bin bin/mysqldこれで,virtioドライバ付きでRump KernelにリンクされたMySQLのイメージがbin/mysqld.binに焼き込まれた. ちなみに,hw_virtio以外に選べるコンフィグは次の通り
$ rumprun-bake list準備は整ったので,使用してみる.
!!!
!!! NOTE: rumprun-bake is experimental. syntax may change in the future
!!!
xen_pv : Xen with paravirtualized I/O drivers
xen_pci : Xen with paravirtualized and PCI I/O drivers
hw_virtio : virtio targets (e.g. QEMU/KVM)
hw_virtio_scsi : virtio targets with SCSI (e.g. QEMU/KVM)
hw_generic : generic targets, includes (almost) all drivers
使ってみる
まずtapを生やす.# ip tuntap add tap0 mode tap次に,rumprunコマンドで実行する.
# ip addr add 10.0.0.1/24 dev tap0
# ip link set dev tap0 up
$ rumprun kvm -M 128 -i \これでMySQLデーモンサーバがRump Kernelで起動する. ホストのほうから,
-b images/data.ffs,/data \
-I if,vioif,'-net tap,script=no,ifname=tap0' \
-W if,inet,static,10.0.0.10/24 \
-- \
bin/mysqld.bin \
--defaults-file=/data/my.cnf --basedir=/data --user=daemon
$ mysql -h 10.0.0.10 -u rumpだの
$ mysqladmin -h 10.0.0.10 -u rump statusだのして遊べる.
おわりに
rumprunコマンドのusageは次の通り.$ rumprunすごい,なんとXenとKVMだけじゃなくてbootableなisoに焼いてみるとか(もしかしたらrumprun-bake hw_genericをつかえばbaremetal起動できる?)
!!!
!!! NOTE: rumprun-bake is experimental. syntax may change in the future
!!!
usage: rumprun [script args] PLATFORM [guest args] APP [ -- ] [app args]
PLATFORM is the rumprun runtime platform to use
ec2 : create directory with contents necessary for a Amazon EC2 AMI
iso : bake app and config into a bootable iso image
kvm : hw guest via qemu -enable-kvm
qemu : hw guest via qemu -no-kvm
xen : xen guest via xl(1)
APP is the binary to rumprun. app args are processed by APP.
script args are:
[-h] [-DS] [-t tmpdir] [-T tmpdir]
-h display this message
-D dump backend commands instead of running them
-S execute sudo where potentially necessary
-t use tmpdir as dir for temp files (default: /tmp/rumprun.XXXXXXXX)
-T same as -t, except do not remove temporary directory
guest args are:
[-dip] [-b blkspec] [-D port] [-e VAR[=VALUE]] [-g args]
[-I iftag,ifopts] [-M mem] [-N name] [-W iftag,netspec]
-b configures a block device. The format of "blkspec" is:
hostpath[,mountpoint] where:
hostpath = image that is passed to the guest as a block device
mountpoint = if "hostpath" is a file system image, mountpoint on guest
-D attaches a gdb server on port to the guest
-d destroys the guest on poweroff
-e set environment VAR to VALUE
-g specify 'args' to guest. handling, if any, is guest-dependent.
-I create guest network interface and attach the user-specified
iftag to it. the format is:
iftag,ifbasename,[backendopts]
e.g. -I 'qnet0,vioif,-net tap=/dev/tap0'
-i attaches to guest console on startup
-M set the guest's memory to mem megabytes, default is 64
-N set the guest's name to name, default is rumprun-APP
-p creates the guest but leaves it paused
-W configure network interface new style, where "netspec" is
inet,dhcp - IPv4 with DHCP
inet,static,addr/mask[,gateway] - IPv4 with static IP
inet6,auto - IPv6 with stateless autoconfiguration
e.g. -W qnet0,inet,static,1.2.3.4/24
EC2 AMIイメージをサクっと作れてしまう.
それに,rumprun-pacagesレポジトリはMySQLだけじゃなくてnginxやらなんやら結構充実している.memcachedやLevelDBもあるようだ.
ここまでで思ったのは,rumprun-pacagesのアプリの種類だとか,
複数のVMMで起動できたりEC2 AMIがカンタンに作れたり,
とってもこれOSvに近くない?
という感想を抱いた.
なんというか,おもったより実用に近いもののようだ.
これからどういう方向に進んでいくのかもちょっと気になるなあというところ.
P.S.
関連でLKLを使おうとしてるけどビルドがコケて悲しい
参考文献:
^[1]: KANTEE, A. Environmental Independence: BSD Kernel TCP/IP in Userspace. In Proc. of AsiaBSD-Con (2009), pp.71–80.