いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.162 / 読者数:1316名

こんばんは、うすだです。

本日、我が家に新しい仲間が増えました!

…といっても、子どもが産まれた!というわけではなく、 オカメインコを飼うことになっただけなのですが。

ただ、息子は、自分でオカメインコの世話ができるということを証明するため、 3ヶ月間、1日も休まずトイレ掃除を行い、その権利を得ました。
(ちなみに、3ヶ月達成後も、欠かさずずっとトイレ掃除をしています。)

また、購入するための資金も、親子で折半と決めましたので、 お小遣いをコツコツと貯めておりました。

そして、各地のペットショップをまわり、運命的な出会いを経て、本日、 我が家にやってきたという次第です。
(あ、ただ、運命的な出会いというのは、かなりオオゲサな表現です。)

明日からは、息子がひとりで雛の餌を作ってあげるようです。
何ヶ月も前から鳥の飼育本を熟読していましたので、特に不安になることもなく、 こなしていきそうです。わが子ながら、頼もしいです。

私も、そのくらいの情熱を持って、物事に取り組まないといけないなあ、 なんて思いました。
まずは、明日からの仕事をがんばることから始めたいと思います。

そんなことを何度も言っては挫折している気もしますが、目をつぶることにして、 今回もはりきってまいりたいと思います。

今回のお題 - brctl でLinuxマシンをHUBにする

ここのところずっと、ネットワーク関連がいろいろ気になっております。

前回、前々回と bonding に関するネタをご紹介しました。
また、過去にも、NICを追加し、そこに自分用のお試しネットワーク環境を作る、 という方法をご紹介したことがありました。

Vol.065 - お試しネットワーク環境を作る
http://www.usupi.org/sysad/065.html
Vol.066 - お試しネットワーク環境を作る 〜 Proxy ARP 編
http://www.usupi.org/sysad/066.html

さて、今回は、Linuxマシンを使用して、 複数のネットワークをブリッジ接続する方法を、ご紹介したいと思います。

…えっと、ようするに、複数のNICを持つLinuxマシンを、 HUB として使用できるようにする方法をご紹介しましょう、ということです。

たとえば、マシンが増えて新たにポートが必要になったけれども、 予備の HUBがないときに、LinuxマシンをHUBにしてしのぐことができます。

あるいは、パケットをキャプチャして確認したいが、 ポートミラーリング機能つきのスイッチングHUBがないときに、 LinuxマシンをHUBにすることで、 Linuxマシンでパケットをキャプチャすることができます。

…ああ、無理矢理ひねり出した感のただよう利用例ですね。

まあ、別に理由がなくても、 Xen などの仮想化ソフトの仮想ネットワークで使われたりもしていますので、 理解のきっかけにしたいと思う貴兄は、ぜひお試しください。


Linuxマシンを HUB にするためには、brctl コマンドが必要です。
bridge-utils パッケージに含まれますので、which brctl と実行して、 ないよっ的なことを言われましたら、パッケージを入れてください。

  # yum install bridge-utils      (RedHat系の場合)
  # apt-get install bridge-utils  (Debian系の場合)

さて、以降では、もともと eth0 だけがあり、 そこに eth1,eth2 を追加して HUB にする、という流れでご紹介していきます。
追加する前の eth0 だけの状態は、こんな感じでしょうか。

  +-------+----------------+
          | 192.168.1.0/24   (eth0)
          +--------------------[Linux マシン]
                                192.168.1.1

まずは、手動で、eth0 と eth1 をブリッジ接続してみましょう。
そのためには、仮想的なブリッジを作成する必要があります。
とりあえず、ここでは vbr0 という名前で作成します。

  # brctl addbr vbr0
  # brctl stp vbr0 off

2行目は、STP(スパニングツリープロトコル)を使用しないという設定ですが、 デフォルトが off ですので、念のために実行しているだけです。

そして、eth0 と eth1 を、仮想ブリッジ vbr0 に接続します。
また、Linuxマシン自身が他と通信できるよう、vbr0 自身にIPアドレスを設定します。 (以下では 192.168.1.1 に設定しています。)

  # brctl addif vbr0 eth0
  # brctl addif vbr0 eth1
  # ifconfig eth0 0.0.0.0
  # ifconfig eth1 0.0.0.0
  # ifconfig vbr0 192.168.1.1

図で書くと、こんな感じでしょうか。
eth1側には、確認のため、クロスケーブルで PC をつないでいます。

  +--+----+----------------+
     |    | 192.168.1.0/24   (eth0)      (eth1)
     |    +--------------------[Linux マシン]----------------[PC]
     |192.168.1.3               192.168.1.1       192.168.1.2
    [PC]

まず、設定できているかどうか、brctl show で確認してみましょう。

  # brctl show
  bridge name     bridge id            STP enabled     interfaces
  vbr0            8000.000102030405    no              eth0
                                                       eth1

そして、192.168.1.1〜3 の間で、ping などが通るかどうかを、 確認してみてください。(実行例は割愛します。)

 

うまくいきましたら、次に、eth2 も追加してみましょう。
手順は、先ほどと同等です。

  # ifconfig eth2 0.0.0.0
  # brctl addif vbr0 eth2
  # brctl show
  bridge name     bridge id            STP enabled     interfaces
  vbr0            8000.000102030405    no              eth0
                                                       eth1
                                                       eth2

図で書くと、以下のような感じでしょうか。(ごちゃごちゃですが…)
同様に、eth2側にも、クロスケーブルで PC をつなぎました。

  +--+----+----------------+
     |    | 192.168.1.0/24   (eth0)      (eth1)
     |    +--------------------[Linux マシン]----------------[PC]
     |                          192.168.1.1       192.168.1.2
     |192.168.1.3                    |(eth2)      192.168.1.4
    [PC]                             +-----------------------[PC]

そして、やはり同様に、192.168.1.1〜4 の間で ping などが通るかを、 確認してください。(やはり実行例は割愛します。)


手動での設定ができたところで、今度は、 起動時に自動設定してもらえるようにしてみましょう。

まずは、Debian 系の場合です。
/etc/network/interfaces を、以下のように記述してください。

  auto eth0
  iface eth0 inet static
    address 0.0.0.0

  auto eth1
  iface eth1 inet static
    address 0.0.0.0

  auto eth2
  iface eth2 inet static
    address 0.0.0.0

  auto vbr0
  iface vbr0 inet static
    address 192.168.1.1
    netmask 255.255.255.0
    network 192.168.1.255
    bridge_ports eth0 eth1 eth2
    bridge_stp off

上記のように書き換えて再起動しますと、 eth0〜2 がブリッジ接続されて立ち上がってくる…と思います。

 

次に、RedHat 系の場合です。
/etc/sysconfig/network-scripts/ifcfg-eth0, ifcfg-eth1, ifcfg-eth2 を、 以下のように記述します。

  DEVICE=eth0  (もしくは eth1 もしくは eth2)
  HWADDR=xx:xx:xx:xx:xx:xx  (実際のMACアドレスを指定してください)
  ONBOOT=yes
  TYPE=Ethernet
  BRIDGE=vbr0

そして、/etc/sysconfig/network-scripts/ifcfg-vbr0 を、 以下のように記述してください。

  DEVICE=vbr0
  BOOTPROTO=static
  IPADDR=192.168.1.1
  BROADCAST=192.168.1.255
  NETMASK=255.255.255.0
  NETWORK=192.168.1.0
  ONBOOT=yes
  TYPE=Bridge
  STP=off

こちらも、再起動後、ブリッジ接続が有効になるという寸法です。

うまくいかない場合は、dmesgコマンドの出力結果や、 /var/log/messages や syslog などの中をチェックしてみてください。


以上、brctl コマンドを使用してLinuxマシンをHUBにする方法を、ご紹介しました。

以前にご紹介しました、 IPマスカレードや Proxy ARP による接続も有用ではありますが、 今回のブリッジ接続ですと、同じサブネットとして接続することになりますので、 その分、気楽に試せると思います。

また、上記の例では物理的なNICをブリッジ接続しましたが、 Xenなどでは仮想的なNICをブリッジ接続して、 VM間のネットワーク通信を可能にしています。

他にもいろんな用途が考えられそうです。(たぶん)
とはいえ、まずは、試して使えることを確認してみてくださいまし。

宿題の答え

前回の宿題は、

  リンクの状態を監視して、変化があったらメールで通知しましょう。

でした。

リンクの状態が変化したときに、それを通知してくれる機能がないかなあと思い、 調べていたのですが、いまのところ見つかっておりません。
ですので、やや無駄っぽいですが、 自力で /proc/net/bonding/bond0 を監視してみようと思います。

まず、前回のおさらいになりますが、 /proc/net/bonding/bond0 の内訳は以下のようになっています。

  $ cat /proc/net/bonding/bond0
  ...前略...

  Slave Interface: eth0
  MII Status: up
  Link Failure Count: 0
  Permanent HW addr: 00:01:02:03:04:05

  Slave Interface: eth1
  MII Status: up
  Link Failure Count: 0
  Permanent HW addr: 00:11:22:33:44:55

Slave Interface の MII Status を監視すればよさそうです。
ただ、変化を知るために、前の状態をどこかに保存しておく必要があると思います。

まずは、 2つの状態(/proc/net/bonding/bond0)を比較するPerlスクリプトを書いてみました。
前の状態といまの状態を表すファイルを、それぞれ引数で指定して、 比較した結果を標準出力に出力します。

#!/usr/bin/perl
use strict;

sub bond_check {  # MII Status をチェックするサブルーチン
    my ($fname) = @_;
    my ($iface, %stat);
    open(BOND, "$fname") || die "cannot open.";
    while(<BOND>) {
        chomp;
        if(/^Slave Interface:\s*(\S+)/) {
              $iface = $1;  # インターフェース名
        } elsif(/^MII Status:\s*(\S+)/ && $iface) {
              $stat{$iface} = $1;  # インターフェースの状態
        }
    }
    close(BOND);
    %stat;  # 連想配列で戻す
}

if($#ARGV != 1) {  # 引数のチェック
    print STDERR "Usage: $0 oldstatus newstatus\n";
    exit(1);
}

my $oldfile = shift;  # 古い状態のファイル名
my $newfile = shift;  # 新しい状態のファイル名
my %oldstat = &bond_check($oldfile);  # 古い状態を読む
my %newstat = &bond_check($newfile);  # 新しい状態を読む

my $diffcnt=0;
for my $key (sort keys %oldstat) {  # 比較して変化があれば出力
    if($oldstat{$key} ne $newstat{$key}) {
        print "$key : $oldstat{$key} -> $newstat{$key}\n";
        $diffcnt++;
    }
}
if($diffcnt > 0) {  # 変化があれば新しい状態をまるっと出力
    print "\n-- current status\n\n";
    print `cat $newfile`;
}

これを、たとえば bondcheck.pl というファイル名で保存したら、 以下のように実行してみてください。

  $ chmod +x bondcheck.pl
  $ cat /proc/net/bonding/bond0 > bonding_old
  (ここで eth0 のケーブルを引っこ抜く)
  $ cat /proc/net/bonding/bond0 > bonding_new
  $ ./bondcheck.pl bonding_old bonding_new
  eth0 : up -> down

  -- current status

  .../proc/net/bonding/bond0 の内容...は割愛...

eth0 のケーブルを引っこ抜いたことに気づいてくれます。
もちろん、変化がなければ何も言いません。

  $ ./bondcheck.pl bonding_new bonding_new
  $
では次に、古い状態を別のファイルとしてとっておき、 bondcheck.pl を使って変化を知るシェルスクリプトを書いてみました。
最後に、今の状態を ~/tmp/bond0.old というファイルに保存します。
(bondcheck.pl も ~/tmp/ にあることになっています。 適時 CHKCMD のパスを変更してご使用ください。)

#!/bin/sh
OLDSTAT=$HOME/tmp/bond0.old
NEWSTAT=/proc/net/bonding/bond0
CHKCMD=$HOME/tmp/bondcheck.pl
if [ -f $OLDSTAT ]; then
    $CHKCMD $OLDSTAT $NEWSTAT
fi
cat $NEWSTAT > $OLDSTAT

実行するたびに、前回実行した直後の状態との比較を行います。
(厳密には、bondcheck.pl 実行〜bond0.pld の保存の間の変化に気づきませんが、 簡略化のためということでご了承ください。
とはいえ、ちょっと変えるだけなので、気になる方は変更してみてください。)

これを、たとえば ~/tmp/bondwatch.sh というファイル名で保存したら、 以下のように実行してみましょう。

  $ chmod +x bondwatch.sh
  (eth0 のケーブルを再接続する)
  $ ./bondwatch.sh
  eth0 : down -> up

  ...後略...

手動でファイルの指定などをしなくても、 eth0 のケーブルを再接続したことに気づいてくれました。

あとは、cron に登録しておけば、常に監視してくださいますですね。
(以下ですと、5分おきに bondwatch.sh を実行してくださいます。)

  $ ( crontab -l; echo "*/5 * * * * $HOME/tmp/bondwatch.sh" ) | \
  crontab

というわけで、以上です。(うわあ長かったですね…すすすみません。)

cron に関しましては、初期の頃にご紹介した以下くらいしかありませんが、 参考になれば幸いです。

Vol.002 - 簡易バックアップ リローデッド
http://www.usupi.org/sysad/002.html

今回の宿題

今回の宿題は、

  eth0〜eth2 をブリッジ接続したときに、eth0〜eth1 間の通信が eth2
  から見えるかどうか、確認してください。

です。

eth0〜eth1 間の通信が eth2 から見えるのであれば、 ダムHUBとして動作していることになりますし、eth2 から見えなければ、 スイッチングHUBとして動作していることになりますよね。

もちろん、ブロードキャストなパケット(ARPやDHCPなどのパケット)は、 必ず流れてきますので、それ以外のパケットでご確認ください。

あとがき

いまさらながら、クラウドコンピューティングに興味を持ち、 タイトルに「クラウド」と名のつく本を読んでおります。

自分で言うのもなんですが、私は単純ですので、 本に書かれていることをすぐ鵜呑みにして、「クラウドが来る!」という具合に、 影響される傾向があります。
(あ、「クラウド」が来ない!と言っているわけではありませんよ。)

さて、そんな私に喝を入れるかのような記事を見つけました。

"クラウドコンピューティング○×"の寿命 - @IT情報マネジメント
http://www.atmarkit.co.jp/im/cits/serial/murphy/17/01.html

バズワードに関するマーフィー的な法則が書かれています。
どれも、納得かつはははと笑える(苦笑いを含む)法則で、ただ単に面白いだけでなく、 勉強にもなります。

特に面白かったのが、最初の法則(情マネ流マーフィーの法則その100)の 「新用語の寿命は30番目の図書が出版されるまでである」です。
「バズワードの栄枯盛衰を『ハイプ曲線』によりモデル化」されている点が、 とても興味深く、妙に納得してしまいました。
(やや呪文のような言葉が並んでいますが、上記を読めばわかります。)

近年、「Web2.0」や「バザール方式」による開発など、 複数が協調しつつ自律的に行動するという流れが、 主流になっているように思います。
(「カーシェアリング」なんかも、そう言えるのではないでしょうか。)

そう考えますと、「クラウド」的な考え方は、 今の時代にあったものだという気がします。 「クラウド」という言葉自体はバズワードとして消えていくかもしれませんが、 それに反比例して、考え方が浸透していくのではないかと思う、今日このごろです。

ちなみに、以下に感化されて書きました。(といいますか受け売りです。)
どちらも面白い内容です(だと思います)ので、興味のあるかたは、 書店や図書館などでチェックしてみてください。

クラウド大全
http://www.amazon.co.jp/exec/obidos/ASIN/4822283887/usupiorg06-22
出現する未来
http://www.amazon.co.jp/exec/obidos/ASIN/4062820196/usupiorg06-22

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、8月16日(日) 未明にお会いしましょう! それでは、よいお盆を!?

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- 秋に向けてイベントに参加すべきか、悩んでおります。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本