CentOS 7の新機能、Team Driverを試す

# Team Driverとは

Team DriverはCentOS 7で追加された、もう1つのbonding実装である。

CentOS 7のbondingは http://qiita.com/yteraoka/items/e661c2a8c6e7617e64f9 のコメントに書いた通りで、今のところなんか微妙な感じなので（そのうち直るだろうが）、Team Driverが使えそうかの確認を行った、というのが今回の趣旨である。

本番環境で使用したわけではないが、機能としては特に問題はなさそうであることは確認できたため、以下に構築手順を記す。

# Team Driverの設定

## 前提

通常はOSインストール時に自動的にインストールされているはずだが、もしインストールされていなければteamdをインストールする必要がある。

```
# yum install teamd
```

こちらも上記bondingの記事と同様に、以下の操作を行う。

* teamingされていない1枚のNICでネットワークに接続された状態から、オンラインで2枚のNICをteamingして同じIPアドレスでネットワークに接続された状態に変更する
* 片方のNICを落としても接続できていることを確認する
* オンラインでteamingを解除し、1枚のNICでネットワークに接続された状態に戻す

オンラインで変更できることを確認するため、SSHでログインした状態で作業を実施した。

NetworkManagerサービスは起動した状態にしておく。

今回の作業ではVirtualBox 4.3.12上に立てた仮想マシンを利用している。
NICの名前は1枚目（元々接続されている方）が「enp0s3」、2枚目が「enp0s8」となる。
「enp0s3」には固定IPアドレスが振られており、teaming後も同じIPアドレスを使用する。初期状態は以下の通り。

```
# nmcli c
名前    UUID                                  タイプ          デバイス
enp0s8  efb66434-a502-4607-878b-17aaf12954c8  802-3-ethernet  --
enp0s3  3e375a6d-d3d2-4864-9506-ae72ab729597  802-3-ethernet  enp0s3
```

```
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:72:df:af brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.34/24 brd 10.0.2.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe72:dfaf/64 scope link
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:f0:e6:9d brd ff:ff:ff:ff:ff:ff
```

## teamingの構築

まずTeam Masterデバイスを追加する。
名前は「team0」とした。
これ自体がupしてもぶら下がるTeam Slaveが上がるまではネットワークに接続に行けないので、ここでは"autoconnect no"を付けて自動接続設定を切らなくても問題なさそう。

ここでconfigで指定したものがbondingのmode 1、Active-Backup相当とするための設定である。
ただし`"hwaddr_policy": "by_active"`に関しては、[VirtualBoxの制限](https://community.oracle.com/thread/2546040)によるものであり、通常の環境では不要である。

```
# nmcli connection add type team con-name team0 ifname team0 config '{"runner": {"name": "activebackup", "hwaddr_policy": "by_active"}}'
```

***

**2014-08-15追記**: 修正前、configの値を`'{"runner": {"name": "activebackup", "hwaddr_policy": "by_active"}, "link_watch": {"name": "ethtool"}}'`としていたが、`"link_watch": {"name": "ethtool"}`はデフォルト値であることが判明したため削ることとした。

***

IPアドレスをDHCPで取得するのではなく、現在のenp0s3と同じ設定の固定に変更する。

```
# nmcli connection modify team0 ipv4.method manual ipv4.addresses "10.0.2.34/24 10.0.2.1" ipv4.dns 8.8.8.8
```

enp0s3とenp0s8をteam0のTeam Slaveとしてぶら下げる。
その際、enp0s8の方には自動起動させない設定である"autoconnect no"がないと追加した瞬間に立ち上がり、結果team0が接続されるので"autoconnect no"を付けておく。
enp0s3の方にこれが要らないのは、現在使用されているNICだからであると考えられる。
この辺りはNetworkManagerの作用だろう。

Team Slaveは特に接続名を指定しなかったので、名称「team-slave-enp0s3」「team-slave-enp0s8」で作られる。
指定したければcon-nameで指定することもできる。

```
# nmcli connection add type team-slave ifname enp0s3 master team0
# nmcli connection add type team-slave autoconnect no ifname enp0s8 master team0
```

元々の接続であるenp0s3が今後自動起動しないようにする。

```
# nmcli connection modify enp0s3 connection.autoconnect no
```

ネットワークの再起動を行う。

```
# systemctl restart network
```

enp0s8の方は自動起動する設定になっていないので、今はまだTeam Slaveはenp0s3の方だけupしている状態である。

enp0s8の方を自動起動する設定に変更する。
enp0s8は現在使用されていないNICなので、自動起動に変更するとすぐにupする。

```
# nmcli connection modify team-slave-enp0s8 connection.autoconnect yes
```

これでteamingされた状態に移行した。
内容を確認すると以下となる。

```
# nmcli c
名前               UUID                                  タイプ          デバイス
team0              62bf13e5-8a0e-4608-b327-e16c9c975e9b  team            team0  
enp0s8             f6fc5697-a7ea-430b-8b99-1f2921dad4a6  802-3-ethernet  --     
enp0s3             57011925-aa21-49fd-97a8-86c0702be02e  802-3-ethernet  --     
team-slave-enp0s8  59193dc9-d907-4dc4-85b0-73cbb77d6d3b  802-3-ethernet  enp0s8 
team-slave-enp0s3  49e3a052-a210-474b-90d0-da67b6bd00cf  802-3-ethernet  enp0s3 
```

（上記の通りVirtualBoxの制限で`"hwaddr_policy": "by_active"`としたので、activebackupなのにenp0s3とenp0s8のMACアドレスが違うものになる）

```
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master team0 state UP qlen 1000
    link/ether 08:00:27:cb:8e:fb brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master team0 state UP qlen 1000
    link/ether 08:00:27:dd:09:c6 brd ff:ff:ff:ff:ff:ff
5: team0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 08:00:27:cb:8e:fb brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.34/24 brd 10.0.2.255 scope global team0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fecb:8efb/64 scope link
       valid_lft forever preferred_lft forever
```

```
# teamdctl team0 state
setup:
  runner: activebackup
ports:
  enp0s3
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
  enp0s8
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
runner:
  active port: enp0s3
```

## 片方のNICを落とす

`teamdctl team0 state`でactive portになっているenp0s3を落としてみる。

```
# nmcli connection down team-slave-enp0s3
```

状態は以下のように変化する。

```
# nmcli c
名前               UUID                                  タイプ          デバイス
team0              62bf13e5-8a0e-4608-b327-e16c9c975e9b  team            team0  
enp0s8             f6fc5697-a7ea-430b-8b99-1f2921dad4a6  802-3-ethernet  --     
enp0s3             57011925-aa21-49fd-97a8-86c0702be02e  802-3-ethernet  --     
team-slave-enp0s8  59193dc9-d907-4dc4-85b0-73cbb77d6d3b  802-3-ethernet  enp0s8 
team-slave-enp0s3  49e3a052-a210-474b-90d0-da67b6bd00cf  802-3-ethernet  --     
```

```
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:cb:8e:fb brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master team0 state UP qlen 1000
    link/ether 08:00:27:dd:09:c6 brd ff:ff:ff:ff:ff:ff
5: team0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 08:00:27:dd:09:c6 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.34/24 brd 10.0.2.255 scope global team0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fecb:8efb/64 scope link
       valid_lft forever preferred_lft forever
```

```
# teamdctl team0 state
setup:
  runner: activebackup
ports:
  enp0s8
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
runner:
  active port: enp0s8
```

裏でpingを飛ばしていたが、途切れることはなかった。

落とした側をもう一度上げ直す。

```
# nmcli connection up team-slave-enp0s3
```

`teamdctl team0 state`で見ると、両方上がっているがactiveなのはenp0s8の側のまま、となる。

```
# teamdctl team0 state
setup:
  runner: activebackup
ports:
  enp0s3
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
  enp0s8
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
runner:
  active port: enp0s8
```

## teamingの解除

最後に、teamingを解除して最初の状態に戻す。

Teamの自動起動をしないようにし、元の接続の自動起動を行うようにする。

```
# nmcli connection modify team0 connection.autoconnect no
# nmcli connection modify team-slave-enp0s3 connection.autoconnect no
# nmcli connection modify team-slave-enp0s8 connection.autoconnect no
# nmcli connection modify enp0s3 connection.autoconnect yes
```

ネットワークの再起動を行う。

```
# systemctl restart network
```

使い終わったteamingの設定を削除する。

```
# nmcli connection delete team-slave-enp0s3
# nmcli connection delete team-slave-enp0s8
# nmcli connection delete team0
```

これで元通り。

```
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:cb:8e:fb brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.34/24 brd 10.0.2.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fecb:8efb/64 scope link
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:dd:09:c6 brd ff:ff:ff:ff:ff:ff
```

```
# nmcli c
名前    UUID                                  タイプ          デバイス
enp0s8  f6fc5697-a7ea-430b-8b99-1f2921dad4a6  802-3-ethernet  --
enp0s3  57011925-aa21-49fd-97a8-86c0702be02e  802-3-ethernet  enp0s3
```

# 参考文献

* https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/ch-Configure_Network_Teaming.html