USB-LANでBonding設定

投稿者: | 2011年5月7日
Pocket

はじめに

結局うまくいかなかったため、試行錯誤した内容を書き連ねています。お見苦しいかと思いますがご了承下さい。。。

Openblocks600では正常動作したため、Bonding設定にまとめています。

対象サーバについて

うまくいかないため2台で試しました。結果はほとんど同じだったため、Hitachiの方を例として載せます。

1台目

製品名 Hitachi PC8DG2-P108P1C10
OS(kernel ver) Debian lenny(2.6.26-2-686)
CPU Intel(R) Celeron(R) CPU 2.00GHz
メモリ 512M(256M DDR PC2100 x 2枚)
ストレージ Seagate 160GB

2台目

製品名 Dell OPTIPLEX SX280
OS(kernel ver) Debian lenny(2.6.26-2-686)
CPU Intel Pentium4 CPU 2.8GHz
メモリ 3GB(PC2-5300U(1GB) x 1枚、PC2-5300U(2G) x 1枚)
ストレージ IBM SATA 160GB

事前準備

・ifenslaveのインストール

close:~# aptitude install ifenslave-2.6
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
拡張状態情報を読み込んでいます
パッケージの状態を初期化しています... 完了
タスクの記述を読み込んでいます... 完了
以下の新規パッケージがインストールされます:
  ifenslave-2.6
更新: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
12.3kB のアーカイブを取得する必要があります。展開後に 57.3kB のディスク領域が新たに消費されます。
拡張状態情報を書き込んでいます... 完了
取得:1 http://ftp.jp.debian.org lenny/main ifenslave-2.6 1.1.0-10 [12.3kB]
12.3kB を 2s 秒でダウンロードしました (5911B/s)
未選択パッケージ ifenslave-2.6 を選択しています。
(データベースを読み込んでいます ... 現在 59491 個のファイルとディレクトリがインストールされています。)
(.../ifenslave-2.6_1.1.0-10_i386.deb から) ifenslave-2.6 を展開しています...
man-db のトリガを処理しています ...
ifenslave-2.6 (1.1.0-10) を設定しています ...
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
拡張状態情報を読み込んでいます
パッケージの状態を初期化しています... 完了
拡張状態情報を書き込んでいます... 完了
タスクの記述を読み込んでいます... 完了

・MACアドレス確認

冗長させる前に、MACアドレスを確認しておきます。

筐体括り付け 00:00:e2:88:3d:13
Catalyst fa0/7と接続した方のUSB-LAN 00:10:60:dd:99:5c
Catalyst fa0/8と接続した方のUSB-LAN 00:10:60:db:04:24

・bondingの前に、それぞれのIFで正常に起動するか確認

close:~# cat /etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth1
allow-hotplug eth1
iface eth1 inet static
address .3
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1

auto eth2
allow-hotplug eth2
iface eth2 inet static
address 192.168.0.4
netmask 255.255.255.0
gateway 192.168.0.1

→USB-LANを使っている場合、刺す順番を入れ替えたりすると正常に動作しなくなる場合があります。その場合は、以下のファイルを参照して下さい。

close:~# vi /etc/udev/rules.d/70-persistent-net.rules

# This file was automatically generated by the /lib/udev/write_net_rules
# program run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single line.

# PCI device 0x10ec:0x8139 (8139too)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:00:e2:88:3d:13", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# USB device 0x0bda:0x8150 (rtl8150)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:10:60:dd:99:5c", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

# USB device 0x0bda:0x8150 (rtl8150)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:10:60:db:04:24", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"

→MACアドレスとNAMEが想定通りであるかを確認します。

※想定通りで無い場合、NAMEを修正して再起動をかければOKだという情報が様々なサイトで紹介されていましたが私の環境では駄目でした。

代わりに、一度上記のファイルを削除してリブートすると回復しました。

close:~# cp /etc/udev/rules.d/70-persistent-net.rules /etc/udev/rules.d/70-persistent-net.rules.original
close:~# rm /etc/udev/rules.d/70-persistent-net.rules
close:~# shutdown -r now

bonding設定

組み込むIFが正常に認識されましたら、bondingの設定に移ります。

・結合ドライバモジュールのロード

close:~# vi /etc/modprobe.d/arch/i386

...

alias bond0 bonding

close:~# modprobe bond0
close:~# vi /etc/modules

...

bonding

→本来、/etc/modprobe.d/arch/i386にbondingのオプションを記載していましたが、以下の通り、/etc/network/interface中に記載するように変わったみたいです。(私の環境では/etc/modprobe.d/arch/i386に記載してもオプションは認識されましたが…)

close:~# cat /usr/share/doc/ifenslave-2.6/README.Debian

ifenslave for Debian
----------------------

The ifenslave program distributed with the Linux kernel sources has not always
been up to date, and several modified versions have been floating around. The
latest kernels now contain an updated version though.  The Debian package
ifenslave will now use the version found in the kernel, without any patches.

You can also enslave interfaces using Debian's /etc/network/interfaces file,
like this:

iface bond0 inet static
        address 192.168.48.157
        netmask 255.255.252.0
        broadcast 192.168.48.255
        gateway 192.168.48.1
        slaves eth0 eth1

The "slaves" option can take a list of network interfaces, the keyword "none"
(with obvious results) and the keyword "all" (which selects all interfaces with
"eth" in their name). Additionally you can set bonding options by adding them
to the interface section:

        bond_mode    active-backup
        bond_primary eth0

This would run the bonding device in active backup mode with eth0 as primary.
Supported options are bond_mode, bond_miimon, bond_primary, bond_updelay,
bond_downdelay, bond_arp_ip_target, bond_arp_interval, bond_xmit_hash_policy
and bond_lacp_rate.

Guus Sliepen , Fri, 30 Sep 2005 14:33:06 +0200

→上記の通り、設定してみます。

close:~# vi /etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

allow-hotplug bond0
auto bond0
iface bond0 inet static
address 192.168.0.3
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1
slaves eth1 eth2
bond_mode active-backup
bond_miimon 100

→再起動をかけます。

close:~# shutdown -r now

起動後、状態を確認します。

close:~# ifconfig -a

bond0     Link encap:イーサネット  ハードウェアアドレス 00:10:60:dd:99:5c
          inetアドレス:192.168.0.3 ブロードキャスト:192.168.0.255  マスク:255.255.255.0
          inet6アドレス: fe80::210:60ff:fedd:995c/64 範囲:リンク
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  メトリック:1
          RXパケット:1497 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:205 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:0
          RXバイト:237984 (232.4 KiB)  TXバイト:20591 (20.1 KiB)

eth0      Link encap:イーサネット  ハードウェアアドレス 00:00:e2:88:3d:13
          BROADCAST MULTICAST  MTU:1500  メトリック:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1000
          RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)
          割り込み:18 ベースアドレス:0xe800

eth1      Link encap:イーサネット  ハードウェアアドレス 00:10:60:dd:99:5c
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  メトリック:1
          RXパケット:859 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:205 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1000
          RXバイト:125897 (122.9 KiB)  TXバイト:20591 (20.1 KiB)

eth2      Link encap:イーサネット  ハードウェアアドレス 00:10:60:dd:99:5c
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  メトリック:1
          RXパケット:638 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1000
          RXバイト:112087 (109.4 KiB)  TXバイト:0 (0.0 B)

lo        Link encap:ローカルループバック
          inetアドレス:127.0.0.1 マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:16436  メトリック:1
          RXパケット:12 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:12 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:0
          RXバイト:840 (840.0 B)  TXバイト:840 (840.0 B)

→bond0、Eth1、2ともにStatus: upでありMACアドレスが「00:10:60:dd:99:5c」になっていることを確認します。

close:~# cat /proc/net/bonding/bond0

Ethernet Channel Bonding Driver: v3.2.5 (March 21, 2008)

Bonding Mode: fault-tolerance (active-backup)
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
Link Failure Count: 0
Permanent HW addr: 00:10:60:dd:99:5c

Slave Interface: eth2
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:10:60:dd:99:5c

→active-backupであり、MII Polling Intervalが100msであること、Eth1,2ともにStatus: upでありMACアドレスが「00:10:60:dd:99:5c」になっていることを確認します。

close:~# vi /etc/udev/rules.d/70-persistent-net.rules

# This file was automatically generated by the /lib/udev/write_net_rules
# program run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single line.

# PCI device 0x10ec:0x8139 (8139too)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:00:e2:88:3d:13", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# USB device 0x0bda:0x8150 (rtl8150)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:10:60:dd:99:5c", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

# USB device 0x0bda:0x8150 (rtl8150)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:10:60:dd:99:5c", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"

→Eth1、2ともに、MACアドレスが「00:10:60:dd:99:5c」になっていることを確認します。

・対向L2SWでも確認

c2940-ACT#show arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.0.3           14   0010.60dd.995c  ARPA   Vlan1

→MACアドレスが一つで認識されています。

・動作確認

ping www.yahoo.co.jp

→1本(ACT/SBYそれぞれ)抜いても応答に変化が無いことを確認

というわけで、一応動くには動いたのですが、/etc/init.d/networking restartするとサーバが固まってしまいました。

仕方なく強制再起動させて状態確認してみたところ、eth2が認識されなくなっていました。

何度か試してみたところ、以下のパターンでは問題なく復旧刺さることができました(ただし、起動時にエラーが出ていますが・・・)

1. /etc/network/interfacesの修正

close:~# vi /etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

allow-hotplug bond0
auto bond0
iface bond0 inet static
address 192.168.0.3
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1
#slaves eth1 eth2
#bond_mode active-backup
#bond_miimon 100
pre-up ifconfig bond0 up
pre-up ifenslave bond0 eth1 eth2
pre-down ifenslave -d bond0 eth1 eth2
post-down ifconfig bond0 down

→bonding設定を削除し、末尾四行を追記

2. ドライバオプションを以前の形式で行う

close:~# vi /etc/modprobe.d/arch/i386

...

alias bond0 bonding
options bonding mode=1 miimon=100

→末尾optionsの行を追記

3. rm /etc/udev/rules.d/70-persistent-net.rules

4. shutdown -r now

5. 正常性確認

close:~# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.2.5 (March 21, 2008)

Bonding Mode: fault-tolerance (active-backup)
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
Link Failure Count: 0
Permanent HW addr: 00:10:60:dd:99:5c

Slave Interface: eth2
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:10:60:dd:99:5c

→問題なし

close:~# /etc/init.d/networking restart
Reconfiguring network interfaces...done.

→今度は問題無し

close:~# ping www.yahoo.co.jp
PING www.ya.gl.yahoo.co.jp (124.83.147.212) 56(84) bytes of data.
64 bytes from f6.top.vip.ogk.yahoo.co.jp (124.83.147.212): icmp_seq=1 ttl=50 time=18.2 ms
64 bytes from f6.top.vip.ogk.yahoo.co.jp (124.83.147.212): icmp_seq=2 ttl=50 time=22.2 ms
64 bytes from f6.top.vip.ogk.yahoo.co.jp (124.83.147.212): icmp_seq=3 ttl=50 time=18.0 ms
^C
--- www.ya.gl.yahoo.co.jp ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2007ms
rtt min/avg/max/mdev = 18.077/19.548/22.284/1.936 ms

→問題なし

close:~# mii-tool
SIOCGMIIPHY on 'eth0' failed: Invalid argument
SIOCGMIIPHY on 'eth1' failed: Operation not supported
SIOCGMIIPHY on 'eth2' failed: Operation not supported
no MII interfaces found

→ここまでやってMIIをサポートしていないことが判明しました。

代わりにARPを使う方式に変えます。

close:~# vi /etc/modprobe.d/arch/i386

...

alias bond0 bonding
options bonding mode=1 miimon=0 arp_interval=50000 arp_ip_target=192.168.0.1

rm /etc/udev/rules.d/70-persistent-net.rulesして再度、再起動します。

close:~# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.2.5 (March 21, 2008)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth1
MII Status: up
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0
ARP Polling Interval (ms): 50000
ARP IP target/s (n.n.n.n form): 192.168.0.1

Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:10:60:dd:99:5c

Slave Interface: eth2
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:10:60:dd:99:5c

→ARP関連の出力が新たに表示されました。パラメータも指定どおりになっています。

キャプチャ結果でもARPが5秒間隔で飛んでいるのを確認できました。

うまくいったと思ったのも束の間、IFを片方抜くと、10発OK、10発NGという不安定な状態になり、しばらくしてBOND0ごとDOWNするという事象が発生しました。

起動時時のログにBUGらしきエラーが出ているのが原因でしょうか…

close:~# cat /var/log/dmesg

[   22.255032] rtl8150: eth1: allmulti set
[   22.255107] BUG: scheduling while atomic: ifenslave/1910/0x00000100
[   22.255168] Pid: 1910, comm: ifenslave Not tainted 2.6.26-2-686 #1
[   22.255193]  [] schedule+0x70/0x66f
[   22.255217]  [] lock_timer_base+0x19/0x35
[   22.255231]  [] __mod_timer+0x99/0xa3
[   22.255243]  [] schedule_timeout+0x6b/0x86

...

[   22.257996] BUG: scheduling while atomic: ifenslave/1910/0x00000100
[   22.257996] Pid: 1910, comm: ifenslave Not tainted 2.6.26-2-686 #1

...

[   22.260006] bonding: bond0: making interface eth1 the new active one.
[   22.260006] rtl8150: eth1: allmulti set
[   22.260006] bonding: bond0: first active interface up!
[   22.260006] bonding: bond0: enslaving eth1 as an active interface with an up link.
[   22.276026] rtl8150: eth2: allmulti set
[   22.276026] BUG: scheduling while atomic: ifenslave/1910/0x00000100
[   22.276026] Pid: 1910, comm: ifenslave Not tainted 2.6.26-2-686 #1
[   22.276026]  [] schedule+0x70/0x66f
[   22.276026]  [] lock_timer_base+0x19/0x35

...

[   22.294120] BUG: scheduling while atomic: ifenslave/1910/0x00000100
[   22.294178] Pid: 1910, comm: ifenslave Not tainted 2.6.26-2-686 #1

...

[   22.297085] bonding: bond0: enslaving eth2 as a backup interface with an up link.

→何とかしたいのですがお手上げです。

一応、オプション設定をdebian流儀に戻しても同じ問題が起きるか、再度確認してみます。

close:~# vi /etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

allow-hotplug bond0
auto bond0
iface bond0 inet static
address 192.168.0.3
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1
slaves eth1 eth2
bond_mode active-backup
bond_miimon 0
bond_primary eth1
bond_arp_interval 5000
bond_arp_ip_target 192.168.0.1
#bond_updelay 10000
#pre-up ifconfig bond0 up
#pre-up ifenslave bond0 eth1 eth2
#pre-down ifenslave -d bond0 eth1 eth2
#post-down ifconfig bond0 down
close:~# vi /etc/modprobe.d/arch/i386

...

alias bond0 bonding
#options bonding mode=1 miimon=100
#options bonding mode=1 miimon=0 arp_interval=50000 arp_ip_target=192.168.0.1

close:~# /etc/init.d/networking stop
Deconfiguring network interfaces...done.
close:~# /etc/init.d/networking start
Configuring network interfaces.../etc/network/if-pre-up.d/ifenslave: line 58: echo: write error: Invalid argument
done.

エラーが出るため、こちらのサイトを参照にして

vi /etc/network/if-post-down.d/ifenslave

echo '-192.168.0.1' > /sys/class/net/bond0/bonding/arp_ip_target

末尾に上記を追記して再起動

close:~# /etc/init.d/networking stop
Deconfiguring network interfaces...done.
close:~# /etc/init.d/networking start
Configuring network interfaces...done.

→うまく起動しましたが、しばらくしてBOND0ごとDOWNするという事象は改善されず、再起動してもだめでした。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です