Linux で NIC の bonding + bridge
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 みたいな感じで、ただ単純にインターフェースを立ち上がらせると良い。
最後に
トライアンドエラーとネット上の情報をかき集めてやってるので、用語とかが正しいのかよく分からない。 間違ってたら指摘して欲しい。 でも、なんとなく雰囲気は伝わると思う。