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 編
- 適当なマシンから 192.168.1.100 に向けて ping を打つ
- 192.168.1.100 のマシンに繋がる LAN ケーブルを1本思い切って引っこ抜く
- こいつ、 LAN ケーブル抜いても ping 返ってくるぞ……!!
トラブルシューティング的な
Ubuntu 12.04 LTS 編
/etc/network/interfaces の順番大切!!
順番間違うと、ネットワーク再起動しても、 bonding インターフェースに ethernet port が attach しなくて使えなかったりする。 pre-up とか post-up とかのフックを設定してみたけれど、自分の場合うまく設定出来ず諦めたので、順番大切!!
下手すると、 bond0 がスレーブが立ち上がってくるのを待っていて、スレーブはマスターが立ち上がってくるのを待つような、デッドロック状態に陥る。
ネットワーク再起動時のデッドロック
設定を変えた後、前述のマスターとスレーブが互いに待ち合うデッドロックに陥る場合がある。
そういう時は、手動でインターフェースを立ち上がらせてやる。 その時に、 ifup コマンドを使うと、設定を読みに行って結局デッドロックに陥るので、 ifconfig ethX up みたいな感じで、ただ単純にインターフェースを立ち上がらせると良い。
最後に
トライアンドエラーとネット上の情報をかき集めてやってるので、用語とかが正しいのかよく分からない。 間違ってたら指摘して欲しい。 でも、なんとなく雰囲気は伝わると思う。