JF Linux Kernel 2.4 Documentation: /usr/src/linux/Documentation/networking/bonding.txt

networking/bonding.txt

Linux で複数のネットワーク I/F を束ねて負荷分散と可用性向上を行う方法 [プレインテキスト版]


		   Linux イーサネット結合ドライバ ミニ Howto

初版 : Thomas Davis <tadavis at lbl.gov>

修正, 高可用性 (HA) 拡張 : 2000/10/03-15 :

  - Willy Tarreau <willy at meta-x.org>
  - Constantine Gavrilov <const-g at xpert.com>
  - Chad N. Tindel <ctindel at ieee dot org>
  - Janice Girouard <girouard at us dot ibm dot com>
  - Jay Vosburgh <fubar at us dot ibm dot com>

注 :
----
結合ドライバは元々 Donald Becker の Linux カーネル 2.0 用 Beowulf パッチの一
部でした。このドライバはその後少々変更されたので、Extreme-Linux と Beowulf 
のサイトにあるオリジナルのツールは、このバージョンのドライバでは動作しないで
しょう。

新しいバージョンのドライバ、古いカーネル用のパッチ、更新されたユーザ空間のツー
ルは、このファイルの末尾にあるリンク先を参照して下さい。

【訳注:ユーザ空間 (userspace) はカーネル空間 (kernelspace) との対比語で、前
  者がシェルやコマンドなどのユーザ/一般プロセスが操作し得る世界、後者がデバ
  イスドライバやスケジューラなどのユーザ/一般プロセスが操作できないカーネル
  内の世界を意味します】

【訳注:原文中に下記の単語が頻繁に出てきます。
	・結合ドライバ (bonding driver)
	・結合インターフェース (bonding interface)
	・結合デバイス (bonding device)
	・結合 (bond)
	・結合 (bonding)
  結合ドライバはカーネルのデバイスドライバと容易に分かると思いますが、同じネッ
  トワークインターフェース bond? を意味する単語が多数あると分かりにくいかと
  思いますので、本訳では「bonding interface」「bonding device」「bond」
  「bonding」と表現されている物は全て「結合インターフェース」として翻訳しま
  した。】

目次
====
 
インストール
結合インターフェースの設定
モジュールパラメータ
複数の結合インターフェースの設定
スイッチの設定
結合インターフェースの設定の確認
頻繁に問われる質問 (FAQ)
高可用性 (HA)
スニッフィングの注意
制限事項
資料とリンク

インストール
============

1) 結合ドライバ付きのカーネルの構築
-----------------------------------
最新バージョンの結合ドライバの為に、Linux カーネル 2.4.12 以降を使用して下さ
い (さもなければ、パッチを当てる必要があるでしょう)。

make menuconfig/xconfig/config でカーネルの設定を行い、「Network device
support」セクションにある「Bonding driver support」を選択します。ドライバは
モジュールとして設定する事をお勧めします。何故なら、現在それが、ドライバにパ
ラメータを渡し、複数の結合インターフェースを設定する唯一の方法だからです。

新しいカーネルとモジュールを構築してインストールします。

2) ユーザ空間のツールの入手とインストール
-----------------------------------------
このバージョンの結合ドライバは更新された ifenslave プログラムを要求します。
Extreme-linux や Beowulf にあるオリジナルのツールは使えません。カーネル 
2.4.12 以降には Documentation/network ディレクトリに更新バージョンの 
ifenslave.c が収録されています。古いカーネル向けには、このファイルの末尾のリ
ンク先を参照して下さい。

重要!! もしあなたが Red Hat 7.1 以降を使用している場合、/usr/include/linux 
がもはや /usr/src/linux/include/linux へのシンボリックリンクでない事に注意す
る必要があります。この環境下で ifenslave を構築した場合、ifenslave はきちん
と動いているように見えても結合インターフェースは動作しません。ifenslave コン
パイル行の -I オプションの目的は、/usr/include/linux/if_bonding.h ではなく 
/usr/src/linux/include/linux/if_bonding.h を確実に使用する事です。

【訳注:古い Linux ディストリビューションでは、
	ln -s /usr/src/linux/include/linux /usr/include/linux
	ln -s /usr/src/linux/include/asm /usr/include/asm
	ln -s /usr/src/linux/include/scsi /usr/include/scsi
  で /usr/src/linux にあるカーネルソース中のヘッダファイル用のシンボリックリ
  ンクを作成するのが一般的でした。カーネル関連のツールではこのシンボリックリ
  ンクを前提としている物があります。】

ifenslave.c のインストール手順は下記の通りです。

    # gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux/include ifenslave.c -o ifenslave 
    # cp ifenslave /sbin/ifenslave

結合インターフェースの設定
==========================

bond0 インターフェースが設定された時に結合ドライバが自動的にロードされるよう、
/etc/modules.conf の末尾に次の行を追加する必要があります。特定の 
modules.conf の書式の詳細については modules.conf のマニュアルページを参照し
て下さい。この文書の「モジュールパラメータ」の章で結合ドライバの各パラメータ
について説明します。

	alias bond0 bonding

bond0 ネットワークインターフェースの定義には、ディストリビューションの標準テ
クニックを使用して下さい。例えば、最近の Red Hat ディストリビューションであ
れば、/etc/sysconfig/network-scripts ディレクトリに下記のような ifcfg-bond0 
ファイルを作って下さい。

DEVICE=bond0
IPADDR=192.168.1.1
NETMASK=255.255.255.0
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
ONBOOT=yes
BOOTPROTO=none
USERCTL=no

(上記にあなたのネットワークの適切な値を使用して下さい)

結合インターフェースを構成するインターフェースには全て、SLAVE と MASTER の定
義があります。例えば、Red Hat の場合、eth0 と eth1 を結合インターフェース 
bond0 の一部にしたい場合、これらのインターフェースの設定ファイル (ifcfg-eth0 
と ifcfg-eth1) は以下のような形になります。

DEVICE=eth0
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none

ifcfg-eth1 の設定ファイルでは DEVICE=eth1 を使用して下さい。2つ目の結合イン
ターフェース (bond1) を設定する場合は、bond1 のスレーブとなるネットワークイ
ンターフェースの設定ファイルに MASTER=bond1 を使用して下さい。

ネットワークサブシステムを再スタートするか、お使いの管理ツールで出来るのであ
れば結合インターフェースを単に起動して下さい。あるいは、システムを再起動して
下さい。Red Hat ディストリビューションでは、「ifup bond0」または
「/etc/rc.d/init.d/network restart」を実行します。

ディストリビューションの管理ツールがネットワークインターフェースの設定でマス
ター/スレーブ記述をサポートしていない場合、下記のコマンドを使って手動で結合
インターフェースを設定する必要があります。

    # /sbin/ifconfig bond0 192.168.1.1 netmask 255.255.255.0 \
      broadcast 192.168.1.255 up

    # /sbin/ifenslave bond0 eth0
    # /sbin/ifenslave bond0 eth1

(上記にあなたのネットワークに適切な値を使用して下さい)

それから、これらのコマンドを含むスクリプトを作って、適切な rc ディレクトリに
設置して下さい。

特に、結合ドライバの前に全てのネットワークドライバをロードしておく必要がある
場合、次の行をmodules.conf に追加すると、結合ドライバの前に eth0 と eth1 用
のネットワークドライバがロードされるようになります。

probeall bond0 eth0 eth1 bonding

この行末で bond0 自体を参照しないよう注意して下さい。さもないと modprobe が
無限ループに陥って異常終了してしまいます。

デバイスの特性 (MTUサイズなど) をスレーブデバイスにも適用するようにするには、
デバイスのスレーブ化の指定の前に結合インターフェースの特性を設定して下さい。
特性はスレーブ化の過程でスレーブデバイスに適用されます。

SNMP エージェントが動作している場合、結合ドライバはどのネットワークドライバ
も結合インターフェースに参加する前にロードされるべきです。この制約は、インター
フェースインデックス (ipAdEntIfIndex) が与えられた IP アドレスを持つ最初に見
つかったインターフェースと関連付けられるために必要となります。つまり、各 IP 
アドレスに対して、ipAdEntIfIndex は一つしか設定できません。例えば、eth0 と 
eth1 が bond0 のスレーブであり、eth0 用ドライバが結合ドライバより先にロード
された場合、その IP アドレスのインターフェースは eth0 インターフェースと関連
づけられます。この設定は下記の様になり、IP アドレス 192.168.1.1 はifDescr テー
ブル中でインターフェース番号 2 となり、それはインターフェースインデックステー
ブルでは (ifDescr.2) eth0 を指してしまっています。

     interfaces.ifTable.ifEntry.ifDescr.1 = lo
     interfaces.ifTable.ifEntry.ifDescr.2 = eth0
     interfaces.ifTable.ifEntry.ifDescr.3 = eth1
     interfaces.ifTable.ifEntry.ifDescr.4 = eth2
     interfaces.ifTable.ifEntry.ifDescr.5 = eth3
     interfaces.ifTable.ifEntry.ifDescr.6 = bond0
     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.10.10.10.10 = 5
     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.192.168.1.1 = 2
     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.10.74.20.94 = 4
     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.127.0.0.1 = 1

この問題は結合ドライバを (特にその結合インターフェース中の) 他のネットワーク
ドライバより先にロードする事で回避できます。下記は結合ドライバを最初にロード
した例で、IP アドレス 192.168.1.1. が正しく ifDescr.2 と関連づけられています。

     interfaces.ifTable.ifEntry.ifDescr.1 = lo
     interfaces.ifTable.ifEntry.ifDescr.2 = bond0
     interfaces.ifTable.ifEntry.ifDescr.3 = eth0
     interfaces.ifTable.ifEntry.ifDescr.4 = eth1
     interfaces.ifTable.ifEntry.ifDescr.5 = eth2
     interfaces.ifTable.ifEntry.ifDescr.6 = eth3
     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.10.10.10.10 = 6
     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.192.168.1.1 = 2
     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.10.74.20.94 = 5
     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.127.0.0.1 = 1

いくつかのディストリビューションでは ifDescr のインターフェース名をレポート
しないかも知れませんが、IP アドレスと ifIndex の関係は同じで、
Interface_Scan_Next 等の SNMP 機能はこの関連づけをレポートするでしょう。

モジュールパラメータ
====================

結合ドライバのオプションパラメータは insmod コマンドのコマンドライン引数とし
て与える事が出来ます。通常、これらのパラメータは /etc/modules.conf ファイル
中で指定することになります (modules.conf のマニュアルページを参照して下さい) 。
パラメータが与えられない場合は、デフォルト値が使用されます。ある結合インター
フェースを最初に設定する際には、結合ドライバのエラーメッセージを監視するため
に、別のウインドウで "tail -f /var/log/messages" を実行しておく事をお勧めし
ます。

miimon パラメータか、arp_interval と arp_ip_target パラメータを指定するのは
必須です。どちらも指定していない場合、リンクが失敗した場合に深刻なネットワー
ク性能の低下を引き起こすからです。

arp_interval
 
	ARP モニタリング頻度をミリ秒単位で指定します。ロードバランシングモー
	ド (モード 0 または 2) でARP モニタリングが使用された場合、スイッチ
	はラウンドロビン (順繰り) のような全てのリンクに対してパケットを均等
	に分配するモードに設定されるべきです。スイッチが XOR スタイルでパケッ
	トを分配する場合、ARP ターゲットに対する全ての返信は同じリンクで受信
	してしまい、他のチームメンバーの失敗を引き起こします。ARP モニタリン
	グは miimon と同時に使用すべきではありません。デフォルト値は 0 です。
 
arp_ip_target
 
	arp_interval が正数の場合の IP アドレスを指定します。これらは、ター
	ゲットへのリンクの健康 (状態) を測定する為に送られる ARP リクエスト
	のターゲットです。ddd.ddd.ddd.ddd 形式でこれらの値を指定して下さい。
	複数の IP アドレスはコンマで区切る必要があります。ARP モニタリングを
	動作させるためには、少なくても1つの IP アドレスが必要です。指定可能
	なターゲット数の最大値は 16 です。

downdelay
 
	リンク失敗が検知されてからリンクを無効にするまでの遅延時間をミリ秒で
	指定します。これは、miimon 値の倍数でなければなりません。さもないと
	値が1周してしまいます。デフォルト値は 0です。

lacp_rate

	802.3ad モードでの LACPDU パケットを転送する為のリンクパートナーを問
	い合わせる際のレートを指定するオプション。採り得る値は下記の通りです。

	slow or 0
		LACPDUを送るパートナーを 30秒単位で要求する (デフォルト)

	fast or 1
		LACPDU を送るパートナーを 1秒単位で要求する

max_bonds

	結合ドライバの1実体用に作成する結合インターフェースの数を指定します。
	つまり、miimon maxbonds が 3 で、結合ドライバがまだロードされていな
	い場合、bond0, bond1, bond2 が作られます。デフォルト値は 1 です。

miimon
 
	MII リンク監視を行う頻度をミリ秒単位で指定します。0 は MII リンク監
	視を無効にします。100 は最初の値としては良いでしょう。追加情報は「高
	可用性」の章を参照して下さい。デフォルト値は 0 です。

mode

	結合ポリシーの1つを指定します。デフォルトはラウンドロビン
	(balance-rr ; 順繰り) です。採り得る値は下記の通り (テキストと数字の
	オプションのどちらでも使用可)。

	balance-rr or 0

		ラウンドロビンポリシー:利用可能なスレーブを最初から最後まで
		順番に使用して送信します。このモードは負荷分散と対障害性を提
		供します。

	active-backup or 1

		アクティブバックアップポリシー:結合インターフェース中の1ス
		レーブのみアクティブです。そのアクティブスレーブが失敗した時
		に限り、他のスレーブがアクティブになります。スイッチの混乱を
		避けるため、その結合インターフェースの MAX アドレスは外部か
		らは1ポート (1ネットワークアダプタ) のみ見えます。このモー
		ドは対障害性を提供します。
 
	balance-xor or 2

		XOR ポリシー:「(宛先 MAC アドレスで XOR された元 MAC アドレ
		ス) モジューラスレーブカウント」を基にして送信されます。この
		選択は同じ宛先 MAX アドレスに対して同じスレーブを使います。
		このモードは負荷分散と対障害性を提供します。

	broadcast or 3

		ブロードキャストポリシー:全スレーブインターフェースで全ての
		パケットを送信します。このモードは対障害性を提供します。

	802.3ad or 4

		IEEE 802.3ad 動的リンク集合。スピードと全/半二重設定が同じ
		集合グループを作成します。アクティブ集合では全てのスレーブで
		送受信します。
 
		必要条件:

		1. 各スレーブのスピードと全/半二重を修正する為の、ベースド
                   ライバにおける Ethtool サポート

		2. IEEE 802.3ad 動的リンク集合をサポートしたスイッチ

	balance-tlb or 5

		適応送信負荷分散:特別なスイッチサポートを必要としないチャネ
		ル結合。外向き通信は現在の負荷に従って各スレーブに分配されま
		す。内向き通信は現在のスレーブで受信されます。受信スレーブが
		失敗した場合、別のスレーブが失敗した受信用スレーブの MAC ア
		ドレスを引き継ぎます。

		必要条件:

		各スレーブのスピードを変更する為の、ベースドライバにおける 
		Ethtool サポート。

	balance-alb or 6 

		適応負荷分散:IPV4 通信用に balance-tlb と受信負荷分散 (rlb)
		を含み、特別なスイッチサポートを必要としません。受信負荷分散
		は ARP 交渉によって実現されます。結合ドライバはサーバに対し
		て送られた ARP 返信を途中で横取りし、サーバへの通信で個々の
		クライアントが個別のハードウェアアドレスを使用するように、ソー
		スハードウェアアドレスを結合インターフェース中の単一のハード
		ウェアアドレスで上書きします。
		
		サーバによって作られた接続からの受信通信も負荷分散されます。
		サーバが ARP 要求を送信した場合、結合ドライバが ARP からのク
		ライアントの IP 情報をコピーして保存します。クライアントから 
		ARP 応答を受け取った際、そのハードウェアアドレスが調べられ、
		結合ドライバは結合インターフェース中のスレーブの1つを割り当
		てて、結合中のスレーブの一つに対してこのクライアントからの応
		答を作成して返します。負荷分散の為の ARP 交渉を行うため、毎
		回結合インターフェースのハードウェアアドレスを使用した ARP 
		要求がブロードキャストされることから問題が発生します。このよ
		うなブロードキャストの結果、クライアントは結合インターフェー
		スのハードウェアアドレスを学習し、現在のスレーブへの受信通信
		の負荷分散が失敗します。これは、通信が再分布されるような、割
		り当てられたハードウェアアドレスを持つ全てのクライアントに対
		してアップデート (ARP 応答) を送信する事によって扱われます。
		新しいスレーブが結合インターフェースに追加された場合や、アク
		ティブでないスレーブが再度アクティブになった場合にも、受信通
		信が再配付されます。受信負荷はその結合インターフェースの中で
		最も高い速度のスレーブのグループ間で順番に (ラウンドロビンで) 
		分配されます。

		リンクが再接続されたり、新しいスレーブが結合インターフェース
		に参加したりした場合、選択された MAC アドレスを持つ ARP 応答
		を各クライアントに対して開始する事により受信通信は接続中の現
		在アクティブな全スレーブ中に再度配付されます。クライアントへ
		の ARP 応答がスイッチでブロックされることのないよう、updelay
		modprobe パラメータをスイッチのフォワーディング時間と同じか、
		それより大きく設定しなければいけません。

		前提条件:

		1. 各スレーブのスピードを調整する為のベースドライバの 
                Ethtool サポート。

		2. デバイスがオープンされている場合でも、デバイスのハードウェ
		アアドレスを設定可能とするベースドライバサポート。これは、結
		合インターフェースのハードウェアアドレス (current_slave) を
		使っているチーム内で、結合インターフェースの各スレーブが単一
		のハードウェアアドレスを持っている間、常にスレーブが単一であ
		る為に必要です。current_slave が失敗した場合、ハードウェアア
		ドレスは選択された新しい current_slave と入れ替わります。

multicast

	マルチキャストサポートの為の操作モードを指定するオプション。
	採り得る値は下記の通り。

	disabled or 0
		無効 (マルチキャストサポートなし)

        active or 1
		アクティブバックアップモードに便利な、アクティブなスレーブの
		み有効。

	all or 2
		全てのスレーブを有効。これがデフォルト。

primary

	1番目のデバイスとして扱う文字列 (eth0, eth2、など)。もしこの値が入
	力され、デバイスがオンラインであれば、そのデバイスは出力メディアとし
	て最初に使用されるようになります。このデバイスがオフラインの場合のみ、
	別のデバイスが使用されます。さもないと、一度フェイルオーバーが検知さ
	れ、新しいデフォルト出力が選択されると、新しい出力側に障害が起きない
	限りそちらが使われ続けるからです。これは、あるスレーブが別のスレーブ
	より優れている場合に便利です。つまり、あるスレーブが 1000Mbps で他の
	スレーブが 100Mbps の場合です。1000Mbps スレーブが失敗して後から回復
	した場合、故意に 100Mbps のスレーブを失敗させる事なく、より速いスレー
	ブが上品にアクティブなスレーブになる法が優先されるでしょう。primary 
	の指定は active-backup モードの場合のみ有効です。

updelay

	リンクアップ状態を検知した後にリンクが有効になるまでの遅延時間をミリ
	秒で指定します。これは miimon 値の倍数であるべきです。さもないと値が
	丸められてしまいます。デフォルト値は 0 です。

use_carrier

	リンク状態を検知するのに miimon が MII あるいは ETHTOOL ioctl/
	netif_carrier_ok() を使うか使わないかを指定します。MII または 
	ETHTOOL ioctl はあまり効率が良くなく、カーネル内で非推奨のシステムコー
	ル発行を行います。netif_carrier_ok() は、自身の状態を 
	netif_carrier_on/off を使って管理するためにデバイスドライバに頼りま
	す。この文章を書いている時点では、ほとんど、しかし全てではないデバイ
	スドライバがこの機能をサポートしています。

	リンクが上がるべきでない時にリンクが上がっている事を結合インターフェー
	スが要求しつづける場合、これはネットワークデバイスドライバは 
	netif_carrier_on/off をサポートしないためかもしれません。これは 
	netif_carrier のデフォルト状態が「carrier on」だからです。 この場合、
	user_carrier を無効化する事で、リンク状態の検知に MII/ETHTOOL ioctl 
	手法を使うよう結合インターフェースに指示できます。

	1 は netif_carrier_ok() の使用を有効にし、0 はあまり望ましくない MII/
	ETHTOOL ioctl を使用します。デフォルト値は 1 です。



複数の結合インターフェースの設定
================================

いくつかの結合インターフェースが必要な場合、max_bonds パラメータ (上記で説明) 
を指定するか、デバイスドライバを複数回ロードして下さい。max_bonds パラメータ
を使用する事により、若干複雑ではなくなりますが、用意された全ての結合インター
フェースが同じオプションを持つという制限があります。ドライバの複数回ロードは、
ドライバの各インスタンスに別のオプションを設定できます。

例えば、2つの結合インターフェースを設定する際、片方は MII リンク監視を 100
ミリ秒単位で実行して、もう片方は ARP リンク監視を 200ミリ秒単位で実行する場
合、/etc/modules.conf は下記のような形になります。

alias bond0 bonding
alias bond1 bonding

options bond0 miimon=100
options bond1 -o bonding1 arp_interval=200 arp_ip_target=10.0.0.1

複数の ARP ターゲットの設定
===========================

単一のターゲットに対して ARP 監視を行う事もできますが、高可用性 (HA) セット
アップではモニターするターゲットを複数持つ事は有用です。単一ターゲットの場合、
そのターゲット自体がダウンしてしまうかも知れませんし、ARP 要求に応答できなく
なる問題が発生するかもしれません。追加のターゲットを持つ事は ARP 監視の信頼
性を向上させます。

複数の ARP ターゲットは下記のようにカンマで区切られなければなりません。

# 3つのターゲットによる ARP 監視の為のオプションの例

alias bond0 bonding
options bond0 arp_interval=60 arp_ip_target=192.168.0.1,192.168.0.3,192.168.0.9

単一ターゲットでもオプションは似ています。

# example options for ARP monitoring with one target
alias bond0 bonding
options bond0 arp_interval=60 arp_ip_target=192.168.0.100

ARP 監視を使用する場合の潜在的な問題点
======================================

1. ドライバのサポート

ARP 監視は2つの統計値 (下記) を管理するためにネットワークデバイスドライバに
依存しています。
・最後に受信した時刻 (dev->last_rx)
・最後に送信した時刻 (dev->trans_start)
ネットワークデバイスドライバがどちらかの値を更新しない場合、典型的な結果とし
てはスタートアップ時、結合インターフェース中の全リンクがダウンしたと即時に通
知する事になります。ネットワーク監視ツール (tcpdump 等) は結合インターフェー
ス上で送受信される ARP 要求/応答を表示するでしょう。

採り得るこの問題の解決策としては、(a)デバイスドライバを修正する事か、(b)ARP
監視を止める (例えば、miimon を代用する) かです。

2. ルーティングでの冒険

ARP監視で結合インターフェースが設定された場合、スレーブデバイスがマスターデ
バイスを上書きするようなルーティングを持たない事 (あるいは、一般的に、全くルー
ティングを持たない事) は重要です。例えば、結合インターフェース bond0 が2つ
のスレーブ (eth0,eth1) を持っており、ルーティングテーブルは次のようになって
いる場合。

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.0.0.0        0.0.0.0         255.255.0.0     U        40 0          0 eth0
10.0.0.0        0.0.0.0         255.255.0.0     U        40 0          0 eth1
10.0.0.0        0.0.0.0         255.255.0.0     U        40 0          0 bond0
127.0.0.0       0.0.0.0         255.0.0.0       U        40 0          0 lo

この場合、ARP 監視 (と ARP自身) は衝突するかも知れません。何故なら、ARP 要求
はあるインターフェース (bond0) で送信されたのに、その応答が異なるインターフェー
ス (eth0) に届くかも知れないからです。この応答は ARP にとって、要求していな
い ARP 要求に見えてしまい (ARP 一致はインターフェースを基準として応答される
ので)、破棄されてしまいます。これはおそらくドライバ中で受信/送信時間を更新
するでしょうが、パケットを失います。

ここの解決法は簡単で、スレーブが自身のルーティングを持たない事を保証してやれ
ば良く、またいくつかの理由 (例えば、スレーブがマスター側のルーティングを上書
きしないようにする) によりこれは必須な事です。通常は上記の保証が満たされます
が、特殊な設定、誤ったマニュアル、自動静的ルート設定機能などで問題が起きるこ
とがあります。

スイッチの設定
==============

active-backup、balance-tlb、balance-alb ポリシー (モード=1、5、6) が使用され
る場合はスイッチを設定する必要はありませんが、round-robin、XOR、broadcast、
802.3ad ポリシー (モード=0、2、3、4) を使用する場合はスイッチの設定を行う必
要があります。


結合インターフェースの設定の検証
================================

1) 結合インターフェース情報ファイル
-----------------------------------
結合ドライバの情報ファイルは /proc/net/bond* ディレクトリにあります。

mode=0 と miimon=1000 オプション付きで結合ドライバがロードされた後の 
/proc/net/bond0/info の内容のサンプルは下記の通りです。
 
        Bonding Mode: load balancing (round-robin)
        Currently Active Slave: eth0
        MII Status: up
        MII Polling Interval (ms): 1000
        Up Delay (ms): 0
        Down Delay (ms): 0
 
        Slave Interface: eth1
        MII Status: up
        Link Failure Count: 1
 
        Slave Interface: eth0
        MII Status: up
        Link Failure Count: 1

2) ネットワークの検証
---------------------
ネットワークの設定は ifconfig コマンドを使用して確認することができます。下記
の例において、eth0、eth1 インターフェースがスレーブ (SLAVE) で、bond0 インター
フェースがマスター (MASTER) です。bond0 のスレーブがすべて各スレーブに唯一の 
MAC を要求する TLB と ALB 以外のすべてのモード用の bond0 が、同じ MAC アドレ
ス (HWaddr) を持つ事に注意して下さい。


[root]# /sbin/ifconfig
bond0     Link encap:Ethernet  HWaddr 00:C0:F0:1F:37:B4  
          inet addr:XXX.XXX.XXX.YYY  Bcast:XXX.XXX.XXX.255  Mask:255.255.252.0
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:7224794 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3286647 errors:1 dropped:0 overruns:1 carrier:0
          collisions:0 txqueuelen:0 

eth0      Link encap:Ethernet  HWaddr 00:C0:F0:1F:37:B4  
          inet addr:XXX.XXX.XXX.YYY  Bcast:XXX.XXX.XXX.255  Mask:255.255.252.0
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:3573025 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1643167 errors:1 dropped:0 overruns:1 carrier:0
          collisions:0 txqueuelen:100 
          Interrupt:10 Base address:0x1080 

eth1      Link encap:Ethernet  HWaddr 00:C0:F0:1F:37:B4  
          inet addr:XXX.XXX.XXX.YYY  Bcast:XXX.XXX.XXX.255  Mask:255.255.252.0
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:3651769 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1643480 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          Interrupt:9 Base address:0x1400 


頻繁に問われる質問 (FAQ)
========================

1.  マルチプロセッサマシン (SMP) に対応していますか?

	はい。古い 2.0.xx チャネル結合ドライバパッチは SMP に対応していませ
	んでした。新しいドライバは初めから SMP 対応として設計されています。

2.  どの種類のカードが結合ドライバと一緒に動作しますか?


	全てのイーサネットタイプカードです (カードを混ぜる事すらできます。…
	例えば、Intel EtherExpress PRO/100 と 3com 3c905b など)。ギガビット
	イーサーネットカードを結合する事までも出来ます。

3.  どれぐらい多くの結合インターフェースを作れますか?

	制限はありません。

4.1結合インターフェースあたり、どれぐらい多くのスレーブを持てますか?

	Linux がサポートする限りのネットワークインターフェース数と、あなたの
	マシンにセットし得る限りのネットワークカード数に制限されます。

5.  1つのスレーブリンクが死んだ時に何が起こりますか?

	あなたのイーサーネットカードが MII あるいは ETHTOOL リンク状態監視を
	サポートし、ドライバーで MII 監視が有効にしている場合 (モジュール・
	パラメーターの記述を参照)、不都合はありません。本リリースの結合ドラ
	イバーは、MII 情報を得る方法を知っており、それらのリンク状態に応じて
	スレーブを有効/無効にします。補足情報に関しては、高可用性についての
	セクションを参照してください。

	MII 情報をサポートしないイーサーネットカードについては、結合インター
	フェースを正しく動作させる為に、arp_interval と arp_ip_target のパラ
	メーターを指定しなければなりません。パケットが指定された 
	arp_interval 持続期間中に送受信されなかった場合、送受信通信を生成す
	るために ARP 要求がターゲットに対して送信されます。この間隔の後に、
	成功した送受信数のどちらかが増加しない場合、設定で次に指定されている
	スレーブがアクティブなスレーブになるでしょう。

	mii_monitor および arp_interval のどちらも設定されない場合、結合ドラ
	イバーはこの状況をあまり上手に扱わないでしょう。ドライバーはパケット
	を送り続けるでしょうが、いくつかのパケットは失われる事になります。再
	送信は深刻な性能低下を引き起こす事になります (2つのスレーブリンクの
	片方が失敗する時、パケットの半分は失われる事になり、それは TCP/UDP 
	共に深刻な問題となります)。

6.  結合インターフェースは高可用性 (HA) に利用できますか?

	はい。MII 監視を使用し、全てのネットワークカードが MII リンク状態レ
	ポートをサポートしていれば。より多くの情報は「高可用性 (HA)」の章を
	参照して下さい。

7.どのスイッチ/システムが結合インターフェースと一緒に使えますか?

	ラウンドロビンモードと XOR モードでは、トランキングをサポートするシ
	ステムと一緒に動作します。
	
	* 多くの Cisco スイッチとルーター (EtherChannel サポートを探して下さ
	  い)
	* SunTrunking ソフトウェア
	* Alteon AceDirector スイッチ/WebOS(Trunks 使用)
	* BayStack スイッチ (trunks が明確に設定されなければなりません)
          スタッカブルモデル (450) は異なる物理ユニットのポート間で
          trunks を定義できます。
	* 勿論、Linux 結合インターフェース!

	802.3ad モードでは、IEEE 802.3ad 動的リンク集合をサポートするシステ
        ムと一緒に動作します。

	* Extreme ネットワークス Summit 7i (link-aggregation を探して下さい)
	* 多くの Cisco スイッチとルーター (LACP サポートを探して下さい。これ
	  は IOS ソフトウェアの更新を要求するかも知れません。LACP サポートは 
	  2002 年後半から Cisco により追加されています)
	* Foundry Big Iron 4000

	active-backup、balance-tlb、balance-alb モードでは、どんなレイヤーII 
	スイッチとも一緒に動作します。

8.  結合インターフェースは自身の MAC アドレスをどこから取得していますか?

	ifconfig で明示的に設定しない限り、結合インターフェースの MAC アドレ
	スは1番目のスレーブデバイスから取得されます。この MAC アドレスは2
	番目以降の全てのスレーブデバイスにも渡され、(最初のスレーブが削除さ
	れたとしても) 結合インターフェースがダウンしたり、再設定されるまで永
	続的に残ります。
	
	もし (結合インターフェースの) MAC アドレスを変更したいのであれば、
	ifconfig を使用して設定する事ができます。

	  # ifconfig bond0 hw ether 00:11:22:33:44:55

	MAC アドレスは結合インターフェースのダウン/アップとスレーブ (あるい
	はその順番) の変更によってによって変更され得ます。
	
	  # ifconfig bond0 down ; modprobe -r bonding
	  # ifconfig bond0 .... up
	  # ifenslave bond0 eth...

	この方法では、追加される次のスレーブから自動的にアドレスを取得します。

	スレーブの MAC アドレスを復元したいのであれば、そのスレーブを結合イ
	ンターフェースから外し、(ifenslave -d bond0 eth0)、それらをダウン状
	態にして (ifconfig eth0 down)、デバイスドライバをアンロードして (例
	えば rmmod 3c59x)、そして MAC アドレスを EEPROM から取得する為にドラ
	イバを再度ロードして下さい。ドライバが幾つかのデバイスで共有されてい
	る場合、それら全てをダウンさせる必要があります。他の解決法として、起
	動時の MAC アドレスを探しておき (dmesg または tail
	/var/log/messages)、ifconfig を使用して手動でリセットする方法があり
	ます。

	  # ifconfig eth0 down
	  # ifconfig eth0 hw ether 00:20:40:60:80:A0

9.  どの送信ポリシーが使われますか?

	ラウンド・ロビン:スレーブ化の順番に基づき、出力デバイスは次に有効な
	スレーブを基準として選択されます。パケットの送信元/送信先とは関係あ
	りません。

	アクティブ・バックアップ:同時には単一かつ唯一のデバイスでしか転送し
	ない事を保証します。アクティブ・バックアップポリシーは2つのハブを使
	用する高可用性 (HA) ソリューションで便利です(「高可用性(HA)」の章を
	参照)。

	XOR:(送信元と送信先のハードウェアアドレスの排他的論理和) をスレーブ
	数で割った余りを基準にしています。このポリシーは送信先の各ハードウェ
	アアドレスに対して、同じスレーブを選択します。

	ブロードキャスト:全スレーブインターフェースから全パケットを送信しま
	す。

	802.3ad:XOR ベースですが、アクティブ集合中の全インターフェース間で
        通信を分散します。

	送信負荷分散 (balance-tlb):現在の各スレーブの負荷に従って、通信を負
	荷分散します。負荷分散はクライアントベースで、最後に負荷されたスレー
	ブがそれぞれ新しいクライアントに選択されます。各スレーブの負荷はその
	転送速度に関連して計算され、混成の転送速度のチームで負荷分散が有効に
	なります。

	適応負荷分散 (balance-alb):送信の為に送信負荷分散を使用します。受信
	負荷は結合インターフェース中の最も高速なアクティブスレーブのグループ
	中でのみ分散されます。負荷はラウンドロビンで分散されます。つまり、最
	も高速なアクティブなスレーブのグループ間で次に利用可能なスレーブにな
	ります。

高可用性 (HA)
=============

結合ドライバを使用して高可用性を実装する為には、結合ドライバはモジュールとし
てコンパイルされる必要があります。何故なら、今のところモジュール化がドライバ
にパラメータを渡す唯一の手段だからです。これは将来変更されるかも知れません。

高可用性は MII または ETHTOOL 状態レポートを使用して実現されています。ユーザ
は全インターフェースが MII か ETHTOOL リンク状態レポートをサポートしている事
を確認する必要があります。Linux カーネル 2.2.17 では、全ての 100MBps 対応イー
サネットドライバと Yellowfin ギガビットイーサーネットドライバが MII をサポー
トしています。ETHTOOL リンクレポートが eth0 インターフェースで利用できるかど
うかを判断する為には、「ethtool eth0」と入力して下さい。利用できる場合「Link
detected:」行が正しいリンク状態を含んでいる筈です。もしあなたのシステムに 
MII や ETHTOOL をサポートしていないインターフェースがある場合、そのインター
フェースのリンク失敗は検知されないでしょう!0以外の miimon 値で結合ドライバ
がロードされた際に、ネットワークドライバによって MII と ETHTOOL がサポートさ
れていない場合にはメッセージが記録されます。

結合ドライバは ETHTOOL IOCTL (ETHTOOL_GLINKコマンド) の使用または MII ステー
タスレジスタのチェックにより、その全スレーブリンクを定期的にチェックすること
ができます。チェック間隔は、モジュール引数「miimon」(MII 監視) によって指定
できます。この値は、ミリ秒単位でチェック時間を表現する整数をとります。システ
ムの応答性が低下しかねないので、この値は (1000/HZ) (i386 上で 10ミリ秒) に近
い値であってはいけません、100 は初期値として良いかと思います。この値は、リン
クがダウンしてからせいぜい 100 ミリ秒でリンクの失敗が検知される事を意味して
います。

例:

   # modprobe bonding miimon=100

または、/etc/modules.conf に次の行を追加します。

   alias bond0 bonding
   options bond0 miimon=100

現在、高可用性の為に2つのポリシーが存在します。これらは次のいずれかによりま
す。

   a) 各ホストはトランキングをサポートする単一ホストまたはスイッチに接続され
      ている

   b) ホストは幾つかの異なるスイッチ、またはトランキングをサポートしていない
      単一スイッチに接続されている。


1) 単一のスイッチまたはホスト上の高可用性 - 負荷分散
----------------------------------------------------
設定と理解は一番簡単です。単に、いくつかのポート (Trunk、EtherChannel など) 
上の通信をまとめる為にリモートの環境 (ホストまたはスイッチ) を設定し、結合イ
ンターフェースを設定して下さい。適切な MII オプション付きでモジュールをロー
ドした場合、結合インターフェースは自動的に動作するでしょう。それから、異なる
リンクを削除・回復してみて、ドライバが何を検知するかをログから調べてみます。
テストの際、Trunk 中の全ポートが落ちた場合、長い間 Trunk を無効にするバグを
持った幾つかのスイッチでは問題に遭遇するかもしれません。これは Linux のせい
ではなく、実際はスイッチなのです (確認のためスイッチを再起動して下さい)。

例1:2倍の転送速度のホスト−ホスト

          +----------+                          +----------+
          |          |eth0                  eth0|          |
          | Host A   +--------------------------+  Host B  |
          |          +--------------------------+          |
          |          |eth1                  eth1|          |
          +----------+                          +----------+

それぞれのホスト上で:

     # modprobe bonding miimon=100
     # ifconfig bond0 addr
     # ifenslave bond0 eth0 eth1

例2:2倍の転送速度のホスト−スイッチ

          +----------+                          +----------+
          |          |eth0                 port1|          |
          | Host A   +--------------------------+  switch  |
          |          +--------------------------+          |
          |          |eth1                 port2|          |
          +----------+                          +----------+

ホストA上で:                             スイッチ上で:

     # modprobe bonding miimon=100           # set up a trunk on port1
     # ifconfig bond0 addr                     and port2
     # ifenslave bond0 eth0 eth1             ポート1・2上で trunk を設定


2) 複数のスイッチによる高可用性 (または trunk サポートなしの単一スイッチ)
-------------------------------------------------------------------------
このモードは、スイッチが混乱するのを避けるためだけに、複数のポートがあるう
ちの 1 ポート上でのみ、そのホストの MAC アドレスを見せないといけないという設
定を行わなければならないため、ずっと難しくなります。

どのインターフェースがアクティブなインターフェースか、またどれがバックアップ
なのかを知る必要がある場合は、ifconfig を使用してください。バックアップイン
ターフェースは全て、NOARP フラグセットを持っています。

このモードを使用する為には、モジュールのロード時に mode=1 パラメータを渡して
下さい。

    # modprobe bonding miimon=100 mode=active-backup

	または

    # modprobe bonding miimon=100 mode=1

あるいは、/etc/modules.conf に下記を記述して下さい。

    alias bond0 bonding
    options bond0 miimon=100 mode=active-backup

例1:「一点故障で障害にならない」ソリューションを構成する為の、複数のホスト
      と複数のスイッチの使用

                |                                     |
                |port3                           port3|
          +-----+----+                          +-----+----+
          |          |port7       ISL      port7|          |
          | switch A +--------------------------+ switch B |
          |          +--------------------------+          |
          |          |port8                port8|          |
          +----++----+                          +-----++---+
          port2||port1                           port1||port2
               ||             +-------+               ||
               |+-------------+ host1 +---------------+|
               |         eth0 +-------+ eth1           |
               |                                       |
               |              +-------+                |
               +--------------+ host2 +----------------+
                         eth0 +-------+ eth1

この配置では、ISL = Inter Switch Link (trunk になる)、両スイッチにそれぞれ接
続された複数のサーバ (host1、host2...)、1つまたは複数の外部に接続するポート
(port3) があります。同時に各ホストの単一かつ唯一のスレーブがアクティブであり、
また全てのリンクも監視されています (システムはアクティブとバックアップリンク
の失敗を検知します)。

ホストがそのアクティブなインターフェースを変更する毎に、アクティブなインター
フェースがダウンするまで、それは新しいインターフェースを留めておきます。この
例では、スイッチ転送テーブルの有効期限の影響をほとんど受けません。

host1 と host2 が同じ機能性を持っており、これらが別の外部メカニズムによる負
荷分散の中で使用される場合、片方のスイッチに接続された host1 のアクティブイ
ンターフェースと、もう片方のスイッチに接続された host2 のアクティブインター
フェースがあるのは良い事です。このようなシステムは、単一のホスト、ケーブル、
スイッチの失敗でも生き残るでしょう。スイッチ失敗のケースに起こり得る最悪の事
態は、別のスイッチが転送テーブルの有効期限が切れるまで、ホストの半分が一時的
に通信できなくなるだろうということです。

例2:NIC 失敗の設定をする為、1つのスイッチへの接続に複数のイーサーネットカー
      ドを使用する (スイッチは trunk サポートが要求されない)

          +----------+                          +----------+
          |          |eth0                 port1|          |
          | Host A   +--------------------------+  switch  |
          |          +--------------------------+          |
          |          |eth1                 port2|          |
          +----------+                          +----------+

  ホストA上で:                               スイッチ上で:

     # modprobe bonding miimon=100 mode=1     # (optional) minimize the time
     # ifconfig bond0 addr                    # for table expiration
     # ifenslave bond0 eth0 eth1              (オプション)テーブルの有効期限を最短にする

ホストがそのアクティブなインターフェースを変更する毎に、アクティブなインター
フェースがダウンするまで、新しいインターフェースを留めておきます。この例では、
ホストは、スイッチ転送テーブルの有効期限に強く影響されます。


3)スイッチのタイミングを合わせる
--------------------------------
スイッチがバックアップモードに入るのに長い時間がかかる場合、リンクが落ちた後
すぐにバックアップインターフェースをアクティブにしないほうが望ましいかもしれ
ません。モジュールパラメーター「downdelay」(ミリ秒単位。miimon 値の倍数でな
ければなりません) を渡す事により、リンクが完全に無効にされるタイミングを遅ら
せることができます。

スイッチがリブートする時、スイッチのポートが使用可能になる前に「リンクアップ」
状態をレポートするることはありえます。これは、まだ準備ができていないいくつか
のポートを結合インターフェースに使用させる事で結合インターフェースを狂わせか
ねません。モジュール・パラメーター「updelay」(ミリ秒単位。miimon の倍数でな
ければなりません) を渡すことにより、アクティブなリンクが再使用されるタイミン
グを遅らせることができます。

あるホストが、スイッチとの間で失われたリンクを再度ネゴシエーションする時に同
様の状況が起こり得ます (ケーブルを交換した場合)。

特別なケースとして、結合インターフェースが全てのスレーブリンクを失った場合が
あります。この場合には、updelay パラメーターが指定されていたとしても、ドライ
バはアップした最初のリンクをすぐに再度使用します (「updelay」状態のスレーブ
インターフェースがある場合、最初にその状態に入ったインターフェースが直ちに再
使用されます)。これは、updelay の値が多すぎる場合、休止時間を削減することが
可能にします。

例:

    # modprobe bonding miimon=100 mode=1 downdelay=2000 updelay=5000
    # modprobe bonding miimon=100 mode=balance-rr downdelay=0 updelay=5000


スニッフィングの注意
====================

ネットワーク盗聴用にチャネルを一つに結合したい場合 (結合ドライバを使用して複
数のインターフェースからの集合された入力で tcpdump や ethereal、あるいは 
snort のような IDS を実行したい)、手動で設定して Promiscuous インターフェー
スを扱わなければなりません。特に、「ifconfig bond0 up」する時、そこに 
promisc フラグを追加しなければなりません。この設定は ifenslave 時にスレーブ
インターフェースにも適用されるでしょう。完全な例はこんな感じです。

   grep bond0 /etc/modules.conf || echo alias bond0 bonding >/etc/modules.conf
   ifconfig bond0 promisc up
   for if in eth1 eth2 ...;do
       ifconfig $if up
       ifenslave bond0 $if
   done
   snort ... -i bond0 ...

高可用性 (HA) とチャネル通信容量を集めるため、ifenslave は設計機能通りインター
フェースからインターフェースへアドレスを広めようとします; これはインターフェー
ス数を指定しない場合でもちゃんと動作します; それが出力する警告をすべてただ無
視してください。


制限
====
主な制限事項は:

  - リンク状態だけが監視されます。向こう側のスイッチが、部分的にダウンしてい
    る場合 (例えば、もはや転送しないけど、リンクはOK)、リンクは無効にならな
    いでしょう。死んだリンクをチェックする別の方法として、負荷の高いホスト上
    の内向きフレーム数をカウントする方法があります。これは小さなサーバーには
    適用できませんが、正面のスイッチがそれらのリンク (例えばVRRP) のマルチキャ
    スト情報を送信する場合や、サーバの状態チェックまでも行う場合は有用かもし
    れません。内向き/外向きフレームをカウントする為に、
    arp_interval/arp_ip_target パラメーターを使用してください。

資料とリンク
============

現在の本ドライバの開発は下記に投稿されます。
 - http://www.sourceforge.net/projects/bonding/

Donald Becker のイーサーネットドライバと診断プログラムは下記で見つかります。
 - http://www.scyld.com/network/

イーサーネット、NWay、MII 等に関連する沢山の情報もまた www.scyld.com で見つ
かるでしょう。

このドライバの新しいバージョン、古いカーネルへのパッチ、更新されたユーザ空間
のツールは、Willy Tarreau のサイトを見て下さい。
 - http://wtarreau.free.fr/pub/bonding/
 - http://www-miaif.lip6.fr/willy/pub/bonding/

Linux カーネル開発に関する最新情報を入手するためには、Linux カーネルメーリン
グリストアーカイブを使って下さい。
   http://boudicca.tux.org/hypermail/linux-kernel/latest/

-- 終り --

Linux カーネル 2.4 付属文書一覧へ戻る