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つのインターフェースで交互に処理している。