rumpを使ってみる
Dec 1, 2015
Masaru OKI @masaru0714
はじめに
NetBSD上でrumpを使ってみた報告になります。
さわりはじめて1日たったくらいの理解度ですので、ボケてる可能性も大いにあります。
NetBSD 6.1.5で試しています。他バージョンや他OSだと違う結果になるかも。
rump?
http://rumpkernel.org/
本来カーネル用に書かれたネットワークスタックやデバイスドライバを
ユーザプログラムで動かすためのフレームワーク? ライブラリ? rumpkernelと、
それを中心にした各種コンポーネントの総称。。
anykernel(元となるカーネルコンポーネント;現在はNetBSD kernel)から
ユーザプログラム用としてビルドしたライブラリ(rumpkernel)を作り、
アプリケーションをrump用バイナリ(unikernelというらしい)としてビルドする。
Linux(CentOS, Fedora, Debian, Ubuntu等), NetBSD, FeeeBSD, Solaris等で動作。
rumpの動かし方いくつか
server-client方式
● rumpkernelをリンクして作られたrump_serverを起動しておく
● rump.clientライブラリをリンクして各種プログラム(lsとかpingとか)をビルド。
● 各種プログラムを実行し、rump_serverのリソースを操作。
unikernel方式
● rumprunを用いて各種プログラムの単一バイナリをビルド。
● rumprun qemuで起動したQEMU上で実行。
● rumprun qemuの各種パラメータでIPアドレスなどを設定する。
こんなかんじ(server-client)
native OS kernel
rump_server rump_client native OS apps
NetBSDカーネルの
機能を提供する。
native OSで実行でき
るNetBSDのアプリ
kernel
userland
socket通信
環境を整える
● rump_serverのインストール(NetBSD)
sudo pkgin install rump
rump_server -lrumpvfsなどと指定し起動できる。全部入りはrump_allserver
Linux各種用に *.debや *.rpmも用意されている模様
● rump_client各種バイナリの作成(ここではrumpctrlを用いる)
git clone http://repo.rumpkernel.org/rumpctrl
cd rumpctrl
git submodule update --init
vi rumpctrl/buildrump.sh/buildrump.sh で先頭行の sh を bashに変更
./buildnb.sh
rump_serverの起動
全部入りrump_allserverの起動(下記例では2つ起動している)
rump_allserver unix:///tmp/rump1sock
rump_allserver unix:///tmp/rump2sock
バックグラウンド動作する。
個別指定はたとえば下記のようにする。
rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpvfs -lrumpdev -
lrumpdev_bpf -lrumpnet_virtif unix:///tmp/rump1sock
ネットワークを使いたいときは(tapを読み書きするので)root権限で起動すること。
rumpctrlによるrump clientの実行
$ cd rumpctrl
$ . ./rumpctrl.sh
rumpctrl (NULL)$ export RUMP_SERVER=unix:///tmp/rump1sock
rumpctrl (unix:///tmp/rump1sock)$ ifconfig
lo0: flags=0x8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33648
ifconfig: SIOCGIFAFLAG_IN: Inappropriate ioctl for device
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
rumpctrl (unix:///tmp/rump1sock)$
rump_serverをroot権限で起動した場合、クライアントもroot権限じゃないと通信不可。
rumpctrl TIPS
rump clientとして使えるコマンド一覧
rumpctrl_listcmds
rumpctrlモードのままホストのコマンドを実行
rumpctrl_hostcmd コマンド...
わざわざこれを使わなくてもフルパスでコマンドを叩けば普通に実行できる。
rumpctrlモードから通常状態への復帰
rumpctrl_unload
ホストとの通信の方法
1. ホストでtapインタフェースを作る。名前はtapN(Nは任意の数値)
2. rumpctrlでifconfig virtN createすると、tapN (Nが同じtap)とつながる
ホストマシン
rump_server rump_server
tap0 tap1
virt0 virt1
ifconfig tap0 create
ifconfig virt0 create
server起動した。ifconfigもできた。いざping!
rumpctrl (unix:///tmp/rump1sock)$ ifconfig virt0
virt0: flags=0x8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
address: b2:0a:8e:0b:0e:00
ifconfig: SIOCGIFAFLAG_IN: Inappropriate ioctl for device
inet 172.21.0.1 netmask 0xffffff00 broadcast 172.21.0.255
inet6 fe80::b00a:8eff:fe0b:e00%virt0 prefixlen 64 scopeid 0x2
rumpctrl (unix:///tmp/rump1sock)$ ping 172.21.0.2
ping: Undefined PLT symbol "rump___sysimpl_gettimeofday50" (symnum = 26)
rumpctrl (unix:///tmp/rump1sock)$
orz
現時点でのまとめ
現時点では、素人にはお勧めできない。
Undedefined PLT symboltと言われても動揺せず粛々と解決できる人向け。
現時点ではserver, clientともにNetBSDなのでLinuxしか知らない人にはつらい。
しかしNetBSDでコンテナ仮想化っぽいことをやろうとしたらrumpしかないので
がんばりましょう……
すんなり動かせている方がいましたら助言いただけますとうれしいです。
おしまい。

Rumpを使ってみる