重要なこと
CentOS7はNetworkManagerが標準で実行されています。ここは元となっているRed Hat Enterprise Linux 7でも同様です。もしNetworkManagerを有効の状態でBondingを行なってもよければ、NetworkManager GUI、nmcliコマンド、nmtuiコマンドなどで設定を実行できて便利なので、NetworkManagerを生かしたまま、お好みの方法でBondingをした方がいいと思います。詳細はRHEL7のマニュアル「ネットワークガイド第4章 ネットワークボンディングの設定」をご覧ください。OVSでBondingをする場合はNetworkManager/networkサービスのいずれかが正常に動いていれば、どちらでも構いません。
さて、LinuxでBondingを行うには2つの方法があります。一つはKernelのbondingモジュールを使ってカーネルレベルでBondingするという方法です。もう一つはOpenvSwitchを使ってBondingするという方法です。
前者は追加でインストールするものはないのですぐに使えます。OpenvSwitchを使う方法はLinuxにOpenvSwitchをインストールするという手間が追加で発生します。LinuxでBondingをした場合はLinuxの様々なコマンドで状態を確認します。例えばパケットが送受信されているかはtcpdumpコマンドを使うなど。一方、OVSを使ったBondingの方がステータスの確認をするコマンドが充実しているので便利だったりします。
はじめに
実際の手順に入る前に、今回の構成を以下に書いてみます。 サーバーには3つのNICを用意して、うち2つはbonding用、1つは管理用に使います。作業するときは管理用のNIC経由でサーバーにアクセスします。今回の例はeth0とeth2は同じVLANで、eth1はeth0,2とは別のVLANに接続されているのを想定しています。
- eth0--bonding用
- eth2--bonding用
- eth1--管理用(別VLAN)
家庭でBondingを試したい場合は、Linux KVMを使うといいと思います。eth0と2をLinux Bridgeとつなぎ、eth1をKVM標準のNATにつなげば良いと思います。
今回は上に載せるアプリケーションの都合でNetworkManagerを無効化して、従来のnetworkサービスを使う方法について説明します。NetworkManagerが使えるならもっと楽ができるし情報もたくさんあるのですが、そこはまあ仕方ないですね。
LinuxのBondingモジュールで構成する
1) まず、yum updateでシステムを最新の状態に更新します。新しいKernelが追加された場合は再起動します。
2) 次にeth0とeth2の設定を記述します。
# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=none HWADDR=xx:xx:xx:xx:xx:xx ONBOOT=yes MASTER=bond0 SLAVE=yes
# vi /etc/sysconfig/network-scripts/ifcfg-eth2 DEVICE=eth2 BOOTPROTO=none HWADDR=xx:xx:xx:xx:xx:xx ONBOOT=yes MASTER=bond0 SLAVE=yes
3) bond0というデバイスを作るため、次のように設定を記述します。
# vi /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 BOOTPROTO=none ONBOOT=yes BONDING_OPTS="mode=1 miimon=100"
bondingのモードを切り替えるには上記ネットワーク設定にあるBONDING_OPTSにモードを指定します。設定を反映するにはmodprobe -r bonding &&modprobe bonding
などと実行するか、ホストを再起動しましょう。
4) ifcfg-bond0 にローカルIPを設定します。
... IPADDR=172.17.14.224 NETMASK=255.255.255.0 GATEWAY=172.17.14.1 DNS1=172.17.14.3
5) デフォルトゲートウェイを設定します。
# vi /etc/sysconfig/network GATEWAY=172.17.14.1
ここまでできたら再起動すると、次回起動時にbond0が作られてネットワーク通信できる状態になります。cat /proc/net/bonding/bond0
コマンドでbondingの状態を確認できます。
OVSでBondingを構成する
1) まず、yum updateでシステムを最新の状態に更新します。新しいKernelが追加された場合は再起動します。
2) openvswitch パッケージをインストールします。CentOSの場合はOpenStack用のリポジトリーに比較的新し目のopenvswitchパッケージが用意されているのでyum list|grep centos-release-openstack
を実行して可能な限り新しいOpenStackバージョンを確認して、メタパッケージをインストールします。これでOpenStackパッケージリポジトリ〜が有効になるので、そのあとyum install openvswitch
を実行してOVSをインストールします。
2017/6/10追記
centos-openstack-ocata/x86_64で公開されているopenvswitch-2.6.14.1.git20161206.el7ですが、本手順を実施してもまともに動きません。パッケージにバグがあるのかも。以下で公開したsrpmを使ってrpmをビルドしたものを使ってください。そのバージョンでは問題なく動作するのを確認しています。
3) 次にeth0とeth2の設定を記述します。
# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=none HWADDR=xx:xx:xx:xx:xx:xx ONBOOT=yes IPADDR=0.0.0.0
# vi /etc/sysconfig/network-scripts/ifcfg-eth2 DEVICE=eth2 BOOTPROTO=none HWADDR=xx:xx:xx:xx:xx:xx ONBOOT=yes IPADDR=0.0.0.0
「ONBOOT=yes」と「IPADDR=0.0.0.0」を書いて、NICのstateがUPになるようにします。ここら辺はNetworkManagerだとよしなにやってくれるのですが、networkサービスではちょっと工夫する必要があります。
4) OVSではブリッジポートに自身のポートとbondingのポートをくっつけることでNICのbondingを実現します。そのために、まずOVSのブリッジ設定を記述します。
# vi /etc/sysconfig/network-scripts/ifcfg-ovsbr0 DEVICE=ovsbr0 DEVICETYPE=ovs TYPE=OVSBond OVS_BRIDGE=ovsbr0 ONBOOT=yes BOOTPROTO=none IPADDR=172.17.14.224 NETMASK=255.255.255.0 GATEWAY=172.17.14.1 DNS1=172.17.14.3 BOND_IFACES="eth0 eth2" OVS_OPTIONS="bond_mode=active-backup"
5) デフォルトゲートウェイを設定します。
# vi /etc/sysconfig/network GATEWAY=172.17.14.1
6) コマンドを実行して、ブリッジとポートの割り当てを行います。
# systemctl start openvswitch && systemctl enable openvswitch # ovs-vsctl add-br ovsbr0 # ovs-vsctl add-bond ovsbr0 bond0 eth0 eth2 # ovs-vsctl set port bond0 bond_mode=active-backup
7) 次のコマンドを実行することで様々な情報を引き出すことができます。
# ovs-appctl bond/list (bondingデバイスとモード、スレーブデバイスを一覧で表示) # ovs-appctl bond/show (上記をもう少し詳細に表示) # ovs-ofctl dump-flows ovsbr0 (パケットの送受信の状態の表示) # ovs-vsctl show (ブリッジとポートの状態と構成を一覧表示)
今回OpenStackを動かすにあたり、OpenStackではNetworkManagerはまだ利用できないので、NetworkManagerをオフにした上でBondingする方法を調べたら割と苦労したので、今後のためを思ってブログに書いてみました。誰か一人にでも役立つことがあれば幸いです。
リンク集
今回の記事を書くにあたり、参考にしたサイト一覧です。
Linux Bonding
- http://www.si1230.com/home/?page_id=967
- https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/sec-Using_Channel_Bonding.html
- http://ja.community.dell.com/techcenter/b/weblog/archive/2014/05/16/linux-bonding-mode-0