2007/05/31

ローカルミラーレポジトリ・その4・レポジトリの更新(reposync & createrepo)

ローカルミラーレポジトリシリーズ第四回。前回は、更新されないBaseレポジトリを構築したが、今回はUpdatesやExtrasなど、随時更新されるレポジトリを構築・運用する。

第一回目で書いた通り、公式レポジトリの内、Baseを除くUpdates、Addons、Extras、PlusおよびContribは、随時更新されるレポジトリなので、定期的に内容を同期(ミラーリング)しなければならない。同期する手段は、
  • lftpコマンドのmirrorコマンドを利用する
  • rsyncを利用する
  • reposyncコマンドを利用する
等の方法があるが、今回は最後のreposyncコマンドを利用する方法を紹介する。

このreposyncコマンドは、yumレポジトリの同期を取るコマンドで、yum-utilsパッケージに収録されている。もしこのパッケージがインストールされていなければ、インストールする。
# yum install yum-utils
reposyncコマンドのmanページは無い様だ。使い方は、reposync --helpを実行して確認する。

まず、レポジトリ管理は、root権限を必要としないので、レポジトリを管理するユーザを作成する。これは既存のユーザを流用してもいいが、レポジトリが汚染されると一大事なので、これ専用のユーザを準備し、レポジトリの所有者を変更する。
# useradd -c "Repository Maintainer" -d /home/reposer reposer
# cd /var/www/html/
# chown -R reposer.reposer centos/
以後、レポジトリに対する操作は、このユーザの権限で行う。

CentOSのレポジトリは通常、以下のようなディレクトリ構造を持つ。
$ pwd
/var/www/html
$ find . -type d
.
./centos
./centos/5
<<略>>
./centos/5/extras
./centos/5/extras/i386
./centos/5/extras/i386/repodata
./centos/5/contrib
<<略>>
repodataというディレクトリは、yumが利用するメタデータを格納したディレクトリで、RPMSは文字通り、RPMパッケージが格納されている。目標は、これと同じ構造をローカルに作ること、ということになる。

しかし、reposyncコマンドは、このようなディレクトリ構造を生成しない。例えば、
$ ls
$ reposync -r extras
Loading "installonlyn" plugin
Downloading Terminal-0.2.6-2.i386.rpm
<<略>>
Downloading yumex-1.2.2-1.0.el5.centos.noarch.rpm
$ find . -type d
.
./extras
./extras/RPMS
$
まず、パス中にi386ディレクトリが抜かれているし、repodataディレクトリも存在していない。これを解決するために、reposyncの実行に先立ち、必要なディレクトリ構造及びシンボリックリンクを作成するスクリプトCreateRepoDirs.sh/var/www/html/centos/5へ移動した後実行する。
$ cat CreateRepoDirs.sh
#!/bin/bash
REPOSITORIES="updates addons extras centosplus"
TOP=$PWD
for repository in $REPOSITORIES
do
repo_path=$TOP/$repository
mkdir $repo_path
mkdir $repo_path/RPMS
ln -s $repo_path/RPMS $repo_path/i386
done
続いて、パッケージをダウンロードするスクリプトCentOS-repository-mirror.shを準備する。Cronで実行するだけなので、どこに置いても構わないが、私は、/usr/local/sbinの下に置いた。
$ cat CentOS-repository-mirror.sh
#!/bin/bash
LANG=C
REPOSITORIES="updates addons extras centosplus"
TOP=$PWD
echo "## `date`: BEGIN MIRRORING"
for repository in $REPOSITORIES
do
echo "#### `date`: BEGIN REPOSITORY $repository"
repo_path=$TOP/$repository
reposync -c /usr/local/etc/yum.conf -r $repository
createrepo -v $repo_path/RPMS
echo "#### `date`: END REPOSITORY $repository"
done
echo "## `date`: END MIRRORING"
$
わざわざreposyncの設定ファイルを/usr/local/etc/yum.confに準備しているのは、パッケージを更新するのに参照するのをローカルミラーレポジトリに、reposyncが参照するのを公開ミラーレポジトリに変更するため。次のcreaterepoコマンドは、メタデータ(repodata)を作成するコマンド。
/usr/local/etc/yum.confの内容は以下の通り。
$ cat yum.conf
[main]
reposdir=/usr/local/etc/yum.repos.d
$
/usr/local/etc/yum.repos.dには/etc/yum.repos.d/CentOS-Base.repoをコピーしておく(BaseとContribは不要なので、セクションごとコメントアウトした方がいいかもしれない)
後は、/var/www/html/centos/5に移動して、CentOS-repository-mirror.shを実行すればOKだ。

これらのレポジトリは、随時更新されるので、このコマンドを定期的に実行するといいだろう。これは、ユーザreposerの権限でcronにより実行する。ユーザreposerでコマンドcrontab -eを実行し、ユーザのreposerのcrontabに以下の行を追加する。
13 2 * * * cd /var/www/html/centos/5; mv -f mirror.log mirror.log.old; /usr/local/sbin/CentOS-repository-mirror.sh > mirror.log 2>&1
上の設定は、毎日2:13にレポジトリを更新する例。時刻は環境に応じて変更する。

最後にPGPのキーをインストールする。CentOS 5のPGPのキーは、http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5にあるので、これを/var/www/html/centosに置く。
$ cd /var/www/html/centos
$ wget http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

ローカルミラーレポジトリ・その1・概要
ローカルミラーレポジトリ・その2・レポジトリの準備と公開
ローカルミラーレポジトリ・その3・Baseレポジトリ
ローカルミラーレポジトリ・その4・レポジトリの更新(reposync & createrepo)
ローカルミラーレポジトリ・その5・レポジトリの利用

ローカルミラーレポジトリ・その3・Baseレポジトリ

ローカルミラーレポジトリシリーズ第三回。レポジトリの内、更新されないBaseについて準備する。

第二回で、レポジトリを置くディレクトリを/var/www/html/centos/5とした。Baseは、この下の/var/www/html/centos/5/os以下に置くことにする。今回は、i386アーキテクチャの分のみを準備するので、この下の
/var/www/html/centos/5/os/i386
以下に必要なファイルを置くことになる。

もし、CentOS5用のDVDを持っているのなら、そのDVDの内容をすべてここにコピーすればよい。
そうでない場合は、そのDVDのISOイメージをダウンロードし、ここにマウントする。ISOイメージは、CentOSのミラーサイトからダウンロードできる(できないミラーサイトもある)が、可能な限りbittorrentを利用してもらいたい。イメージファイルは、公開ミラーサイトに合わせて、
/var/www/html/centos/5/isos/i386
に置ことにする。以下の通り、必要なディレクトリを作成する。
# mkdir -p /var/www/html/centos/5/os/i386
# mkdir -p /var/www/html/centos/5/isos/i386
念のため、md5sum.txtもしくはsha1sum.txtと、ダウンロードしたファイルのチェックサムを確認して欲しい。
# md5sum /var/www/html/centos/5/isos/i386/CentOS-5.0-i386-bin-DVD.iso


ISOイメージをダウンロードしたら、これをマウントする。/etc/fstabに次の行を追加する。
/var/www/html/centos/5/isos/i386/CentOS-5.0-i386-bin-DVD.iso /var/www/html/centos/5/os/i386 iso9660 loop,ro 0 0
再起動するか、mount -aコマンドを実行するとマウントされるはずだ。mountコマンドを引数なしで実行するか、ls /var/www/html/centos/5/os/i386コマンドを実行して、ファイルがあることを確認する(マウントできていなければ、空になっている)

なお、ローカルレポジトリを運用しているマシンでSELinuxが動作している場合、BaseのURL http://centos.repository.localdomain/centos/5/os/i386にアクセスできない場合がある。これを回避するには、SElinuxによるHTTPサーバ保護を無効(コマンドsetsebool -P httpd_disable_trans 1を実行)にするか、ISOイメージを一旦別のところにマウントし、その内容をコピーする。
# mkdir /mnt/CentOS5.0
# mount /var/www/html/centos/5/isos/i386/CentOS-5.0-i386-bin-DVD.iso /mnt/CentOS5.0 -t iso9660 -o loop,ro
# cp -rp /mnt/CentOS5.0/* /var/www/html/centos/5/os/i386
# umount /mnt/CentOS5.0
不要であれば、ISOイメージは削除してもよい。

ローカルミラーレポジトリ・その1・概要
ローカルミラーレポジトリ・その2・レポジトリの準備と公開
ローカルミラーレポジトリ・その3・Baseレポジトリ
ローカルミラーレポジトリ・その4・レポジトリの更新(reposync & createrepo)
ローカルミラーレポジトリ・その5・レポジトリの利用

2007/05/30

ローカルミラーレポジトリ・その2・レポジトリの準備と公開

初回の説明と順番が違ってしまうが、まず、ローカルレポジトリを置くディレクトリの準備と、その公開を先に行う。

今回のローカルレポジトリは、HTTPで公開するものとする(FTPで公開することも可能だが、ここでは扱わない)。従って、/var/log/www/html以下にローカルレポジトリを置くのが簡単だ。ここでは、
/var/www/html/centos/5
以下にレポジトリを置くことにする。これはローカルサーバをcentos.repository.localdomainとすると、
http://centos.repository.localdomain/centos/5
というURLで公開されることになる(各サーバからこのURLでアクセスできるようにするためには、centos.repository.localdomainをDNSで引けるようにするか、各サーバの/etc/hostsを変更する必要がある)

まず、このディレクトリを作成する。「5.0」というリリース番号でもアクセスできるよう、シンボリックリンクを作成しておく。
# mkdir -p /var/www/html/centos/5
# ln -s /var/www/html/centos/5 /var/www/html/centos/5.0


後は、このディレクトリを公開できるよう、HTTPサーバを起動する。このディレクトリは、外部からアクセスさせる必要はないので、HTTPサーバを外部にも公開する可能性がある場合は、設定ファイル/etc/httpd/conf.d/centos-repository-mirror.confを以下の通り作成した方がよいだろう。
<Directory /var/www/html/centos>
Options +Indexes
Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from 192.168.55.0/255.255.255.0
</Directory>
Allow行は各環境に従って変更して欲しい。
当然だが、HTTPサーバ(Apache)の起動は、
# service httpd start
OS起動時に自動的にHTTPサーバを起動したい場合は、
# chkconfig httpd on
を実行する(か、GUIを使って変更する)

ローカルミラーレポジトリ・その1・概要
ローカルミラーレポジトリ・その2・レポジトリの準備と公開
ローカルミラーレポジトリ・その3・Baseレポジトリ
ローカルミラーレポジトリ・その4・レポジトリの更新(reposync & createrepo)
ローカルミラーレポジトリ・その5・レポジトリの利用

ローカルミラーレポジトリ・その1・概要

CentOSレポジトリ(repository)のローカルミラーを運用する方法を紹介する。
多数のサーバを運用する場合、各サーバがRPMパッケージの更新のために公式ミラーサイトにアクセスするのは、対外回線帯域の無駄だし、更新(yum updateコマンドの実行)にも時間がかかる。公式ミラーサイトの負荷の上でも好ましくない。そこで、ローカルに非公式なミラーレポジトリを立てることでこの問題を解決する。
また、ローカルレポジトリを使うと、XenのDomUのインストールも簡単かつ早くなるので、Xenを使う場合には是非準備したい。
CentOSはyumでレポジトリにアクセスする。同じ方式を用いているFedora Coreにも適用できる(レポジトリ構造が違うため、少々修正が必要だが)

CentOSの公式レポジトリは、/etc/yum.repos.d/CentOS-Base.repoの中にあるように、
  • Base
  • Updates
  • Addons
  • Extras
  • Plus
  • Contrib
の六つがある(が、現在Contribは運用されていないように見える)
この内、BaseはインストールCD/DVDに入っているものと同じで変化がないため、DVDのISOイメージから一度作成すればOK。
残りの五つは、更新されていくため、適宜ミラーリングする必要がある。ここでは、reposyncコマンドおよびcreaterepoコマンドを使用する方法を紹介する。
ローカルにレポジトリのミラーができたら、これをHTTP(もしくはFTP)でローカルネットワークへ公開する。
最後に、各サーバに対して、ローカルのミラーからRPMを更新できるように修正を加える。

それぞれの作業について解説する。
ローカルミラーレポジトリ・その1・概要
ローカルミラーレポジトリ・その2・レポジトリの準備と公開
ローカルミラーレポジトリ・その3・Baseレポジトリ
ローカルミラーレポジトリ・その4・レポジトリの更新(reposync & createrepo)
ローカルミラーレポジトリ・その5・レポジトリの利用

2007/05/28

169.254.0.0/16への経路を消す(APIPA)

RHELやCentOSを普通にインストールすると、以下のように169.254.0.0/16へのルーティングを発見できるはずだ。
# ip route show
192.168.55.0/24 dev eth0 proto kernel scope link src 192.168.55.192
169.254.0.0/16 dev eth0 scope link
default via 192.168.55.195 dev eth0
#
このアドレスは、APIPA(Automatic Private IP Addressing)と呼ばれるIPアドレス自動割当方式のために準備されている。これはこのまま放置しても実害はないが、不要なら削除してもよい。/etc/sysconfig/networkに以下の行を追加する。
NOZEROCONF=yes
再起動後、当該経路がないことを確認する。
# ip route show
192.168.55.0/24 dev eth0 proto kernel scope link src 192.168.55.192
default via 192.168.55.195 dev eth0
#

追記(2008/2/11):
同様の問題として、『192.168.122.0/24へのルーティングを消す(libvirt)』もある。

2007/05/27

日次実行時刻の変更

Red Hat系のOSでは、毎日4:02(現地時刻)にログのローテーション(logrotate(8))やログ解析(logwatch(8))が実行される。通常、これを変更する必要はないのだが、例えば、複数台の機器を運用しているが電源容量に余裕がない場合などは、同時に負荷が高くなることを避ける必要がある。NTPで時刻を合わせてるとなおさらだ。
これを変更するには、/etc/crontabを変更する。例えば、
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 5 * * * root run-parts /etc/cron.daily
22 5 * * 0 root run-parts /etc/cron.weekly
42 5 1 * * root run-parts /etc/cron.monthly
古いタイプのUNIX人は、crontab -eなんて実行しようとするが、それはまさに古い。って、オレのことじゃん…

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/25

IPマルチキャストを使う

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

恥ずかしながら、あまりIPマルチキャストというものを使ったことがなかった。ちょっと勉強してみた。

IPマルチキャストを使用する場合、そのホストが持っているネットワークインターフェースの内、どのインターフェースの先にIPマルチキャストネットワークが存在しているかを指定しなければならないできる。例えば、eth0の先にIPマルチキャストネットワークが存在していれば、
# ip route add 224.0.0.0/4 dev eth0
の様に経路(ルーティング)を設定する。
起動時から有効にしたい場合は、/etc/sysconfig/static-routesに以下の行を追加する。
any net 224.0.0.0/4 dev eth0
なお、ifconfigコマンドの出力に、
eth0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
inet addr:XXX.XXX.XXX.XXX  Bcast:XXX.XXX.XXX.XXX  Mask:XXX.XXX.XXX.XXX
UP BROADCAST RUNNING MULTICAST  MTU:1496  Metric:1
RX packets:5729 errors:0 dropped:0 overruns:0 frame:0
TX packets:5987 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:603345 (589.2 KiB)  TX bytes:1081601 (1.0 MiB)
の様に、マルチキャストフラグが設定されていることが判るが、これだけではアプリケーションからマルチキャスト通信を行うことができない場合があるので、注意が必要。

2007/05/24

XenのDomUでNTPを使う

XenのDomUでntpdやntpdateを実行すると、時刻同期できないことがある。これは、XenがDom0からのみ時刻を更新できるというXenの仕様による。Dom0で時刻を合わせていれば、DomUも正確な時刻を得ることができるので、通常は問題にならない。しかし、Dom0とDomU、もしくはDomUとDomUで違う時刻源に同期しなければならない場合や、ntpdの動作をXenを使って検証する場合などでは問題になる。
この動作は、カーネルパラメータxen.independent_wallclockにより制御できる。通常、このパラメータの値は0だが、これを1にすればDomUで独自にntpdを正常に実行できる。実行途中ならば、
# sysctl xen.independent_wallclock=1
もしくは、
# echo 1 >/proc/sys/xen/independent_wallclock
のいずれかを実行する。起動時から動作を変更するなら、/etc/sysctl.confに以下の行を追加する。
# For ntpd on Xen DomU.
xen.independent_wallclock = 1
参考:

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・仮想ブリッジが多い場合

CentOS 5でXenを使ってみる

CentOS 5でXenを使ってみる。今まで使っていたFC5(Fedora Core 5)と比べると、前回書いた通り、CentOS5では、PAE対応のkernel-xenのみが準備されている点が違うので注意して欲しい(インストール時に仮想化パッケージを選択していれば、kernel-xenがインストールされているはず)。以下の手順は、RHEL5でも同様のはずだ(未確認)

DomUのインストールに関しては、FC5ではCUIのxenguest-install.pyで行ったが、CentOS5では、GUIの管理ツールvirt-manager(正確には、/usr/bin/virt-manager)から行うのが普通だ。ユーザrootでシェルからコマンドを入力するか、デスクトップのメニューから選択(Gnomeデスクトップからだと、[アプリケーション]->[システムツール]->[Virtual Machine Manager])すると、次のような画面が表示される(一般ユーザで実行すると、先にrootパスワードの入力を促す画面が表示される)


通常はローカルのXenホストに接続するので、このまま[Connect]ボタンを押下する。


仮想マシンの設定および状態が表示されている。
ここで、ウィンドウ下部の[New]ボタンを押下すると、仮想マシンのインストールが開始される。


この後の手順で、
  • 仮想マシン名
  • 仮想化方式(完全仮想化fully virtualizationか準仮想化para-virtualization)
  • OSインストールメディアの位置
  • ディスクイメージの場所
  • 割り当てるメモリおよびCPU
が必要だと表示されている。
[Forward]ボタンを押下すると、仮想マシン名を入力する画面が表示される。


仮想マシン名を入力する。ここでは、vm1centos5を入力した。なお、ここで指定した名前で、/etc/xen以下に設定ファイル(上の例では/etc/xen/vm1centos5)が作られる。
続いて[Forward]を押下すると、仮想化方式を選択する画面が表示される。


上の例では、準仮想化(para-virtualization)しか選択できなくなっているが、これは完全仮想化(fully virtualization)に対応しているCPUではないためだ。
方式を選択したら[Forward]を押下し、インストールメディアの位置を指定する画面に移る。


この例では、ローカルのレポジトリを指定している(作り方は、ローカルミラーレポジトリシリーズ参照)。これは、手元にPXEインストールする環境が準備されているような場合に可能だ(PXE環境の作り方は、@ITの記事参照)。
[Forward]押下、ディスクイメージの場所およびサイズを指定する画面に遷移する。


位置には、ディスクパーティション(ディスクデバイス)か単純なファイルのいずれかを指定する。上の例では、単純なファイル/var/lib/xen/images/vm1centos5.imgでサイズは3100MB、仮想ディスク全体をすぐに割り当てるよう指定した。
なお、CentOS5ではFC5と違い、Dom0でSELinuxを有効にすることができるが、この関係で、ディスクイメージは、/var/lib/xen/images以下に置く必要があるようだ。

2007/11/7追記:
単純なファイルではなく、ディスクパーティションを使用する場合、直接物理ディスクや物理ディスクパーティションではなく、LVMのボリュームを割り当てた方がよい。『XenとLVM・その1・インストール時』を参照のこと。

[Forward]ボタンを押し、メモリとCPUを割り当てる画面に移動する。


メモリは、スタートアップ時の値と最大値を指定できる。VCPUの数は、実ハードウェアの制限を越えることはできない。
[Forward]を押下すると、インストール前の確認画面が表示される。


表示された情報で間違いなければ、[Finish]ボタンを押す。


DomUに割り当てるディスクを準備している。割り当てたディスクサイズに応じて多少時間がかかる。
この後、仮想サーバのコンソール画面が開く。後は通常のインストールと同じだ。コンソール画面はVNCなので、GUIによるインストールも可能だ。


なお、コンソール画面にマウスポインタが入ると、コンソールが面から外へマウスカーソルを出すことができなくなることがある。その時は、[Alt]+[Ctrl]で抜け出すことができる。


インストールが無事に終了すると、仮想マシンが動いていることを確認する。

2007/05/08

FC5のDom0上で、CentOS5のDomUを動かす

タイトルの通り、FC5で動いているDom0上で、CentOS5のDomUを動かす方法。CentOSは、Red Hat Enterprise Linux互換なので、おそらくRHEL5でも同様だと思う(試してないが)。
#CentOS5のDom0上でCentOS5のDomUを動かす方法は『CentOS 5でXenを使ってみる』を参照。

結論を言うと、FC5/Dom0の方に、パッケージkernel-xen0ではなく、kernel-xenをインストールすればよい。FC5のkernel-xen0は、PAE(Physical Address Extension: 4GB以上の物理メモリにアクセスできる技術)に対応していないが、CentOS5のDomUのカーネル(こちらもパッケージ名はkernel-xen)はPAEに対応している。Dom0とDomUのPAE対応に齟齬があるとDomUが立ち上がらない。

なお、2007.5.8(火)現在、FC5のkernel-xen最新版は2.6.20-1.2316だが、どうも2.6.20系はバグが多いらしく、安定動作しないようだ。手元の環境では、2.6.19-1.2288.2.4を使用した。

なお、Dom0をPAE対応に変更すると、それまで動いていたPAE非対応のDomUが動作しなくなる。FC5/DomUであれば、kernel-xenUで動作しているものがそれに当たる。この問題を回避するには、このDomUにPAE対応のカーネルをインストールすればよいが、注意を要する点がある。
例えばFC5では、kernel-xenUは、仮想ディスクのドライバがカーネル本体に組み込まれていた。一方、kernel-xenでは明示的にこれをドライバモジュールとしてロードする必要がある。ロードしなければディスクにアクセスできないため、DomUが立ち上がらない。次のように作業すればよい。
  1. PAE非対応のDom0(FC5ならkernel-xen0)上でPAE非対応のDomU(FC5ならkernel-xenU)を起動し、DomUの/etc/modprobe.confに以下の行を追加する。
    alias scsi_hostadapter xenblk
  2. PEA対応のカーネルをインストールする(FC5ならkernel-xen)。
    # yum install kernel-xen
  3. DomUを停止。
    # shutdown -h now
    (もしくは、Dom0上で`xm shutdown マシン名')
  4. PAE対応のDom0(FC5ならkernel-xen)上で
    # xm create マシン名
    を実行し、DomUを起動。


なお、今後、パッケージを更新した場合にkernel-xen[0U]でなくkernel-xenがデフォルトで起動されるようにするために、/etc/sysconfig/kernelを編集した方がよいだろう。このファイル中で、
# DEFAULTKERNEL specifies the default kernel package type
DEFAULTKERNEL=kernel-xenU
となっている部分を
# DEFAULTKERNEL specifies the default kernel package type
DEFAULTKERNEL=kernel-xen
に変更する。

`xm create -c'でコンソールに接続できない

FC5マシンでXenを弄っているときに、
xm create -c マシン名
を実行すると、
Traceback (most recent call last):
File "/usr/bin/pygrub", line 496, in ?
curses.wrapper(run_main)
File "/usr/lib/python2.4/curses/wrapper.py", line 44, in wrapper
return func(stdscr, *args, **kwds)
File "/usr/bin/pygrub", line 452, in run_main
sel = g.run()
File "/usr/bin/pygrub", line 355, in run
self.run_main(timeout)
File "/usr/bin/pygrub", line 378, in run_main
draw()
File "/usr/bin/pygrub", line 363, in draw
self.draw_main_windows()
File "/usr/bin/pygrub", line 156, in draw_main_windows
curses.use_default_colors()
_curses.error: use_default_colors() returned ERR
No handlers could be found for logger "xend"
Error: Boot loader didn't return any data!
の様なエラーメッセージが表示されて、DomUを起動できないことがある。ただし、この場合でも`-c'を付けずに
xm create マシン名
として起動時にXenの仮想コンソールに接続しなければ正常に起動できる。
この問題の解決方法はまだ見つけていないのだが、原因は判った。どうも、ターミナルエミュレーションの不具合のようだ。ターミナルタイプがVT100(環境変数TERM=vt100の場合など)のとき、この不具合が起こる。一方、Dom0のコンソールから`-c'を付けて実行しても不具合は発生しない。なんでやねん。

NTP認証シリーズが滞っている。申し訳ない。

2007/11/6追記:
解決編『`xm create -c'でコンソールに接続できない・解決(?)編』を追加した。