Open vSwitch on FreeBSD (gre tunnel接続)

FeeBSDを2台用意して、Open vSwitchを経由してgre tunnleで接続して各jailをL2接続しようと思ったんだが。。。

ovs-vsctl: 00001|vsctl|INFO|Called as ovs-vsctl add-port br0 gre0 -- set interface gre0 type=gre options:remote_ip=172.21.0.2
ovs-vswitchd: 00043|netdev|WARN|could not create netdev gre0 of unknown type gre
ovs-vswitchd: 00044|bridge|WARN|could not open network device gre0 (Address family not supported by protocol family)

とログが出て、うんともすんとも。。。

Host上でifconfig gre createで先に作成してても同じ。。
greで先にtunnel掘ってもだめ。(これはさすがに無理か。。。)
いろいろ試して、下記のようなメッセージも出たり。。

netdev_bsd|WARN|error sending Ethernet packet on gre0: Address family not supported by protocol family

openvswitch 1.10.0を使っても動かん。
何が問題なのかわかっていない。
プロトコルがサポートされてないってなぜ?

 

Open vSwitch on FreeBSD (jail間通信 port VLAN)

openvswitchはvlanも設定できるみたいですね。
という訳で、port vlanのテスト。

まずは3台目のjail(host03)を10.10.10.3/24で接続して、既存のjailとの通信を確認。
まだVLANは設定していない。

# ifconfig epair2 create
# ifconfig epair2a up
# ovs-vsctl add-port br0 epair2a
# ovs-vsctl show
bed35e5d-cc0a-4594-84e2-d7d1369ccaaf
    Bridge "br0"
        Port "epair1a"
            Interface "epair1a"
        Port "br0"
            Interface "br0"
                type: internal
        Port "epair2a"
            Interface "epair2a"
        Port "epair0a"
            Interface "epair0a"

# ifconfig epair2b vnet host03
# jexec host03 ifconfig epair2b 10.10.10.3 netmask 255.255.255.0
# jexec host03 ping 10.10.10.2
PING 10.10.10.2 (10.10.10.2): 56 data bytes
64 bytes from 10.10.10.2: icmp_seq=0 ttl=64 time=0.428 ms
64 bytes from 10.10.10.2: icmp_seq=1 ttl=64 time=0.178 ms
^C
--- 10.10.10.2 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.178/0.303/0.428/0.125 ms

次に、VLANの設定をしてみる。環境は、こんな感じ。
jail-connect3

openvswitch上でport vlanを設定する
epair0aおよびepair1aのportをvlan 60に設定
epair2aのportをvlan 70に設定

# ovs-vsctl del-port br0 epair0a   (一度portを削除) 
# ovs-vsctl add-port br0 epair0a tag=60 (vlan 60にして再度追加)
# ovs-vsctl del-port br0 epair1a
# ovs-vsctl add-port br0 epair1a tag=60
# ovs-vsctl del-port br0 epair2a
# ovs-vsctl add-port br0 epair2a tag=70
# ovs-vsctl show
bed35e5d-cc0a-4594-84e2-d7d1369ccaaf
    Bridge "br0"
        Port "br0"
            Interface "br0"
                type: internal
        Port "epair0a"
            tag: 60
            Interface "epair0a"
        Port "epair2a"
            tag: 70
            Interface "epair2a"
        Port "epair1a"
            tag: 60
            Interface "epair1a"

epair2aはvlan設定していないので、host01およびhost02からhost03への通信はできなくなり、
host01およびhost02では通信可能なはず。
やってみる。

# jexec host01 ping 10.10.10.2
PING 10.10.10.2 (10.10.10.2): 56 data bytes
64 bytes from 10.10.10.2: icmp_seq=0 ttl=64 time=0.597 ms
^C
--- 10.10.10.2 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.597/0.597/0.597/0.000 ms
# jexec host01 ping 10.10.10.3
PING 10.10.10.3 (10.10.10.3): 56 data bytes
^C
--- 10.10.10.3 ping statistics ---
2 packets transmitted, 0 packets received, 100.0% packet loss
# jexec host02 ping 10.10.10.1
PING 10.10.10.1 (10.10.10.1): 56 data bytes
64 bytes from 10.10.10.1: icmp_seq=0 ttl=64 time=0.220 ms
64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=0.150 ms
^C
--- 10.10.10.1 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.150/0.185/0.220/0.035 ms
root@freebsd-ovs:/root # jexec host02 ping 10.10.10.3
PING 10.10.10.3 (10.10.10.3): 56 data bytes
^C
--- 10.10.10.3 ping statistics ---
2 packets transmitted, 0 packets received, 100.0% packet loss

想定どおりになっています。ちゃんと動くんだな。。。

試しにhost01に相当するepair0aをvlan 70に移動させてみます。
host01からhost03へpingが可能になるはず。

# ovs-vsctl del-port br0 epair0a
# ovs-vsctl add-port br0 epair0a tag=70
# jexec host01 ping 10.10.10.3
PING 10.10.10.3 (10.10.10.3): 56 data bytes
64 bytes from 10.10.10.3: icmp_seq=0 ttl=64 time=0.434 ms
64 bytes from 10.10.10.3: icmp_seq=1 ttl=64 time=0.153 ms
^C
--- 10.10.10.3 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.153/0.293/0.434/0.141 ms

想定通りの動きですね。

 

Open vSwitch on FreeBSD (jail間通信)

簡単な実験なのでワンオフで。

jail-connect
今回はFreeBSD内での閉じたネットワークで通信テストしただけ。

root# /usr/local/etc/rc.d/ovsdb-server onestart
 (/usr/local/etc/openvswitch/配下にdbが作成される)
Starting ovsdb_server.
root# /usr/local/etc/rc.d/ovs-vswitchd onestart
 (dbとconnectされます)
root# ovs-vsctl show
9a89b0cd-ddf0-4bb8-9d35-2b077c3009f8
まだ何もない。。

jailで通信できるようにepairインターフェイスを作成(2台分)

#ifconfig epair0 create
#ifconfig epair1 create
#ifconfig -a (抜粋)
epair0a: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=8<VLAN_MTU>
	ether 02:64:82:00:05:0a
	nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
	media: Ethernet 10Gbase-T (10Gbase-T <full-duplex>)
	status: active
epair0b: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=8<VLAN_MTU>
	ether 02:64:82:00:06:0b
	nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
	media: Ethernet 10Gbase-T (10Gbase-T <full-duplex>)
	status: active
epair1a: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=8<VLAN_MTU>
	ether 02:80:4c:00:07:0a
	nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
	media: Ethernet 10Gbase-T (10Gbase-T <full-duplex>)
	status: active
epair1b: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=8<VLAN_MTU>
	ether 02:80:4c:00:08:0b
	nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
	media: Ethernet 10Gbase-T (10Gbase-T <full-duplex>)
	status: active

ブリッジ(br0)を作成。

root# ovs-vsctl add-br br0
root# ovs-vsctl show
bed35e5d-cc0a-4594-84e2-d7d1369ccaaf
    Bridge "br0"
        Port "br0"
            Interface "br0"
                type: internal

ifconfig で br0は表示されません

#ovs-vsctl set bridge br0 datapath_type=netdev
# ifconfig br0 (br0が表示されるようになります)
br0: flags=28943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST,PPROMISC> metric 0 mtu 1500
	options=80000<LINKSTATE>
	ether 8a:01:5d:29:89:48
	inet6 fe80::2bd:b8ff:fec4:400%br0 prefixlen 64 scopeid 0x6 
	nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
	Opened by PID 1729

epair0aとepair1aをbr0スイッチへ接続します。

root# ovs-vsctl add-port br0 epair0a
root# ovs-vsctl add-port br0 epair1a
root# ovs-vsctl show
bed35e5d-cc0a-4594-84e2-d7d1369ccaaf
    Bridge "br0"
        Port "epair1a"
            Interface "epair1a"
        Port "br0"
            Interface "br0"
                type: internal
        Port "epair0a"
            Interface "epair0a"

jail起動

#jail -c vnet host.hostname=host01 name=host01 path=/home/jail/host01 persist
#jail -c vnet host.hostname=host02 name=host02 path=/home/jail/host02 persist
#mount -t devfs dev /home/jail/host01/dev
#mount -t devfs dev /home/jail/host02/dev
#jls
# jls
   JID  IP Address      Hostname                      Path
     3  -               host01                        /usr/home/jail/host01
     4  -               host02                        /usr/home/jail/host02

epair0bおよびepair1bをjailで使えるように割当

#ifconfig epair0b vnet 3
#ifconfig epair1b vnet 4
#ifconfig -a
  epair0b, epair1bは表示されなくなる
各jailでifconfigでepairXbが見えるか確認。
# jexec 3 ifconfig -a
lo0: flags=8008<LOOPBACK,MULTICAST> metric 0 mtu 16384
	options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
	nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
epair0b: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=8<VLAN_MTU>
	ether 02:64:82:00:06:0b
	nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
	media: Ethernet 10Gbase-T (10Gbase-T <full-duplex>)
	status: active
# jexec 4 ifconfig -a
lo0: flags=8008<LOOPBACK,MULTICAST> metric 0 mtu 16384
	options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
	nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
epair1b: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=8<VLAN_MTU>
	ether 02:80:4c:00:08:0b
	nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
	media: Ethernet 10Gbase-T (10Gbase-T <full-duplex>)
	status: active

jailのhost01およびhost02でepair0b, epari1bが見えるようになります。

jailのhost01およびhost02でipを振る

# jexec host01 ifconfig epair0b 10.10.10.1 netmask 255.255.255.0
# jexec host02 ifconfig epair1b 10.10.10.2 netmask 255.255.255.0

各hostからpingを打ってみる

# jexec host01 ping 10.10.10.2
PING 10.10.10.2 (10.10.10.2): 56 data bytes
64 bytes from 10.10.10.2: icmp_seq=0 ttl=64 time=0.235 ms
64 bytes from 10.10.10.2: icmp_seq=1 ttl=64 time=0.157 ms
^C
--- 10.10.10.2 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.157/0.196/0.235/0.039 ms
# jexec host02 ping 10.10.10.1
PING 10.10.10.1 (10.10.10.1): 56 data bytes
64 bytes from 10.10.10.1: icmp_seq=0 ttl=64 time=0.223 ms
64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=0.144 ms
^C
--- 10.10.10.1 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.144/0.183/0.223/0.039 ms

br0にem0を追加し、em0の代わりにbr0にipを設定することで、FreeBSD外のマシンとの通信も可能になります。
もちろんそれぞれのjail(host01/host02)のIPも192.168.0.0/24に変更。
こんな感じ。
jail-connect2

 

VIMAGE/jail と Open vSwitch (準備)

仮想化はどんどん進化してくれるのはうれしいのですが、何でもかんでもクラウド、広域なノンストップサービスとか好き放題言う人好きくないです。
さてさて、ちまたでOpenFlowとかよく話題に上っていますが。。。
まあ、そんなの現在あんまり興味ありません。
しかし、そんな事も言ってられない方向に。。Orz..

OpenFlowはopenvswitchでやれるだのなんだの。。。openvswitchなんて使ったことないけど、いろんなことができるそうで。。。
openvswitchとかKVM関連の話かと思っていたのですが、FreeBSDとかでも動くみたいですね。

普段はESXi上でサーバのテストやネットのテストをやっていましたが、せっかくなので、FreeBSDのVIMAGE使ってopenvswitch使った仮想通信でもやってみようと。。。

VIMAGE使うためには、FreeBSDのカーネル再構築が必要です。
実験なので、FreeBSD 9.1のVMを新規に作成しました。

#cd /usr/src/sys/amd64/conf
#cp GENERIC VIMAGE
#vi VIMAGE  (下記を追加)
--
ident VIMAGE (GENERICからVIMAGEへ変更)
options VIMAGE
--
#cd /usr/src
#make buildkernel KERNCONF=VIMAGE
#make installkernel KERNCONF=VIMAGE
#reboot

openvswitchをportsでインストール (ver.1.7.1)

# /usr/ports/net/openvswitch
# make
# make install
# /usr/local/etc/rc.d/

jailでhost01環境。メモ

# mkdir /home/jail/host01
# cd /usr/src
# make buildworld DESTDIR=/home/jail/host01
# make installworld DESTDIR=/home/jail/host01
# cd /usr/src/etc
# make distribution DESTDIR=/home/jail/host01
# jail -c vnet name=host01 path=/home/jail/host01 persist
# mount -t devfs dev /home/jail/host01/dev

準備はこんな感じ。

 

RaspberryPi::mmcblk0p5

RaspberryPiを最新を使ってSDにインストールしようとしたら、パーティションの構成が変わっていた。。
archlinux-hf-2013-06-15を利用した。
(何も考えずに、昔のように容量拡張したら起動しなくなったのは内緒w)

ddを使ってSD(16GB)にインストール。

[root@alarmpi usr]# fdisk /dev/mmcblk0
Welcome to fdisk (util-linux 2.23.1).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p

Disk /dev/mmcblk0: 15.8 GB, 15798894592 bytes, 30857216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00057540

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            2048      186367       92160    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          186368     3667967     1740800    5  Extended
/dev/mmcblk0p5          188416     3667967     1739776   83  Linux

容量拡張するために、まずは、Extendedパーティションを削除して、その後、同様の構成でパーティションを
作成し直します。

Command (m for help): p

Disk /dev/mmcblk0: 15.8 GB, 15798894592 bytes, 30857216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00057540

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            2048      186367       92160    c  W95 FAT32 (LBA)

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): e
Partition number (2-4, default 2): 
First sector (186368-30857215, default 186368): 
Using default value 186368
Last sector, +sectors or +size{K,M,G} (186368-30857215, default 30857215): 
Using default value 30857215
Partition 2 of type Extended and of size 14.6 GiB is set

Command (m for help): p

Disk /dev/mmcblk0: 15.8 GB, 15798894592 bytes, 30857216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00057540

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            2048      186367       92160    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          186368    30857215    15335424    5  Extended

Command (m for help): n
Partition type:
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p): l
Adding logical partition 5
First sector (188416-30857215, default 188416): 
Using default value 188416
Last sector, +sectors or +size{K,M,G} (188416-30857215, default 30857215): 
Using default value 30857215
Partition 5 of type Linux and of size 14.6 GiB is set

Command (m for help): p

Disk /dev/mmcblk0: 15.8 GB, 15798894592 bytes, 30857216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00057540

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            2048      186367       92160    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          186368    30857215    15335424    5  Extended
/dev/mmcblk0p5          188416    30857215    15334400   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)

再起動後、resize2fsを実施します。

[root@alarmpi ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       1.7G  466M  1.1G  30% /
devtmpfs         83M     0   83M   0% /dev
tmpfs           231M     0  231M   0% /dev/shm
tmpfs           231M  256K  231M   1% /run
tmpfs           231M     0  231M   0% /sys/fs/cgroup
tmpfs           231M     0  231M   0% /tmp
/dev/mmcblk0p1   90M   25M   66M  28% /boot
[root@alarmpi ~]# resize2fs /dev/mmcblk0p5 
resize2fs 1.42.7 (21-Jan-2013)
Filesystem at /dev/mmcblk0p5 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/mmcblk0p5 is now 3833600 blocks long.

[root@alarmpi ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        15G  467M   14G   4% /
devtmpfs         83M     0   83M   0% /dev
tmpfs           231M     0  231M   0% /dev/shm
tmpfs           231M  256K  231M   1% /run
tmpfs           231M     0  231M   0% /sys/fs/cgroup
tmpfs           231M     0  231M   0% /tmp
/dev/mmcblk0p1   90M   25M   66M  28% /boot

以上で容量の拡張完了です。