CentOS 6 で Bonding & Bridge

December 23, 2012

毎日毎日、NICを冗長化したいと思いながら一年経ってました。 そろそろやらねば!と思い、先日 bonjour-01サーバにてBondingを実装しました。

また今回は、bonding した デバイスをbr0にBridgeします。 Topotalのbr0は、KVMとVPNで利用しているブリッジデバイスで めちゃくちゃ重要です。

KVMがつながらないと、Topotalのサービスが全停止するし VPNがつながらないと、学内からメール受信もLINEでチャットもできない。

やっぱり考えれば考えるほど、bondingで冗長化したほうがいい。しましょう。

Bonding とは

1台のマシンに複数のネットワーク・インタフェース・カード(NIC)を搭載し、 それらのNICを一つの仮想的なNICとして扱うための技術です。参考(ITPro)

複数NICを仮想的な1つのNICにする技術です。 これにより、NICの冗長化や負荷分散が可能となります。

Bonding の種類

Bonding には6つのモードがあります。モードごとに冗長構成、負荷分散の設定が異なります。 WebにはBondingのいろいろな情報が落ちていますが、信頼性の高い情報が欲しいものです。

ということで探してみたらサーバにありました。 サーバによってLinuxカーネルのバージョンは異なりますのでファイルパスも変わります。

 less /usr/local/src/linux-3.2.5/Documentation/networking/bonding.txt

確認すればわかりますが、英語です。頑張りましょう。

日本語が良いという方は以下のリンクをどうぞ。少し古いので注意してください。 Linux bonding ドライバの設定方法

今回は、冗長化も負荷分散(送受信)もでき、特別なスイッチが不要な、 コストパフォーマンスが高い mode 6(balance-alb)を実装します。 監視方法は、MIIリンク監視とARP監視の2つがありますが、ここではMIIリンク監視にします。 理由はARP監視では、同一セグメントへARPパケットをブロードキャストするため コストがかかると判断したからです。 ARP監視で実装する場合には、arp_validate パラメタを3にするといいらしい。

Bonding & Bridging 設定

それでは設定ファイルの例を記載します。

NICの確認

MIIリンク監視をするためには、NICのドライバがMIIに対応している必要があります。 ethtool コマンドを入力して、「No data available」と出力されず、下記のような出力がなされれば大丈夫です。

コマンドの使い方は、 ethtool [interface name] です。

# ethtool eth0
Settings for eth0:
        Supported ports: [ TP ]
        Supported link modes:   10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Full 
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Full 
        Advertised pause frame use: No
        Advertised auto-negotiation: Yes
        Speed: 1000Mb/s
        Duplex: Full
        Port: Twisted Pair
        PHYAD: 2
        Transceiver: internal
        Auto-negotiation: on
        MDI-X: on
        Supports Wake-on: pumbg
        Wake-on: g
        Current message level: 0x00000001 (1)
        Link detected: yes

bridgeの設定

いつも通りで大丈夫。特にいじる必要なし。

# cat /etc/sysconfig/network-scripts/ifcfg-br0 
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
BROADCAST=192.168.0.255
IPADDR=192.168.0.1
NETMASK=255.255.255.0
NETWORK=192.168.0.0
DELAY=0

bondingの設定

modprobe の設定

# vim /etc/modprobe.d/bonding
alias netdev-bond0 bonding
options bond0 mode=6 miimon=100 arp_interval=0

alias の部分、CentOS6 から、bond0 は deprecatedとなり、netdev-bond0 になったようです。

  1. miimon・・・MIIリンク監視の頻繁度を設定する。ミリ秒単位。0で無効
  2. arp_interval・・・ARPの監視頻度。ミリ秒。0で無効。

明示的にARP監視を無効にしています。なくてもmiimonの記載があれば無効になります

modprobeコマンドにて、bonding モジュールをロード

# modprobe bonding

次に仮想NIC(bond0)の定義をします。

# vim /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
BONDING_OPTS="miimon=100 mode=balance-alb arp_interval=0"

arp_interval=0 の部分で mode=balance-alb は 6 を指定しても同じです。

次に、物理NICの設定をします。今回は、eth0とeth1をbondingします。

# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
MASTER=bond0
SLAVE=yes
HWADDR=xx:xx:xx:xx:xx:xx
# vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
MASTER=bond0
SLAVE=yes
HWADDR=xx:xx:xx:xx:xx:xx

HWADDR も明示的に指定。

動作確認

# /etc/init.d/network restart

外側から、Ping疎通などで確認して正常に応答があればOK。 設定したホストで bondingの状況を確認。

# cat /proc/net/bonding/bond0                                                                                        
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: adaptive load balancing
Primary Slave: None
Currently Active Slave: eth1
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 1
Permanent HW addr: xx:xx:xx:xx:xx:xx
Slave queue ID: 0

Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: xx:xx:xx:xx:xx:xx
Slave queue ID: 0

eth0, eth1 の MII Statusが upになっています。 これで、eth0,1 がbonding されたことがわかります。 Currently Active Slave: eth1 上記はeth1が現在アクティブであることを示してます。

一回落としてみます。

# ifdown eth1

もう一度確認。

# cat /proc/net/bonding/bond0    
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: adaptive load balancing
Primary Slave: None
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: xx:xx:xx:xx:xx:xx
Slave queue ID: 0

eth1 のカラムが消え、eth0がActiveになりました。 これで冗長化の確認ができました。

アクティブデバイスの切り替えは下記コマンドにて行えます。

# ifenslave -c bond0 eth1

最後に、Bridge ができているかを確認します。

# brctl show br0
bridge name     bridge id               STP enabled     interfaces
br0             8000.001e6713db59       no              bond0
                                                        tap0
                                                        vnet0
                                                        vnet1
                                                        vnet2
                                                        vnet3
                                                        vnet4
                                                        vnet5

br0 に対して、bond0 というデバイスが ブリッジされていることがわかります。 ちなみに、tap0 はVPNの仮想NIC、vnetは仮想基盤の仮想NICです。

ということで確認も終わり!

他にもいろいろやりたい。


Profile picture

Written by Narimichi Takamura (@nari_ex) who works at Topotal as CEO. He love engineering and fighting game.