メイン

2011年03月09日

Xen, bonding, arp監視でpbond0: received packet with own address as source addressのエラー

先日、2台のXenホストOSでbondingの設定を行ったときのこと。
OSはCentOS 5.5、bondingの監視方法はarp監視です。

bondingの設定を行い、ネットワークの冗長化そのものはゲストOSのネットワークの切り替わりを含めて問題なく動作したのですが、/var/log/messages に下記のメッセージが大量に出力されるようになりました。

Mar 3 10:24:41 hostname kernel: pbond0: received packet with
own address as source address

いろいろ調べたのですが、例えば下記に書かれている対処方法では解決できず。

Stray Penguin - Linux Memo (Xen):
http://www.asahi-net.or.jp/~aa4t-nngk/xen.html#ownaddresstrouble

その後さらに調べたところ、XenSourceのbugzillaに記載されていた方法で無事解決しました。

XenSource bugzilla:
http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=339

原因は、ブリッジ・インタフェースと物理ネットワーク・インタフェースを結ぶための論理ネットワーク・インタフェースであるpeth0に割り当てられたMACアドレスが"FE:FF:FF:FF:FF:FF"であり、これが2台のXenホストOSとも同じでバッティングしていた、というものでした。

XenのホストOSが同一ネットワークに複数台存在し、かつ複数台でbondingの設定を行い、かつbondingの監視方法がarpという条件で発生する現象のようです。
ちなみに監視方法がMIIの場合は発生しません。

対処方法は、ネットワークブリッジ設定スクリプト/etc/xen/network-bridgeを下記のように変更し、Xenの各インターフェースに一意なMACアドレスを割り当てるようにします。
macidはホストOSごとに違う値を指定します。

-- /etc/xen/network-bridge 変更前
setup_bridge_port ${vif0}
ip link set ${netdev} addr ${mac} arp on

ip link set ${bridge} up
add_to_bridge ${bridge} ${vif0}
add_to_bridge2 ${bridge} ${pdev}
--

-- /etc/xen/network-bridge 変更後
#macid is used to uniquely identify this dom0 on this network
#change this to avoid MAC address conflicts if you get:
#"peth0: received packet with own address as source address"
macid="F0"

(中略)

setup_bridge_port ${vif0}
ip link set ${netdev} addr ${mac} arp on

ip link set ${pdev} addr fe:ff:ff:ff:${macid}:0${vifnum}
ip link set ${vif0} addr fe:ff:ff:ff:${macid}:0${vifnum}

ip link set ${bridge} up
add_to_bridge ${bridge} ${vif0}
add_to_bridge2 ${bridge} ${pdev}
--

設定変更後、OSを再起動したところ、エラーメッセージが出なくなりました。


解決したのはよいけれど、なぜarp監視のときだけエラーメッセージが出力されたのでしょう。

今回のarp監視ではターゲットとしてルータのIPアドレスを指定しているのですが、そのIPアドレスに対するMACアドレスを知るためにarpパケットをブロードキャストしているから、ですね。

あるホストOSが別のホストOSからブロードキャストされたARPパケットを受け取って、そのARPパケットのヘッダにある送信元のMACアドレスが、自分のMACアドレスと同じなので「received packet with own address as source address(送信元のアドレスが自分のアドレスと同じパケットを受け取ったよ。なんか変じゃない?)」というエラーを出力したのでしょう。
原因がわかってすっきりしました。

arp監視のために送受信するarpパケットについては下記が詳しいです。

Carpe Diem bonding ことはじめ:
http://www.sssg.org/blogs/naoya/archives/1188

2007年10月19日

Xen CPU割り当て設定がクリアされる?

これはまだ解決できていない問題なのですが。。。

xm vcpu-set コマンドでゲストOS Domain-UへのCPU割り当てを変更できる、というのは前回書きました。
また、ずっとその設定を保持したい場合は、Domain-UのConfigファイルに記述します。

-- /etc/xen/domain1
...
cpus="0" # ←使用する物理CPUの番号
vcpus=1 # ←使用する仮想CPUの数
--

ですがこの設定、僕が構築した環境 CentOS5, kernel-xen-2.6.18-8, xen-3.0.3-25.0.3 では、ゲストOS Domain-Uや管理OS Domain-0を再起動するとクリアされて、デフォルトの設定である「全CPUのうち1つを使用」に戻ってしまうのです。
Domain-0 /etc/xen/auto/ 以下にDomain-UのConfigファイルをコピーし、xendを起動したときに自動的にDomain-Uも起動するよう設定した場合、Domain-0を起動、再起動したときも同様にクリアされてしまいます。
いろいろ試してみたのですが、唯一設定が効くのは、xm create コマンドでDomain-Uを起動したときのみでした。

しょうがないので、xendの起動スクリプト /etc/init.d/xend を修正して、起動時に xm vcpu-set, xm vcpu-pin コマンドを実行するようにしてみたのですが、これでもダメ。

この問題を解決するにはどうすればよいのやら。
今のところ、Domain-0やDomain-Uの再起動時に、xm vcpu-set, xm vcpu-pinコマンドを手動で実行する必要があります。
これでは自動運転はキツいので、引き続き調査中。

2007年10月15日

Xen DomainへのCPU割り当てはどうする?

Xenは管理OS Domain-0や、ゲストOS Domain-Uに物理CPUを動的に割り当てるができます。

・ドメインが使用するCPUの数をセット


# xm vcpu-set <ドメインID>

・ドメインが使用するCPUをセット - ドメインの仮想CPUを物理CPUにマッピング


# xm vcpu-pin <ドメインID> <ドメインの仮想CPU ID> <物理CPU ID>

このようなCPUの割り当てコマンドについては、いろいろなところで紹介されているのですが、実際に稼働させるインターネットサービスにおいて、具体的にどのように割り当てると効率がよいのかについては、実例の情報が少ないように思います。

ユーザマニュアルには下記のように記述されています。
Xen 3.0 User's Manual 「7. CPU Management」
http://tx.downloads.xensource.com/downloads/docs/user/

Having multiple vcpus belonging to the same domain mapped
to the same physical CPU is very likely to lead to poor performance.
It's better to use `vcpus-set' to hot-unplug one of the vcpus
and ensure the others are pinned on different CPUs.

If you are running IO intensive tasks, its typically better
to dedicate either a hyperthread or whole core to running domain 0,
and hence pin other domains so that they can't use CPU 0.
If your workload is mostly compute intensive, you may want
to pin vcpus such that all physical CPU threads are available
for guest domains.

・I/Oが激しい用途ならば、Domain-0に物理CPUを1つ占用させるとよい。
・演算処理が激しい用途ならば、すべてのDomain-Uがすべての物理CPUを使用できるようにするとよい。
といったところですかね。

I/OやゲストOS同士の影響を考慮すると、Domain-0および各Domain-Uにそれぞれ異なる物理CPUを割り当てるのがよさそうです。
僕が実験したPCは物理CPUが2個しかなかったため、比較調査はできなかったのですが、QuadCore搭載サーバなどでベンチマークテストをしてみたいと思っています。

2007年10月12日

Xen Domain-U環境の複製

Xenでは、ゲストOS Domain-Uの仮想ディスクイメージファイルとConfigファイルをコピーして少し編集するだけで、簡単にゲストOSの複製を作ることができます。
同じような環境を複数用意するときはとても便利ですね。

LinuxゲストOSの複製手順をまとめます。

複製元のドメイン名:domain1 - OSはCentOS4.5
複製後のドメイン名:domain2
とします。以下、とくに指定がない限り、管理用OS Domain-0にてrootユーザでコマンドを実行するものとします。

・複製元Domain-Uの設定
複製後の設定変更が最小限になるよう、パッケージのインストール、設定などを行っておきます。
また、複製元、複製後のサーバでIPアドレスが重複しないよう、DHCPで取得するよう設定しておきます。

・複製元Domain-Uを停止


# xm shutdown <ドメイン名>
# xm list

・複製元Domain-Uの仮想ディスクイメージファイルをコピー


# cd /var/lib/xen/images/
# cp -p domain1.img domain2.img

・新しいConfigファイルを作成
domain1 のConfigファイルを基に domain2 を作成します。

# cd /etc/xen/
# cp -p domain1 domain2

viなどのエディタでConfigファイルを開き、ドメイン名、仮想ディスクイメージファイル名、MACアドレス、uuidを変更します。

MACアドレスは、前半の'00:16:3e'は、Xenで共通で使用するものです。
後半の3つを同じセグメントで重複しないよう適当に変更します。
ここでは、末尾よりひとつ前を+1しています。
uuidも、末尾のひとつ前を+1しています。
以下、Configファイルの変更箇所のみ記述します。

-- 変更前
...
name = "domain1"
disk = [ 'tap:aio:/var/lib/xen/images/domain1.img,xvda,w', ]
vif = [ 'mac=00:16:3e:63:94:e3, bridge=xenbr0', ]
uuid = "079e8369-f9ad-0e06-0b95-9b360be8ee0a"
...
--

-- 変更後
...
name = "domain2"
disk = [ 'tap:aio:/var/lib/xen/images/domain2.img,xvda,w', ]
vif = [ 'mac=00:16:3e:63:95:e3, bridge=xenbr0', ]
uuid = "079e8369-f9ad-0e06-0b95-9b360be8ee1a"
...
--

・コピー元のDomain-Uを起動


# xm create domain1

・新しいDomain-Uを起動


# xm create domain2

・ドメインが2つ見えることを確認


# xm list

Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 254 1 r----- 3225.5
domain1 1 255 1 -b---- 3160.1
domain2 2 255 1 -b---- 3076.9

・新しいDomain-U環境の設定変更を行う
ホスト名、IPアドレス、MACアドレスを変更します。
Domain-0から複製後のDomain-U domain2にコンソールログインします。

# xm console domain2

ホスト名を変更します。

-- /etc/sysconfig/network
HOSTNAME=domain2
--

IPアドレス、MACアドレスを変更します。

-- /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
HWADDR=00:16:3E:63:95:E3 →Xenコンフィグファイルのvifで指定したアドレス
IPADDR=192.168.10.3 →IPアドレスを指定します
NETMASK=255.255.255.0
ONBOOT=yes
TYPE=Ethernet
USERCTL=no
IPV6INIT=no
PEERDNS=yes
GATEWAY=192.168.10.1
--

複製元OS rootユーザのbash履歴ファイルを削除します。

# rm /root/.bash_history

複製元OS SSHサーバのホスト鍵を削除します。


# rm /etc/ssh/ssh_host*

sshdを再起動し、ホスト鍵を再作成します。

# /etc/init.d/sshd restart

いったんコンソールからログアウトして、Domain-Uを再起動します。

# xm reboot domain2

これで、複製後のDomain-Uは、ホスト名やネットワークも問題なく、1つの新しいサーバとして見えるようになります。

・Domain-0が起動する際に、自動的にDomain-Uも起動するよう設定


# ln -s /etc/xen/domain2 /etc/xen/auto/domain2

・必要に応じて、CPUの割り当てを変更


# xm vcpu-pin <ドメインID> <ドメインの仮想CPU ID> <実CPU ID>
# xm vcpu-list

大まかにはこれで完了です。とっても簡単ですね。


(参考)
ゲストOSを複製する方法
http://tomo.ac/goodstream/xen/tips/imgcopy.html

ThinkIT 実践!仮想化技術「Xen」の活用方法
第1回:仮想化、その使い道
http://www.thinkit.co.jp/free/article/0606/4/1/

2007年10月10日

Xen MySQLサーバが起動しない

XenでCentOS4.5のゲストOS Domain-U環境を構築し、MySQLサーバ4.1.20を起動しようとしたところ、下記のメッセージが表示され起動に失敗するという現象がありました。

-- /var/log/mysqld.log
070925 16:50:50 [ERROR] bdb: unable to initialize mutex:
Function not implemented
070925 16:50:50 [ERROR] bdb: process-private:
unable to initialize environment
lock: Function not implemented
--

Xen環境では、/lib/tls(Thread Local Storage)ライブラリが有効になっていると性能が悪くなるため、これを無効にすることが推奨されています。
ですが、MySQLでは、bdb(Berkeley DB)まわりのライブラリがTLSを使用しているようで、mysqldの起動時に必要なライブラリを読み込めずにエラーしていました。

この問題を解決するために、bdbまわりのライブラリを使用しないよう、/etc/my.cnf に下記の1行を追加します。

-- /etc/my.cnf
[mysqld]
...
skip-bdb
--

これで、MySQLサーバが正しく起動するようになりました。
なお、skip-bdb オプションを指定することによる違いが、リファレンスマニュアルに記述されています。
http://dev.mysql.com/doc/refman/4.1/ja/bdb-start.html



MySQL は Berkeley DB ライブラリを初期化しなくなるため、大量のメモリを

節約できます。このオプションを使用しているときは BDB テーブルを

使用できません。BDB テーブルを作成しようとすると、代わりに

MyISAM テーブルが作成されます。


通常はストレージエンジンとして、MyISAMまたはInnoDBを使用するでしょうから、問題ありませんね。
「大量のメモリを節約できます」については、mysqldプロセスの使用メモリが約3MBほど少なくなることを確認しました。
Apacheにおける「不要なmod_xxxを読み込まない」と同じく、Xen環境以外でも、skip-bdbをデフォルトで設定してもよいですね。

2007年10月09日

Xen xm consoleでコンソールログインできない

Xenの環境構築で最初に行き詰まったこと。
管理用OS Domain-0としてCentOS5を使用し、ゲストOS Domain-UとしてCentOS4.5をインストールしてみました。
早速コンソールログインを試してみようと思って、Domain-0でxm consoleコマンドを実行したところ、下記のエラーメッセージが出てログインプロンプトが表示されませんでした。

IRQ8 is not free.
xm console no controller found.

キャラクターベースのコンソールを使用できないのは痛いですね。
調べたところ、これは仮想コンソールの設定不足によるもので、Domain-Uにて下記の設定を行う必要がありました。
(CentOSのみの問題かどうかはわかりませんが)

-- /etc/inittab に追記
co:2345:respawn:/sbin/agetty xvc0 9600 vt100-nav
--

-- /etc/securetty に追記
xvc0
--

この設定を行った後、Domain-Uを再起動すると、無事Domain-0からxm consoleコマンドでコンソールログインできるようになりました。

(参考)
CentOS Tips And Tricks:
http://wiki.centos.org/TipsAndTricks/Xen?highlight=%28Console%20handling%29

2007年10月04日

サーバ仮想化

9月の後半から、少し時間をもらってXenやVMware Serverといった、無償で使用できるサーバ仮想化ソフトの調査をしていました。
Xenの環境構築は大変かな〜と思っていたのですが、CentOS5にはXenのパッケージが含まれているため、比較的簡単にインストールすることができました。
VMware Serverについても、RPMパッケージがリリースされているので、簡単にインストールできました。
インストールやゲストOS環境の設定では、ITProやいろいろな方のサイトを参考にさせてもらったので、ここでも僕がハマった、オフィシャルのUser's Manualには書いていないことについてまとめます。

仮想サーバをうまく使ってサーバリソースを有効活用し、アンタスで、より安価なマネージドホスティング環境を提供できればと思っています。