rumpを使ってみる
NetBSD 7.0編
Dec 5, 2015
Masaru OKI @masaru0714
はじめに
NetBSD上でrumpを使ってみた報告になります。
さわりはじめて2日たったくらいの理解度ですので、ボケてる可能性も大いにあります。
今回はNetBSD 7.0で試しています。(2015年10月8日にリリースされています)
数日前にNetBSD 6.1.5で試したのですが、NetBSDつながりの友人いわく
NetBSD 6.1.5は古すぎてダメ。7.0と-currentもわりと違うかも?
みなさん、これがNetBSDです。覚悟を決めて臨みましょう。
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通信
環境を整える
下記、事前にgmakeをインストールしないと失敗するので注意。
SSL certificate云々言われたときは pkgin insall mozilla-rootcerts-openssl します。
● Building rump_server
git clone http://repo.rumpkernel.org/buildrump.sh
cd buildrump.sh
./buildrump.sh
● Building rump_client binaries (using rumpctrl)
git clone http://repo.rumpkernel.org/rumpctrl
cd rumpctrl
git submodule update --init
./buildnb.sh
rump_serverの起動
全部入りrump_allserverの起動(下記例では2つ起動している)
./buildrump.sh/rump/bin/rump_allserver unix:///tmp/rump1sock
./buildrump.sh/rump/bin/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
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)とつながる
host
rump_server rump_server
tap0 tap1
virt0 virt1
ifconfig tap0 create
ifconfig virt0 create
1. ホスト上でtap0とtap1をブリッジする
2. virt0に172.21.0.1, virt1に172.21.0.2を付ける
3. pingを投げる
host
bridge
テスト
rump_server rump_server
tap0 tap1
virt0 virt1ping 172.21.0.2
172.21.0.1 172.21.0.2
tap0とtap1のブリッジ
ここでは無理に、Lagopus http://lagopus.github.io の開発版を使ってみます。
普通にやる場合はbridge(4)を使ってください。
$ sudo pkgin install gmp
$ ./configure; gmake; sudo gmake install
$ sudo lagopus -C 2port-tap.dsl
$ sudo pkgin install py27-pip
$ sudo pip27 install ryu
$ ryu-manager port1-2.py
tap0とtap1をLagopus
bridgeに接続する設定
port 1とport 2の間で
パケット転送する設定
IPアドレスの割り当て
$ sudo -s
# cd rumpctrl
# . ./rumpctrl.sh
# rumpctrl (NULL) $ export RUMP_SERVER=unix:///tmp/rump1sock
# rumpctrl(unix:///tmp/rump1sock)$ ifconfig virt0 create
# rumpctrl(unix:///tmp/rump1sock)$ ifconfig virt0 172.21.0.1/24 up
# rumpctrl(unix:///tmp/rump1sock)$ RUMP_SERVER=unix:///tmp/rump2sock
# rumpctrl(unix:///tmp/rump2sock)$ ifconfig virt1 create
# rumpctrl(unix:///tmp/rump2sock)$ ifconfig virt1 172.21.0.2/24 up
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
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 172.21.0.2 (172.21.0.2): 56 data bytes
64 bytes from 172.21.0.2: icmp_seq=0 ttl=255 time=0.000000 ms
64 bytes from 172.21.0.2: icmp_seq=1 ttl=255 time=0.000000 ms
動く! 動くぞ!!
まとめ
pingだけしか試してないけれど、
NetBSD 7.0であれば比較的素直に動いてくれた。よかった。
おしまい。

Using rump on NetBSD 7.0