Linux で NIC の bonding + bridge

NIC 買いました

インテル PRO/1000 PT デュアルポート サーバ・アダプタ EXPI9402PT

これをとりあえず4枚。 中古で1枚辺り4000円くらいでした。

NIC 取り付けました

もともと Dual Port なサーバーにも取り付けたので、1台のサーバーから LAN ケーブルが4本生えてきて激しく L2 スイッチのポートを占領してきます。 つい先日16ポートの L2 スイッチを買ったばかりなのに、もうポートが埋まってしまいました。

1台のサーバーに複数の LAN ケーブルをさせるようになった僕たちは

bonding を試してみるしかない。

よしだ VPS

ホストマシンとして動かすために、 bonding したインターフェースをブリッジのポートとして使いたい。

やってみた

Ubuntu 12.04 LTS 編

bonding をロード

modprobe bonding
echo "bonding" >> /etc/modules

インターフェースの設定

$ cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual
    bond-master bond0

auto eth1
iface eth1 inet manual
    bond-master bond0

auto eth2
iface eth2 inet manual
    bond-master bond0

auto eth3
iface eth3 inet manual
    bond-master bond0

auto bond0
iface bond0 inet manual
    bond-slaves none
    bond-miimon 100
    bond-mode 1

auto br0
iface br0 inet static
    bridge_ports bond0

    address 192.168.1.100
    network 192.168.1.0
    netmask 255.255.255.0
    broadcast 192.168.1.255
    gateway 192.168.1.1
    dns-nameservers 192.168.1.10

    pre-up ifup bond0
    post-down ifdown bond0

ネットワーク再起動

$ sudo /etc/init.d/networking restart

Scientific Linux 6.3 編

Redhat Enterprise Linux クローンなので、 Redhat Enterprise Linux やそのクローンなら変わらないと思う。 事実、 Redhat Enterprise Linux のドキュメント読んで設定した。

bonding をロード

$ cat /etc/modprobe.d/bonding.conf
alias bond0 bonding

インターフェースの設定

$ cat /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
ONBOOT=yes
BOOTPROTO=none
BONDING_OPTS="mode=1 miimon=100"
BRIDGE=br0
$
$ cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=none
IPADDR=192.168.1.200
PREFIX=24
GATEWAY=192.168.1.1
$
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO=none
ONBOOT=yes
HWADDR=00:15:17:XX:YY:ZZ
MASTER=bond0
SLAVE=yes

/etc/sysconfig/network-scripts/ifcfg-eth1 以降は、1行めと4行目が違うだけ。

ネットワーク再起動

$ /etc/rc.d/network restart

結果

ifconfig

$ ifconfig
bond0     Link encap:Ethernet  HWaddr 00:15:17:XX:YY:ZZ
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:225061 errors:0 dropped:53618 overruns:0 frame:0
          TX packets:83983 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:61269544 (61.2 MB)  TX bytes:16177865 (16.1 MB)

br0       Link encap:Ethernet  HWaddr 00:15:17:XX:YY:ZZ
          inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:78075 errors:0 dropped:0 overruns:0 frame:0
          TX packets:61643 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:10268843 (10.2 MB)  TX bytes:10584226 (10.5 MB)

eth0      Link encap:Ethernet  HWaddr 00:15:17:XX:YY:ZZ
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:162525 errors:0 dropped:228 overruns:0 frame:0
          TX packets:79854 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:45562722 (45.5 MB)  TX bytes:15420797 (15.4 MB)
          Interrupt:16 Memory:fbde0000-fbe00000

eth1      Link encap:Ethernet  HWaddr 00:15:17:XX:YY:ZZ
          UP BROADCAST RUNNING PROMISC SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:55268 errors:0 dropped:46114 overruns:0 frame:0
          TX packets:4129 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:15011606 (15.0 MB)  TX bytes:757068 (757.0 KB)
          Interrupt:17 Memory:fbee0000-fbf00000

eth2      Link encap:Ethernet  HWaddr 00:15:17:XX:YY:ZZ
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:3636 errors:0 dropped:3640 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:347749 (347.7 KB)  TX bytes:0 (0.0 B)
          Interrupt:18 Memory:fbfe0000-fc000000

eth3      Link encap:Ethernet  HWaddr 00:15:17:XX:YY:ZZ
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:3632 errors:0 dropped:3636 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:347467 (347.4 KB)  TX bytes:0 (0.0 B)
          Interrupt:19 Memory:fbfa0000-fbfc0000

ping 編

  1. 適当なマシンから 192.168.1.100 に向けて ping を打つ
  2. 192.168.1.100 のマシンに繋がる LAN ケーブルを1本思い切って引っこ抜く
  3. こいつ、 LAN ケーブル抜いても ping 返ってくるぞ……!!

トラブルシューティング的な

Ubuntu 12.04 LTS 編

/etc/network/interfaces の順番大切!!

順番間違うと、ネットワーク再起動しても、 bonding インターフェースに ethernet port が attach しなくて使えなかったりする。 pre-up とか post-up とかのフックを設定してみたけれど、自分の場合うまく設定出来ず諦めたので、順番大切!!

下手すると、 bond0 がスレーブが立ち上がってくるのを待っていて、スレーブはマスターが立ち上がってくるのを待つような、デッドロック状態に陥る。

ネットワーク再起動時のデッドロック

設定を変えた後、前述のマスターとスレーブが互いに待ち合うデッドロックに陥る場合がある。

そういう時は、手動でインターフェースを立ち上がらせてやる。 その時に、 ifup コマンドを使うと、設定を読みに行って結局デッドロックに陥るので、 ifconfig ethX up みたいな感じで、ただ単純にインターフェースを立ち上がらせると良い。

最後に

トライアンドエラーとネット上の情報をかき集めてやってるので、用語とかが正しいのかよく分からない。 間違ってたら指摘して欲しい。 でも、なんとなく雰囲気は伝わると思う。