ラベル VLAN の投稿を表示しています。 すべての投稿を表示
ラベル VLAN の投稿を表示しています。 すべての投稿を表示

2008/11/03

NTPDとIP multicast

以前このブログでNTPDについて書いた。この中で、『注意!IPマルチキャストに関して訂正・本編』という記事を書いたが、これに間違いが見つかったので訂正する。
Ntpdは、その認証機構がIPアドレスと結びついているため、マルチキャストパケットを送信する際に、送信元となる自分自身のIPアドレスをntpd自身が明示的に知る必要があります。そのため、IPマルチキャスト用のソケット(socket)を取得する際、そのIPマルチキャストアドレス(通常なら 224.0.1.1)で経路情報(routing table)を引き、得られたネットワークインターフェースのIPアドレスを送信元IPアドレスとするようです。
この赤字の部分が誤り。
まず、マルチキャストサーバモードの時の動作だが、manpageの記述も間違っている。

broadcast
For type b and m addresses (only), this command mobilizes a persistent broadcast mode association. Multiple commands can be used to specify multiple local broadcast interfaces (subnets) and/or multiple multicast groups. Note that local broadcast messages go only to the interface associated with the subnet specified, but multicast messages go to all interfaces.
IPマルチキャストを使う場合、つまり、/etc/ntp.confの中で、broadcastコマンドにIPマルチキャストアドレス(m address)を指定した場合、すべてのインターフェースに対してマルチキャストメッセージが送信される、となっている。実際には、この通りにはならない。
実際には、複数のインターフェースを持っている場合には、マルチキャストメッセージが送信されるのは、それらのインターフェースの中の一つのみ。しかも、それはip route showで表示されるルーティングテーブルとは無関係の様だ。
この現象は、NTP BugzillaBug ID 785として扱われているようだ。バージョン4.2.6辺りで修正されるのかもしれない。

2008/06/25

続・snmpd: ioctl 35123 returned -1・その4・IPv6の無効化

Net-snmpのRPMをインストール・OSを再起動した後、/var/log/messagesには、以下の様なメッセージが大量に記録される。
Jun 24 20:26:11 ホスト名 snmpd[4729]: error on subcontainer '' insert (-1)
Jun 24 20:27:11 ホスト名 last message repeated 4 times
このメッセージは、IPv6を無効化すれば消すことが出来る(参考: Re: SNMP Errors in logfile with bonded NICs: subcontainer ia_addr insert #6)
# chkconfig ip6tables off
# cat > disable-ipv6
alias net-pf-10 off
alias ipv6 off[CTRL]+[D]
# restorecon /etc/modprobe.d/disable-ipv6
# cp -p /etc/hosts /etc/hosts.orig
# sed 's/^::1/#::1/' < /etc/hosts.orig > /etc/hosts
#
OSを再起動してメッセージが出なくなることを確認する。

ただし、起動時に以下の様なメッセージが出力されることがある。
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]
FATAL: Module off not found.
CRITICAL : [ipv6_test] Kernel is not compiled with IPv6 support
これはIPv6を無効化した影響。実害はない。次のようなメッセージが/var/log/messagesに記録される。
Jun 24 21:10:14 ホスト名 snmpd[4775]: IfIndex of an interface changed. Such interfaces will appear multiple times in IF-MIB.
Jun 24 21:10:14 ホスト名 snmpd[4775]: Name of an interface changed. Such interfaces will keep its old name in IF-MIB.
これは、snmpd起動後にxendによってネットワークインターフェース名が変わってしまうため。デーモンsnmpdを再起動すれば解決する。


その1・概要
その2・Dom0の準備
その3・RPMのビルドとインストール
その4・IPv6の無効化

続・snmpd: ioctl 35123 returned -1・その3・RPMのビルドとインストール

VLAN_PLUS_VID形式に状態では、サービスxendを起動しなければ問題はないが、xendを起動すると、
Jun 24 01:28:43 ホスト名 snmpd[4728]: ioctl 35123 returned -1
Jun 24 01:28:43 ホスト名 last message repeated 3 times
あるいは、
Jun 25 12:21:09 ホスト名 snmpd[4681]: netsnmp_assert index == tmp failed if-mib/data_access/interface.c:467 _access_interface_entry_save_name()
Jun 25 12:21:09 ホスト名 last message repeated 3 times
の様なメッセージが/var/log/messagesに大量に記録される。これを回避するため、net-snmp-5.3.1-24以降のRPMパッケージを準備する。

2008/6/26追記:
CentOS公式リポジトリが更新されたので、自前でビルドする必要は無い。『net-snmp-5.3.1-24 released』参照。

現時点では、CentOSの公式リポジトリには古いバージョンのものしか用意されていないので、自前でビルドする。RPMをビルドするためには、RPMをビルドする場所(環境)が必要。これに関しては、『RHL9用のbind-9.2.8.*.rpmを作る』を参照。SRPMは、Red HatのFTPサイトから拝借する。
$ cd %{_topdir}/RPM/SRPMS
$ wget ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/net-snmp-5.3.1-24.el5_2.1.src.rpm
--20:09:15--  ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/net-snmp-5.3.1-24.el5_2.1.src.rpm
=> `net-snmp-5.3.1-24.el5_2.1.src.rpm'
Resolving ftp.redhat.com... 209.132.176.30
Connecting to ftp.redhat.com|209.132.176.30|:21... connected.
Logging in as anonymous ... Logged in!
==> SYST ... done.    ==> PWD ... done.
==> TYPE I ... done.  ==> CWD /pub/redhat/linux/enterprise/5Server/en/os/SRPMS ... done.
==> SIZE net-snmp-5.3.1-24.el5_2.1.src.rpm ... 4435518
==> PASV ... done.    ==> RETR net-snmp-5.3.1-24.el5_2.1.src.rpm ... done.
Length: 4435518 (4.2M)

100%[=======================================>] 4,435,518   96.5K/s   in 50s

20:10:07 (86.2 KB/s) - `net-snmp-5.3.1-24.el5_2.1.src.rpm' saved [4435518]

$
続いて、rpmbuildコマンドを使ってビルドする(かなり時間がかかった)
$ rpmbuild --rebuild net-snmp-5.3.1-24.el5_2.1.src.rpm
Installing net-snmp-5.3.1-24.el5_2.1.src.rpm
warning: InstallSourcePackage: Header V3 DSA signature: NOKEY, key ID 37017186
<<略>>
+ cd /home/fujino/RPM/BUILD
+ rm -rf net-snmp-5.3.1
+ exit 0
$ cd ~/RPM/RPMS/i386
$ ls net-snmp-*
net-snmp-5.3.1-24.1.i386.rpm            net-snmp-libs-5.3.1-24.1.i386.rpm
net-snmp-debuginfo-5.3.1-24.1.i386.rpm  net-snmp-perl-5.3.1-24.1.i386.rpm
net-snmp-devel-5.3.1-24.1.i386.rpm      net-snmp-utils-5.3.1-24.1.i386.rpm
$
これらの内、snmpdを動かすのに最低限必要なRPMパッケージは、net-snmpおよびnet-snmp-libs。試験等でsnmpwalkなどのコマンドを使う場合、net-snmp-utilsも併せてインストールする。
# rpm -qa | grep net-snmp
net-snmp-libs-5.3.1-19.el5_1.4
net-snmp-5.3.1-19.el5_1.4
net-snmp-utils-5.3.1-19.el5_1.4
# rpm -Uvh net-snmp-5.3.1-24.1.i386.rpm net-snmp-libs-5.3.1-24.1.i386.rpm net-snmp-utils-5.3.1-24.1.i386.rpm
Preparing...                ########################################### [100%]
1:net-snmp-libs          ########################################### [ 33%]
2:net-snmp               ########################################### [ 67%]
3:net-snmp-utils         ########################################### [100%]
# shutdown -r now

その1・概要
その2・Dom0の準備
その3・RPMのビルドとインストール
その4・IPv6の無効化

続・snmpd: ioctl 35123 returned -1・その2・Dom0の準備

VLANとXenを組合わせて使う』シリーズに従ってDom0を設定する。ただし、VLANインターフェース名は、VLAN_PLUS_VID形式(つまり、vlan4000の様なインターフェース名となる)にする。

まず、VLANインターフェース名の形式を指定する。/etc/sysconfig/networkに以下の部分を追加する。
NOZEROCONF=yes
VLAN=yes
VLAN_NAME_TYPE=VLAN_PLUS_VID

VLANとXenを組合わせて使う・その2・VLAN設定』で解説した通り、VLAN_PLUS_VID形式ではVLANインターフェース名から対応する物理インターフェース名を特定することはできない。従って、各VLANインターフェースの設定ファイル/etc/sysconfig/network-scripts/ifcfg-vlan*では、PHYSDEV=物理インターフェース名の様に物理インターフェースを明示しなければならない。例えば、vlan4001の設定ファイル/etc/sysconfig/network-scripts/ifcfg-vlan4001は次の通り。
DEVICE=vlan4001
PHYSDEV=eth1
BOOTPROTO=static
IPADDR=192.168.56.191
NETMASK=255.255.255.0
ONBOOT=yes

これに伴い、他の設定でインターフェース名を使用している部分についてを変更する。『VLANとXenを組合わせて使う・その3・Xenネットワーク』で紹介したXenのネットワークのラッパースクリプト/etc/xen/scripts/network-vlan-bridge-wrapperを使う場合、netdev=で指定するインターフェース名を以下の通り変更する。
#!/bin/sh
BRIDGE_SCRIPT=/etc/xen/scripts/network-vlan-bridge
$BRIDGE_SCRIPT "$@" vifnum=0 netdev=vlan1000 bridge=br1000
$BRIDGE_SCRIPT "$@" vifnum=1 netdev=vlan4000 bridge=br4000
$BRIDGE_SCRIPT "$@" vifnum=2 netdev=vlan4001 bridge=br4001
$BRIDGE_SCRIPT "$@" vifnum=3 netdev=vlan4002 bridge=br4002
この他に例えば、iptablesでインターフェース名を指定している場合もあるだろう。適宜変更する。


その1・概要
その2・Dom0の準備
その3・RPMのビルドとインストール
その4・IPv6の無効化

2008/06/24

続・snmpd: ioctl 35123 returned -1・その1・概要

前のエントリ『snmpd: ioctl 35123 returned -1』で、
VLANとXenを組合わせて使う・その3・Xenネットワーク』で解説した通りに仮想ブリッジを構成すると、ブリッジ名が8文字を超える。Linuxにおいて、仮想ブリッジはネットワークインターフェースの一種なので、この問題が発生する。これについては、短いブリッジ名、例えばbr0900を使用することで回避可能。
と軽く書いたが、実際にやってみると簡単ではなかった。

簡単でない第一の理由は、実際にはネットワークインターフェース名を8文字以下に抑えることが出来ないこと。仮想ブリッジ名やVLANインターフェース名を8文字以下に抑えても、Xenのスクリプト/etc/xen/scripts/network-bridgeでは、VLANインターフェースを含むインターフェースが、pインターフェース名に改名される。例えば、VLANインターフェースvlan1000は、pvlan1000になる。結果、インターフェース名が8文字を超える。

この問題は、同じエントリに追記した通り、
net-snmp-5.3.1-24以降にアップグレードすれば解決する
ので、自前でRPMをビルド・インストールすれば、万事解決…とは行かない。CentOS5やRHEL5のnet-snmpパッケージにはIPv6の扱いにバグがあるからだ。これが簡単にいかない第二の理由。IPv6不要の場合は、IPv6を無効化することで解決可能だ。
参考:
Re: SNMP Errors in logfile with bonded NICs: subcontainer ia_addr insert #6
[ 1444989 ] --enable-ipv6 causes runtime errors in 5.3/5.4 on Linux 2.6

2008/6/26追記:
CentOS公式リポジトリが更新されたので、自前でビルドする必要は無い。『net-snmp-5.3.1-24 released』参照。

作業概要は、以下の通り。
  1. Dom0の準備
  2. RPMパッケージのビルドとインストール
  3. IPv6の無効化
以降、それぞれについて解説する。


その1・概要
その2・Dom0の準備
その3・RPMのビルドとインストール
その4・IPv6の無効化

2008/06/20

snmpd: ioctl 35123 returned -1

CentOS5やRHEL5でsnmpdを起動すると、/var/log/messagesに以下の様なメッセージが大量に吐かれる場合がある。
Jun 18 17:31:48 hostname snmpd[4807]: ioctl 35123 returned -1
Jun 18 17:31:48 hostname last message repeated 7 times
この問題は、8文字より長いネットワークインターフェース名を使用している場合に発生する。通常、インターフェース名は、eth0の様な形式で8文字を超えることは無いが、VLANを使用する場合等に問題になる。

この問題は、Net-SNMPのversion 5.4.2で解決されるらしい(CentOS5は、5.3.1)が、現時点では正式リリースされていない(Net-SNMPのサイト)。従って、現状では8文字より長いインターフェース名を使わないのが現実解となる。

RHELやCentOSでのVLANの使用方法については、『VLANとXenを組合わせて使う・その2・VLAN設定』で解説した。インターフェース名が8文字以下に抑えるには、/etc/sysconfig/networkの中で、VLAN_NAME_TYPEにVLAN_PLUS_VIDもしくはVLAN_PLUS_VID_NO_PADを指定すればよい。
VLAN=yes
VLAN_NAME_TYPE=VLAN_PLUS_VID
VLAN IDは最大で4桁(1~4095)なので、ネットワークインターフェース名は最大で8文字となる。

また、『VLANとXenを組合わせて使う・その3・Xenネットワーク』で解説した通りに仮想ブリッジを構成すると、ブリッジ名が8文字を超える。Linuxにおいて、仮想ブリッジはネットワークインターフェースの一種なので、この問題が発生する。これについては、短いブリッジ名、例えばbr0900を使用することで回避可能。

2008/6/25追記:
上で、「例えばbr0900を使用することで回避可能」と書いているが、実際にはそう簡単には解決しない。解決編『続・snmpd: ioctl 35123 returned -1・その1』参照。

追記:
この問題は、RHBA-2008:0376-8で修正されている。
This update also fixes syslog messages produced by snmp under the following
conditions:

* when an interface name exceeds 8 characters in length.
従って、net-snmp-5.3.1-24以降にアップグレードすれば解決する…はずだが、CentOSのリポジトリにはまだない

2008/6/26追記:
CentOS公式リポジトリが更新された。『net-snmp-5.3.1-24 released』参照。

2008/06/11

もう一つのping … arping

コマンド/bin/pingは、通信確認用によく使われる。このコマンドは、IPのプロトコルの一つであるICMPのType 8、Echo Requestを対象ホストへ送信し、ICMP Type 0、Echo Replyが返ってくるかどうかを確認する(『ネットワークの疎通を確認するには?~ping/traceroute~』)
ただし、TCPやUDPで通信はできるのに、pingは失敗する、という場合もある。例えば、対象ホストでiptablesが働いていて、pingに応答しないよう設定されている場合などだ。Firewallなどのセキュリティ製品の場合、デフォルトでpingに応答しない場合もある。このような場合の代替手段の一つが、/usr/sbin/arpingだ。
このコマンドは、pingがICMPを利用する代わりに、ARPを利用する。ARPは、Ethernet環境において、IPアドレスからMACアドレスを得るために用いられるプロトコル。Echo Requestに応答しないよう設定されているホストでも、IPで通信する必要があれば、必ずARPには応答する。
# /usr/sbin/arping -I eth0.4001 192.168.56.192
ARPING 192.168.56.192 from 192.168.56.195 eth0.4001
Unicast reply from 192.168.56.192 [XX:XX:XX:XX:XX:XX] 0.703ms
Unicast reply from 192.168.56.192 [XX:XX:XX:XX:XX:XX] 0.672ms
Unicast reply from 192.168.56.192 [XX:XX:XX:XX:XX:XX] 0.983ms [CTRL]+[C]
Sent 3 probes (1 broadcast(s))
Received 3 response(s)
#
このコマンドを使用する場合の注意点は以下の通り。
  • root権限で実行しなければならない。
  • 同一セグメント内でしか使用できない(ARPの原理より明らか)
  • インターフェースが複数ある場合は、-I インターフェースで指定しなければならない(上の実行例参照)

2008/02/25

CMANとXENを組合わせて使う

Red Hat Cluster: CentOS 5.1上でRHCSを使ってみる・その2・Dom0 fsXのインストール』でさらっと、
サービスcmanの起動スクリプト/etc/init.d/cmanを修正する。これは、xend-config.sxpを変更したこと、および、サービスcmanがサービスxendよりも先に起動されることへの対応。
と書いた。これの解説。

XenとVLAN、CMAN(クラスタ)を併せて使うと、CMANが正常に起動しない、という問題にぶち当たる。これはなぜかというと、CMANのinitスクリプト/etc/init.d/cmanの中で、以下の処理を行っているためだ。
  • Xenネットワーク用スクリプトを検出し、そのスクリプトを用いてXenネットワークをCMAN起動と同時に起動している。しかし、『VLANとXenを組合わせて使う・その3・Xenネットワーク』の修正を適用していると、Xenネットワーク用スクリプトの名前が変わるため、検出に失敗する。
  • コマンドxm listを使って、Xen Dom0かどうかを検査しようとしている。しかし、サービスcman(/etc/rc3.d/S21cman)は、サービスxend(/etc/rc3.d/S98xend)より先に実行されるため、この検査は常に失敗する。
従って、これを修正すべく、以下のパッチを適用している。
156c156
< egrep "^[[:blank:]]*\([[:blank:]]*network-script[[:blank:]]+network-bridge([[:blank:]]*\)|[[:blank:]]+)" /etc/xen/xend-config.sxp >/dev/null 2>/dev/null
---
> egrep "^[[:blank:]]*\([[:blank:]]*network-script[[:blank:]]+network-(|vlan-)bridge(|-wrapper)([[:blank:]]*\)|[[:blank:]]+)" /etc/xen/xend-config.sxp >/dev/null 2>/dev/null
165,166c165,167
< if [ ! -x /etc/xen/scripts/network-bridge ]; then
< if [ -f /etc/xen/scripts/network-bridge ]; then
---
> xen_bridge_script=`egrep "^[[:blank:]]*\([[:blank:]]*network-script[[:blank:]]+network-(|vlan-)bridge(|-wrapper)([[:blank:]]*\)|[[:blank:]]+)" /etc/xen/xend-config.sxp | sed 's/^[[:blank:]]*([[:blank:]]*network-script[[:blank:]]\+\|[[:blank:]]*)[[:blank:]]*//g'`
> if [ ! -x /etc/xen/scripts/$xen_bridge_script ]; then
> if [ -f /etc/xen/scripts/$xen_bridge_script ]; then
176c177
< errmsg=$(/etc/xen/scripts/network-bridge start 2>&1) || return 1
---
> errmsg=$(/etc/xen/scripts/$xen_bridge_script start 2>&1) || return 1
192c193,195
< xm list --long 2> /dev/null | grep -q "Domain-0" || return 1
---
> # The following line is commented out because this check does not
> # work properly before xend is started.
> #xm list --long 2> /dev/null | grep -q "Domain-0" || return 1

2007/11/22

VLANとXenを組合わせて使う・その5・仮想ブリッジが多い場合

以前、『VLANとXenを組合わせて使う』シリーズで、VLANとXenを組み合わせて使う方法を紹介した。
この中の『VLANとXenを組合わせて使う・その3・Xenネットワーク』で、
が、/etc/xen/scripts/network-bridgeの中に
# vifnum     Virtual device number to use (default 0). Numbers >=8
# require the netback driver to have nloopbacks set to a
# higher value than its default of 8.
とあるように、カーネル変数の変更が必要らしいが、試していない。悪しからず。
と書いた。このvifnumとは、Xenドメイン間を接続する仮想ブリッジの番号で、これはデフォルトでは、最大で8までしか使用できない…と書いてあるが、実際にCentOS 5で試してみると、vifnum=4までしかブリッジを作成できなかった。

では、これを増やすにはどうすればよいか?CentOS 5では(ということは、RHEL 5でも(未確認))netbackドライバは、カーネルモジュールとして組み込まれている(modprobe -lで確認できる)ので、/etc/modprobe.confに次の行を追加し、再起動する。
options netloop nloopbacks=32
VLANとXenを組合わせて使う・その1
VLANとXenを組合わせて使う・その2・VLAN設定l
VLANとXenを組合わせて使う・その3・Xenネットワーク
VLANとXenを組合わせて使う・その4・DomUインストール
VLANとXenを組合わせて使う・その5・仮想ブリッジが多い場合

2007/06/19

注意!IPマルチキャストに関して訂正・本編

2008.11.3(月):注意!この記事の内容も正しくありませんでした。訂正記事を掲載しました。
注意!IPマルチキャストに関して訂正』で予告した、以下の記事に関する訂正です。
[1] 『IPマルチキャストを使う
[2] 『IPマルチキャストを使う・補足・VLANと
端的に言うと、ntpdのIPマルチキャストを使ってIPマルチキャスト通信の検証を行っていたので、ntpd固有の問題とIPマルチキャスト一般の問題を混同してしまったのが間違いの原因です。

記事[1]の中で当初、
IPマルチキャストを使用する場合、そのホストが持っているネットワークインターフェースの内、どのインターフェースの先にIPマルチキャストネットワークが存在しているかを指定しなければならない。
と書いていました。これは実際には誤りで、何も指定していなければどのインターフェースにもIPマルチキャストネットワークが存在するものと理解しているはずです。ただ、IPマルチキャストアドレスに対する経路を明示的に設定することができる、というだけのことです。

ただし、ntpdに関しては事情が違います。Ntpdは、その認証機構がIPアドレスと結びついているため、マルチキャストパケットを送信する際に、送信元となる自分自身のIPアドレスをntpd自身が明示的に知る必要があります。そのため、IPマルチキャスト用のソケット(socket)を取得する際、そのIPマルチキャストアドレス(通常なら224.0.1.1)で経路情報(routing table)を引き、得られたネットワークインターフェースのIPアドレスを送信元IPアドレスとするようです。
これは、マルチキャストクライアントの場合も同様のようです。つまり、listenするIPマルチキャストアドレス(通常なら224.0.1.1)で経路情報を引いて得られたネットワークインターフェースからのみ、NTPマルチキャストパケットを受け取ります。

このntpdの動作は、Linux機にネットワークインターフェースが一つしかない場合には問題になりません。なぜなら、既定経路(default route)が存在していれば、それは必ず唯一のネットワークインターフェースに結びついているからです。

2007/05/26

IPマルチキャストを使う・補足・VLANと

2007.6.7(木):注意!この記事の内容は正しくない可能性があります。現在詳細を調査中です。近日中に訂正記事を掲載します。

前回、IPマルチキャストの設定について解説した。今回はその補足。

前回の設定を『VLANとXenを組合わせて使う・その2・VLAN設定』で解説したようなVLANインターフェースに対して同様に/etc/sysconfig/static-routes内に設定を書いてもマルチキャストアドレスに対する経路(ルーティング)が設定されない。詳しくは調べていないのだが、これは、/etc/sysconfig/static-routesが、VLANインターフェースが起動されるより前に処理されることが原因のようだ。
ネットワークの起動スクリプト/etc/init.d/networkの中には、/etc/sysconfig/static-routesについて
# Add non interface-specific static-routes.
とある。

従って、VLANインターフェースに対してマルチキャスト経路を設定する場合は、VLANインターフェースが起動された後に経路を設定すればよい。これを実現するためには、インターフェース毎の経路を設定する/etc/sysconfig/network-scripts/route-デバイス名もしくは/etc/sysconfig/network-scripts/デバイス名.routeに経路を記述する。前者は、新書式(new format)と旧書式(old format)の二種類の書式を使えるが、後者は新書式のみに対応している。システム設定コマンドsystem-config-networkで扱うのは後者。
旧書式の場合は、
multicast 224.0.0.0/4 dev eth0.1000
の様に記述する。行頭のmulticastは省略可能だ。パラメータは、ip route addコマンドで指定するものと同じ。
新書式では、
ADDRESS0=224.0.0.0
NETMASK0=240.0.0.0
の様に記述する。
通常の静的経路の場合は、ADDRESSN=IPアドレスおよびNETMASKN=ネットマスクに加えて、next hop routerを指定するGATEWAYN=IPアドレスを指定するが、マルチキャスト経路の場合にはこれを指定しない。詳しくは/etc/sysconfig/network-scripts/ifup-routesを参照のこと。

2007/05/23

VLANとXenを組合わせて使う・その4・DomUインストール

VLANとXenを組合わせて使うシリーズの第四回。DomUのインストール。
2007.9.17(月)改定: GUIによるインストールは可能です。ただし、DomUに十分なメモリ(256MB以上?)を割り当てる必要があります。

通常、CentOS 5におけるDomUのインストールは、virt-manager(Gnomeデスクトップからだと、[アプリケーション]->[システムツール]->[Virtual Machine Manager])を起動し、その画面から、[新規(N)]ボタンを押す(『CentOS 5でXenを使ってみる』参照)。
しかし、このツールは、特殊なネットワーク構成を考慮していない。例えば、ネットワークインターフェースが複数あり、既定経路(default route)が設定されてるインターフェースと、レポジトリと通信可能なインターフェースが別であるような場合にはうまくいかない。

そこで、virt-managerを介さず、virt-installコマンドを直接利用する。このコマンドは、様々なオプションをとる(virt-manager --helpで確認可能)が、この中に、
-b BRIDGE, --bridge=BRIDGE
Bridge to connect guest NIC to; if none given, will
try to determine the default
というオプションがある。このオプションによって、インストールしようとしているDomUが接続するVLAN(正確にはそれに対応するブリッジ)を指定できる。また、--vncオプションを指定すれば、VNCによるインストールも可能だ(が、GUIインストールには成功していない)。インストールパスや、VCPU数、メモリサイズなどは、オプションで指定することもできるが、指定しなければ対話的にインストールを進めることになる。

以下、実行例を示す。下線部はユーザが入力する部分。
# virt-install --vnc --bridge xenbr0900
What is the name of your virtual machine? dc5
How much RAM should be allocated (in megabytes)? 256
What would you like to use as the disk (path)? /var/lib/xen/images/dc5.img
How large would you like the disk (/var/lib/xen/images/dc5.img) to be (in gigabytes)? 4
What is the install location? http://centos.repository/centos/5/os/i386


Starting install...

VNC Viewer Free Edition 4.1.2 for X - built Mar 14 2007 22:51:02
Copyright (C) 2002-2005 RealVNC Ltd.
See http://www.realvnc.com for information on VNC.
この後、VNCの画面が起動される。後は通常のDomUのインストールと同様。

CentOS5のインストール時に、仮想化(Virtualization)を選択しておけば、必要なツールは大抵入っているが、もしかすると、DomUをGUIでインストールするときに使用するVNCクライアントが欠けていて、VNCによるコンソール画面が出ないかもしれない。その場合は、
# yum install vnc
を実行してvncパッケージをインストールする。

VLANとXenを組合わせて使う・その1
VLANとXenを組合わせて使う・その2・VLAN設定l
VLANとXenを組合わせて使う・その3・Xenネットワーク
VLANとXenを組合わせて使う・その4・DomUインストール
VLANとXenを組合わせて使う・その5・仮想ブリッジが多い場合

VLANとXenを組合わせて使う・その3・Xenネットワーク

VLANとXenを組合わせて使うシリーズの三回目。今回は、Xenのネットワーク設定について解説する。
注意: 2007.5.23(水)改訂

Xenでは、デフォルトで、Xen WikiXenNetworkingで解説されている様なネットワークを構成する。この設定は、/etc/xen/xend-config.sxpに記述されている。この中で、ネットワークに関しては、
(network-script network-bridge)
という行が見つかる。この行により、シェルスクリプト/etc/xen/scripts/network-bridgeが呼び出される。

スクリプト/etc/xen/scripts/network-bridgeは、最初にstartもしくはstopのうちいずれかを引数としてとり、その後に、以下の四つの引数を指定することができる。例は、既定経路(default route)がeth0の先にある場合の値。
引数内容既定値
vifnum=番号仮想インターフェース番号既定経路を持つインターフェースの番号0
bridge=名前ブリッジ名xenbr${vifnum}xenbr0
netdev=名前ブリッジに対応するインターフェース名eth${vifnum}eth0
antispoof=yes|noIPスプーフィングを行うかnono

ただ、これは前回解説した様なVLAN設定を行っている場合は正常に動作しない。
このスクリプトは、netdevに対して、一旦ダウン(ifdown ${netdev})させ、IPアドレス情報を取得し、名前をp${netdev}に変更しようとする。例えば、VLANインターフェースeth0.09000が既定経路を持っていた場合、このスクリプトでは、
  • vifnum: 0.0900
  • bridge: xenbr0.0900
  • netdev: eth0.0900
となり、eth0.0900をダウンしようとするが、VLANインターフェースは、物理インターフェースと違い、一旦ダウンさせるとインターフェース自体が消えてしまう。このため、IPアドレス情報を取得できず、スクリプトが異常終了する(bondingインターフェースもVLANインターフェースと同様、ダウンさせると消えてしまうが、このスクリプトはbondingインターフェースには対応している)
2008/6/20追記:
上の様なブリッジ名、インターフェース名を使用すると、snmpdがエラーメッセージをはく場合がある。『snmpd: ioctl 35123 returned -1』参照。


この問題を解決するため、/etc/xen/scripts/network-bridgeを改造したスクリプト/etc/xen/scripts/network-vlan-bridgeを作成する。まずは、
# cd /etc/xen/scripts
# cp network-bridge network-vlan-bridge
#
でコピーを作成し、以下の通り修正する。
# diff network-bridge network-vlan-bridge
80a81,84
> is_vlan() {
>     [ -f "/proc/net/vlan/$1" ]
> }
>
217c221
<>       if is_vlan ${netdev} || is_bonding ${netdev} || ! ifdown ${netdev}; then
257c261
<>       if is_vlan ${netdev} || ! ifdown ${netdev}; then
#
要するに、ifdownを実行する前に、VLANインターフェースかどうかをチェックするように修正した。

この様に修正した上で、以下の様なネットワークを構成する(これはあくまでも私のやり方。他にいい方法があるだろう。よい方法を考え付いた人は教えて欲しい)。VLAN ID MMMMを持つethNのVLANインターフェースethN.MMMMに対して、
  • ブリッジxenbrMMMMを作成する。
  • MMMMに1:1に対応する仮想インターフェース番号をKとする。
すなわち、
network-vlan-bridge start vifnum=K netdev=ethN.MMMM bridge=xenbrMMMM
を実行する。これは、VLANが一つだけの場合であれば、xend-config.sxpの当該部分を、
(network-script 'network-bridge vifnum=0 netdev=eth0.1000 bridge=xenbr1000')
の様に変更すればよい。

しかし、VLANの用途から考えて、VLANが一つだけということは考えにくい(一つで済むなら、VLANで運用しなくてもよいはず)。その場合、xend-config.sxpのコメントに
It is possible to use the network-bridge script in more complicated scenarios, such as having two outgoing interfaces, with two bridges, and two fake interfaces per guest domain. To do things like this, write yourself a wrapper script, and call network-bridge from it, as appropriate.
とあるように、xend-config.sxp以外のところでスクリプトを実行する必要がある(あるいは、network-bridgeスクリプトを複数回呼び出すスクリプトを準備する手もある)。まず、xend-config.sxpの当該行を
#(network-script network-bridge)
の様にコメントアウトした上で、/etc/init.d/xendを以下の様に変更する。
# diff xend.dist xend
21a22,23
> BRIDGE_SCRIPT=/etc/xen/scripts/network-vlan-bridge
>
47a50,51
>       $BRIDGE_SCRIPT start vifnum=0 netdev=eth0.1000 bridge=xenbr1000
>       $BRIDGE_SCRIPT start vifnum=1 netdev=eth0.1001 bridge=xenbr1001
52a57,58
>       $BRIDGE_SCRIPT stop vifnum=0 netdev=eth0.1000 bridge=xenbr1000
>       $BRIDGE_SCRIPT stop vifnum=1 netdev=eth0.1001 bridge=xenbr1001
#

とあるように、network-vlan-bridgeを複数回呼び出すラッパーnetwork-vlan-bridge-wrapperを作成し、これを呼び出すように変更する。まず、xend-config.sxpの当該行を以下のように変更する。
(network-script network-vlan-bridge-wrapper)
これにより、network-bridgeの代わりにnetwork-vlan-bridge-wrapperが呼び出されるようになる。
ラッパー/etc/xen/scripts/network-vlan-bridge-wrapperは、以下の通り。
#!/bin/sh
BRIDGE_SCRIPT=/etc/xen/scripts/network-vlan-bridge
$BRIDGE_SCRIPT "$@" vifnum=0 netdev=eth0.1000 bridge=xenbr1000
$BRIDGE_SCRIPT "$@" vifnum=1 netdev=eth0.1001 bridge=xenbr1001
上は、VLAN ID 1000および1001を使う場合の例。より多くのVLANを使用する場合には、行を追加すればよい。

が、/etc/xen/scripts/network-bridgeの中に
# vifnum     Virtual device number to use (default 0). Numbers >=8
#            require the netback driver to have nloopbacks set to a
#            higher value than its default of 8.
とあるように、カーネル変数の変更が必要らしいが、試していない。悪しからず。

2007/11/22追記:
これについて検証した。『VLANとXenを組合わせて使う・その5・仮想ブリッジが多い場合』参照。


VLANとXenを組合わせて使う・その1
VLANとXenを組合わせて使う・その2・VLAN設定l
VLANとXenを組合わせて使う・その3・Xenネットワーク
VLANとXenを組合わせて使う・その4・DomUインストール
VLANとXenを組合わせて使う・その5・仮想ブリッジが多い場合

2007/05/18

VLANとXenを組合わせて使う・その2・VLAN設定

VLANとXenを組合わせて使うシリーズの第2回。Red Hat系のOSで802.1QタグVLANを設定する方法を解説する。

2008/6/20追記:
VLANとsnmpdを組み合わせて使うと問題が発生する場合がある。『snmpd: ioctl 35123 returned -1』を併せて読んで欲しい。

2008/6/25追記:
細かい手順を解説した。『続・snmpd: ioctl 35123 returned -1』にも眼を通してほしい。

前提条件
まずカーネル(kernel)がVLANに対応していけなればならない。Red Hat系の最近のOSであれば、普通にyumで入れたようなカーネルは最初からVLANに対応しているので問題ない。
次に、VLANインターフェースを作成するためのコマンドvconfigが必要だ。Red Hat系だと、vconfigというRPMパッケージに入っている。デフォルトでインストールされているはずだが、もしインストールされていなければ、
yum install vconfig
をrootで実行してインストールする。
最後に、ネットワークインターフェース。これがなければ話にならない(笑)。
あと、タグVLANに対応したL2SWも必要。この設定については、機器毎に違うので、各機器のマニュアルを参照してほしい。

ネットワーク全体設定
Red Hat系のOSでは、ネットワーク全体に対する設定を/etc/sysconfig/networkで行う。ここには、(1)VLANを使用すること、(2)VLANインターフェースに対する命名規則の二つを宣言する。以下の行を追加する。
VLAN=yes
VLAN_NAME_TYPE=DEV_PLUS_VID
最初の行はVLANを使用することの宣言、二行目は命名規則の宣言だ。命名規則には、以下の四種類が指定できる。例は、物理インターフェースeth0に対してVLAN ID 100を追加した場合ののVLANインターフェース名。
VLAN_PLUS_VIDvlan0100
VLAN_PLUS_VID_NO_PADvlan100
DEV_PLUS_VIDeth0.0100
DEV_PLUS_VID_NO_PADeth0.100
VLAN_PLUS_VIDやVLAN_PLUS_VID_NO_PADの場合、そのVLANインターフェースに対応している物理インターフェースが名前から判断できないことに注意しよう。

物理インターフェース設定
Red Hat系では、eth0に対する設定は、/etc/sysconfig/network-scripts/ifcfg-eth0で行う。通常、このファイルの中には、静的なIPアドレスか、ブートプロトコルかのいずれかが指定されいるが、eth0でVLANを使う場合にはeth0に直接IPアドレスを割当てることはしないため、この設定は削除する。
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes


VLANインターフェース設定
物理インターフェースと同様、VLANインターフェースの設定も/etc/sysconfig/network-scripts以下のifcfg-インターフェース名というファイルの中で行う。命名規則にDEV_PLUS_VIDを指定した場合、eth0にVLAN ID 900を追加したいときには、/etc/sysconfig/network-scripts/ifcfg-eth0.0900を作成し、以下のように記述する。
DEVICE=eth0.0900
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.1.1
NETMASK=255.255.255.0
基本的に通常のifcfg-eth0などと同様。ただし、命名規則にVLAN_PLUS_VIDやVLAN_PLUS_VID_NO_PADを選んだ場合は、
PHYSDEV=eth0
の様に、対応する物理インターフェースを指定する必要がある。なぜなら、前に指摘したとおり、VLANインターフェース名から対応する物理インターフェースを特定できないからだ。

参考
この手の設定パラメータを調べるには、/etc/init.d以下のスクリプトを眺めてみるとよい。ネットワークインターフェース設定に関しては、起動・停止に/etc/sysconfig/network-scripts/if{up,down}が呼ばれることになるので、これらを覗く。

VLANとXenを組合わせて使う・その1
VLANとXenを組合わせて使う・その2・VLAN設定l
VLANとXenを組合わせて使う・その3・Xenネットワーク
VLANとXenを組合わせて使う・その4・DomUインストール
VLANとXenを組合わせて使う・その5・仮想ブリッジが多い場合

2007/05/17

VLANとXenを組合わせて使う・その1

前回、CentOS上でのXen DomUのインストール方法を解説した。この方法だと、すべてのDomUがDom0と同じサブネットに属することになる(ルートモードやNATモードを使用すれば別だが、セキュリティ、使い勝手の面でブリッジモードに劣る)。最も単純にこれを回避する方法は、接続したいサブネットの数だけネットワークインターフェースを増設することだが、筐体やバスの物理的制約上、無理という場合もある。
これを回避するためにIEEE 802.1Q タグVLAN(Virtual Local Area Network)を使用する。タグVLANは、Ethernetフレームに「タグ」と呼ばれる番号を付与し、この番号に従ってサブネットを分割する方式だ。詳しくは、@ITの記事を読んでもらいたい。

まずは、タグVLANに対応したL2SWが必要だ。L2SWの設定は、製品マニュアルに譲るとして、問題は、Linux側でのタグVLANの設定方法だ。これはカーネルの標準機能としてサポートされている。

次に、eth0をタグVLANに設定できたとして、この状態では、Xenのネットワークが正常に起動しない。巧くhackする必要がある。Xenのネットワークの詳細はXen Networksの記事に詳しい。

最後だが、Xenのネットワークを巧くhackできても、前回解説したvirt-managerコマンドではDomUのインストールができない。このコマンドが暗黙にデフォルトのネットワーク設定を前提としていて、(多分)変更できないからだ。
この問題を回避するために、代わりにvirt-installコマンドを使用する。基本的には、virt-managerを起動してから、[New]ボタンを押すのと変わらないが、virt-installは、引数により、接続するネットワークを指定することができる。

以上、それぞれについて解説していく。

VLANとXenを組合わせて使う・その1
VLANとXenを組合わせて使う・その2・VLAN設定l
VLANとXenを組合わせて使う・その3・Xenネットワーク
VLANとXenを組合わせて使う・その4・DomUインストール
VLANとXenを組合わせて使う・その5・仮想ブリッジが多い場合