Trema v0.6.0 & Open vSwitch 2.4.0 のRPi2(Raspbian)でのセットアップメモ


※ 2015/09に修正

## RPi2の条件

- ユーザ

```shell-session
$ whoami
pi
```

- 実行したアップデート

```shell-session:
$ sudo apt-get -y update && sudo apt-get -y upgrade
$ sudo rpi-update
```

- 環境

```shell-session
$ cat /etc/debian_version
7.8

$ uname -a
Linux raspberrypi 4.1.6-v7+ #810 SMP PREEMPT Tue Aug 18 15:32:12 BST 2015 armv7l GNU/Linux

$ which ruby
/home/pi/.rbenv/shims/ruby

$ ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [armv7l-linux-eabihf]

$ gem -v
2.4.5.1
```


## Tremaのセットアップ

```shell-session:
$ gem install trema -V
```

- チェック

```shell-session:
$ trema --version
trema version 0.6.0

$ gem which trema
/home/pi/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/trema-0.6.0/lib/trema.rb
```

## Open vSwitchのセットアップ(ソースから)
- ダウンロード

```shell-session:
$ wget http://openvswitch.org/releases/openvswitch-2.4.0.tar.gz
```

- 解凍

```shell-session:
$ tar xzf openvswitch-2.4.0.tar.gz
```

- ビルド(解凍されたディレクトリのINSTALL.Debianを見ながら)

```shell-session:
$ sudo apt-get -y install build-essential fakeroot
$ cd openvswitch-2.4.0 && dpkg-checkbuilddeps
$ sudo apt-get install [出力されたパッケージ]
$ # .deb ファイルを作る(testが有効だと時間がかかるのでやめた)
$ DEB_BUILD_OPTIONS='nocheck' fakeroot debian/rules binary
```

- インストール

```shell-session:
$ dpkg -l | grep openvswitch # で出てきたものを消す
$ sudo apt-get purge openvswitch-switch
$ sudo apt-get purge openvswitch-common

$ # 以下1でdkmsをインストールしろと言われてしたが、
$ sudo apt-get install dkms

$ # このようにエラーが出る。
$ # Your kernel headers for kernel 4.1.6-v7+ cannot be found at
$ # /lib/modules/4.1.6-v7+/build or /lib/modules/4.1.6-v7+/source.
$ # [apt-cache search linux-headers-$(uname -r)] で見つからないのでこのまま進む

$ # 1
$ sudo dpkg -i openvswitch-datapath-dkms_2.4.0-1_all.deb

$ sudo dpkg -i openvswitch-common_2.4.0-1_armhf.deb
$ sudo dpkg -i openvswitch-switch_2.4.0-1_armhf.deb
```

- スタート

```shell-session:
$ sudo service openvswitch-switch start
ovsdb-server is already running.
ovs-vswitchd is already running.
Enabling remote OVSDB managers.
```

## Hello Trema
### raspbianでIPv6を有効にする(デフォルトで無効になっている)。
- まず、IPv6を有効に
  * 今すぐ

  ```shell-session:
  $ sudo modprobe ipv6
  ```

  * そしてこれからも(boot時にenable)

  ```shell-session:
  $ echo ipv6 | sudo tee -a /etc/modules
  ```

- 理由は、あらかじめIPv6が有効でないと下記でエラー(No such file ...)になるから。

```ruby:
  sh "sudo /sbin/sysctl -w net.ipv6.conf.#{bridge_name}.disable_ipv6=1 -q"
```

- 参考
	- https://www.raspbian.org/RaspbianFAQ#How_do_I_enable_or_use_IPv6.3F

### Hello! (yay! :smile:)


```shell-session:
$ git clone https://github.com/trema/hello_trema.git
$ cd hello_trema
$ trema run lib/hello_trema.rb -c trema.conf
[sudo] password for pi:
Trema started.
Hello 0xabc!

$ bundle install --binstubs
$ bundle exec ./bin/trema run ./lib/hello_trema.
[sudo] password for pi:
Trema started.
Hello 0xabc!
```

----

### エラーで途中終了した場合などの参考情報

`phut`など、別モジュールでエラーが起きると、`.pid`が残ったりするので、

- 余計なファイルを消す

```shell-session:
$ rm -v /tmp/HelloTrema.*
removed `/tmp/HelloTrema.log'
removed `/tmp/HelloTrema.pid'
```

- スイッチを消す(`*.conf`に書いてある`datapath_id`を参照)

```shell-session:
$ sudo ovs-vsctl del-br br0xabc
```

- またログを見る(`.rb`に書いたコントローラ名を参照(`class HelloTrema < Trema::Controller`))のも良い

```shell-session:
$ less /tmp/HelloTrema.log
```