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の制限によるものであり、通常の環境では不要である。
# 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