Red Hat AS4 でインターフェースの冗長化 (bonding)




Linux で複数インターフェースを 1 つの NIC に仮想化する bonding という設定がある。

bonding を使えば、1 つの物理 NIC がダウンしても仮想 NIC はダウンせずに済むなど、
NIC の冗長化を実現できる。

Red Hat AS 4 で bonding を設定する方法は次の通り。

まずは、仮想インターフェース bond0 を作成する。

そのためには、/etc/sysconfig/network-scripts/ifcfg-bond0 を作成する。

DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
NETWORK=1.1.1.0
NETMASK=255.255.255.0
IPADDR=1.1.1.1
USERCTL=no
TYPE=Bonding

次に、bonding する物理インターフェースの設定変更。

今回は、eth0 と eth1 を bonding します。

そのためには以下の通り変更。

/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no

/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no

最後に、bonding のためのモジュールを読み込む。

そのためには、以下を追記。

/etc/modprobe.conf
alias bond0 bonding
options bond0 mode=0 miimon=100

○オプション

miimon
  MII リンク監視を行う間隔の指定(単位 ミリ秒)。
  0 は MII リンク監視無効。デフォルトは 0。

mode
  仮想 NIC の動作を決定します。
  デフォルトはラウンドロビン(mode 0)。

  balance-rr または 0
    ラウンドロビン。
    仮想 NIC を構成する物理 NIC に順番に処理を振る。
    負荷分散と対障害性の効果がある。

  active-backup または 1
    アクティブ・バックアップ方式。
    アクティブがコケた場合にバックアップが処理する。
    対障害性の効果がある。

  broadcast または 3
    ブロードキャスト。
    全スレーブインターフェースで全てのパケットを送信します。
    対障害性の効果がある。

(オプションは他にもいくつかあります)

システム再起動後、モジュールが読み込まれて bonding が可能になる。

また、次の方法を使えば、システムを再起動せずに、
モジュールを読み込むことができる。

モジュールの読み込み
# modprobe bonding mode=0 miimon=100

ネットワークサービスの再起動
# /etc/init.d/network restart

bonding の状態を確認する方法は次の通り。

# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v2.6.3 (June 8, 2005)

Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Link Failure Count: 8
Permanent HW addr: 11:11:11:11:11:11

Slave Interface: eth1
MII Status: up
Link Failure Count: 15
Permanent HW addr: 22:22:22:22:22:22

実際どのように外部からは見えるのだろう?

# ifconfig -a

で確認すると、

bond0 HWaddr 11:11:11:11:11:11

eth0 HWaddr 11:11:11:11:11:11

eth1 HWaddr 11:11:11:11:11:11

となっている。

つまり、仮想 NIC も物理 NIC もすべて同じ MAC である。

スイッチに接続してパケットをキャプチャしてみると、
eth0 と eth1 が接続しているポートのどちらにも
同様のパケットが流れており、
それを受け取った Linux がどちらのインターフェースで
処理するかを決めているようだ。

今回は、ラウンドロビンのオプションを指定したので、
受け取ったパケットを2つのインターフェースで交互に処理している。