Debian squeezeでBonding (ARP監視編)

手順書を作成するとブログにも上げやすくなる。
むしろ手順書を作成しないとブログにも上げないようにした方がいいのかも。
手順も洗練されてないし、見落としがあるかもしれないし。当たり前かも。
メモ的にエントリ起こすこともあるけどそういう記事を見返したことがあるのかは疑問。(おぼえてない)

手順

手順は以下の通りです。*1

  1. パッケージ ifenslave-2.6 をインストール
  2. 設定ファイルを編集する
    • /etc/modprobe.d/bonding.conf
    • /etc/network/interfaces
      • bridgeと組み合わせた例
      • bridgeと組み合わせない例
      • 補足
  3. 再起動する
  4. 確認する

パッケージ ifenslave-2.6 をインストール

Bondingの設定をするには ifenslave-2.6 というパッケージが必要なのでインストールする。
RedHat系だと iputils とかいうパッケージらしいよ

$ sudo apt-get install ifenslave-2.6

設定ファイルを編集する

/etc/modprobe.d/bonding.conf
alias bond0 bonding

/etc/modulesに「bonding」を追記するのでもよかったらしい?

/etc/network/interfaces
  • 自分の場合、物理環境といっても仮想化環境*2のホスト側とそうでないのがいるので、それぞれbridgeと組み合わせた例とそうでない例を両方載せました。
  • 適当に必要な所(「iface bond0 〜」の所だけとか)だけ参考にしてください。
  • 192.168.1.0/24なLAN内で以下のような感じです。
    • ルータ(以下GW): 192.168.1.1
    • 割り当てるIP: 192.168.1.10
bridgeと組み合わせた例
# 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 eth0
#iface eth0 inet static
#       address 192.168.1.10
#       netmask 255.255.255.0
#       network 192.168.1.0
#       broadcast 192.168.1.255
#       gateway 192.168.1.1



# eth0,eth1(0.0.0.0) -> bond0(0.0.0.0) -> br0(192.168.1.10)

# Wake-On-LAN
auto eth0
iface eth0 inet manual
  ethernet-wol g

auto eth1
iface eth1 inet manual
  ethernet-wol g


# eth0,eth1 -> bond0
auto bond0
iface bond0 inet manual
  bond_slaves eth0 eth1
  bond_mode active-backup
  bond_miimon 0
  bond_primary eth0
  bond_arp_interval 3000
  bond_arp_ip_target 192.168.1.1


# bond0 -> br0
auto br0
iface br0 inet static
  bridge_ports bond0
  bridge_stp off
  bridge_fd 0
  bridge_maxwait 0
  address 192.168.1.10
  network 192.168.1.0
  netmask 255.255.255.0
  broadcast 192.168.1.255
  gateway 192.168.1.1
  # workaround for the problem that br0 would use lowest MAC address among the enslaved interfaces.
  # http://backreference.org/2010/07/28/linux-bridge-mac-addresses-and-dynamic-ports/
  post-up ip link set br0 address xx:xx:xx:xx:xx:xx
bridgeと組み合わせない例
# 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 eth0
#iface eth0 inet static
#       address 192.168.1.10
#       netmask 255.255.255.0
#       network 192.168.1.0
#       broadcast 192.168.1.255
#       gateway 192.168.1.1



# eth0,eth1(0.0.0.0) -> bond0(192.168.1.10)

# Wake-On-LAN
auto eth0
iface eth0 inet manual
  ethernet-wol g

auto eth1
iface eth1 inet manual
  ethernet-wol g


# eth0,eth1 -> bond0
auto bond0
iface bond0 inet static
  address 192.168.1.10
  netmask 255.255.255.0
  network 192.168.1.0
  broadcast 192.168.1.255
  gateway 192.168.1.1
  # bonding
  bond_slaves eth0 eth1
  bond_mode active-backup
  bond_miimon 0
  bond_primary eth0
  bond_arp_interval 3000
  bond_arp_ip_target 192.168.1.1
補足
  • ethernet-wol g
    • squeeze移行で使える。ethtoolパッケージとか入れてないと使えないかも?
    • squeeze以前では「post-up /sbin/ethtool -s $IFACE wol g」「post-down /sbin/ethtool -s $IFACE wol g」を指定する
    • cf. WakeOnLan - Debian Wiki
  • bond_slaves eth0 eth1
    • スレーブの指定
  • bond_miimon 0
    • 今回はARP監視なので0にします。
  • bond_primary eth0
    • プライマリの指定
  • bond_arp_interval
    • ARPを送出する間隔です。3秒にしてあるけど、もっと速く切り替わってほしい人はもっと短い値にするといいのかも。
    • MII監視とARP監視どっちかじゃなく両方とも使えないのかな?そうすればMII監視でうまくいけば一瞬?で切り替わるし、運悪くMII監視で検知できなかった場合でもARP監視で切り替わるし。送出するパケット更に増えるけど。
  • bond_mode active-backup
    • Bondingのモードについては参考リンクとか見てください(丸投げ)。active-backupが一番使いやすいって「サーバ/インフラを支える技術」に書いてあった。もっと性能を追求したい方はこちら
  • bond_arp_ip_target
    • 今回はGWのIPアドレスを指定しましたが、ARPを返してくれて、自身が生きてることを確認できればいいので、返してくれそうな人(?)のIPを指定すればいいです。自分の場合はスイッチ*3のIPも追加で指定しました。追加で指定する場合は空白の後に続けて指定します。

再起動する

作業対象が仮想化のゲスト側だったらホスト側を再起動した方がいい。
いや「sudo ifdown -a; sudo ifup -a」でいいのかもしれないけど、一応。
ssh越しに上記のコマンドを打つ場合はセミコロンで繋げて打たないと締め出されます。気を付けましょう。*4

確認する

自分なりのやり方なので他にいい方法があれば教えてください。

  • 「cat /proc/net/bonding/bond0」
    • モードだけ確認するなら「cat /sys/class/net/bond0/bonding/mode」
  • 片方ずつLANケーブルを抜いて切り替わるかテストする
    1. 作業中のホストからexample.compingを打つ
    2. LAN内の他のホストから作業中のホストにpingを打つ
    3. 両方の端末をscreenで並べて視認しやすくする
    4. 以下の手順中、常に1と2のpingが継続することを確認する
    5. port0のLANケーブルを抜く
      • port1をprimaryとして使用中だった場合、ここでは切り替わりが発生しない可能性がある
    6. port0のLANケーブルを戻す
    7. port1のLANケーブルを抜く

「kernel: [ 2264.790719] bonding: unable to update mode of bond0 because interface is up.」→balance-rrモードでリンクアップしてしまう問題

/etc/network/interfacesで「pre-up ifup bond0」してる設定がちらほら見られるけど、それだと「kernel: [ 2264.790719] bonding: unable to update mode of bond0 because interface is up.」みたいなエラーが出てデフォルトのbalance-rr(ラウンドロビン)モードで立ち上がってしまう。
なのでpre-upとdownの指定はいらない。*5
上記のようなこともあるので、再起動したあとちゃんと「/proc/net/bonding/bond0」の内容を確認すること。

参考リンク

一部リンクじゃないですが。

雑感

参考リンクにも挙げたけど、apt-get install ifenslave-2.6で入る「/usr/share/doc/ifenslave-2.6/examples/」以下も見てみると結構面白い。
Wi-Fiとbondingする例などが書かれてある。
というかこれ俺が前からやりたかったことだ。(上流ルータが死んだらWiMAXに切り替える)


久しぶりにまともな記事になった気がするので、

  1. 手順書を作成する
  2. ブログに上げる

のサイクルを今後も回していきたい。
でも二度とやりたくないような気持ちも

自分が引用したのはOSインストール時の全体的な手順書なので、
ブログの記事が個別の手順書として見やすいかも。
もっとちゃんとITSに登録して紐付けたり、どっちも継続的に管理できるように...とかやると投げ出すフラグな気がする。

*1:見出し記法が「**** hoge」まで対応してないので、「bridgeと組み合わせた例」から階層がおかしくなってますが...

*2:LXCだけど

*3:これWindows専用だけど、Adobe AIR製のツールがついてて、ツール経由でスイッチの設定が変えられる。なぜいっそWeb UIにしなかった... というかAdobe AIRってマルチプラットフォームじゃなかったっけ...?

*4:よくあるので自分への警告として...

*5:タイミングの問題かもしれないので、pre-upじゃなくupだったらOKだったりするかもしれないけど試してない