2008/12/16

Libvirt & Xen その2 予備調査: xm

Libvirtの使い方の前にxmコマンドについて調査する。

このコマンドとXenハイパーバイザとの通信については、『White Paper: Basic components of Xen』で解説されている。Xenの標準UIであるxmコマンドは、デーモンxendとXML RPCによって通信を行い、Dom0を通じてXenハイパーバイザを制御する。ここで使われるXML RPCインターフェースは、UNIXソケットで、アクセスにはroot権限が必要だ。

実際に試してみよう。
[root@fs1 ~]# /usr/sbin/xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 3673 2 r----- 28871.0
[root@fs1 ~]#

[user01@fs1 ~]$ /usr/sbin/xm list
ERROR Internal error: Could not obtain handle on privileged command interface (13 = Permission denied)
Error: Most commands need root access. Please try again as root.
[user01@fs1 ~]$
通常ユーザでxmコマンドが失敗するのは、xendと通信する際に使用するUNIXドメインソケット/var/run/xend/xmlrpc.sock(CentOS/RHEL/Fedoraの場合)には、root権限でないと書き込めなからだ。
[root@fs1 ~]# ls -l /var/run/xend/xmlrpc.sock
srwxr-xr-x 1 root root 0 Dec 8 13:39 /var/run/xend/xmlrpc.sock
[root@fs1 ~]#
また、xmコマンドは、このUNIXドメインソケットの他に、/proc/xend以下のファイルも利用する。実は、最初のエラーメッセージ「ERROR Internal error: Could not...」は、/proc/xen/privcmdを開こうとしたときのもので、次のエラーメッセージ「Error: Most commands...」は/var/run/xend/xmlrpc.sockを開こうとしたときのもの。

これは、straceコマンドを利用して、
[user01@fs1 ~]$ strace /usr/sbin/xm list > strace-xm-log.txt 2>&1
[user01@fs1 ~]$
の様に実行することにより、確認できる。

以上、Xenハイパーバイザは、主にデーモンxendの提供するインターフェースを通じて制御する。デーモンxendが提供するインターフェースは、三種類のアプリケーション層(HTTP、XML-RPCおよびXen Management API)、二種のトランスポート層(UNIXドメインソケットおよびTCP)の計六種類が提供されている。設定は、/etc/xen/xend-config.sxpで行う。上で使ったUNIXソケット/var/run/xend/xmlrpc.sockもこのファイルの中で設定さていれる。
TCPを利用したインターフェースは、ネットワーク経由で操作することが可能。しかし、HTTPやXML-RPCは、セキュリティは十分ではない。IPアドレス・ドメイン名ベースのアクセス制御があるのみで、認証や暗号化はサポートされていない。SSHのポートフォワーディングと併用するなど、別途セキュリティを確保する必要がある。

2008/12/09

Libvirt & Xen その1 概要

このシリーズでは、Libvirtを使ったXenの管理について解説する。

Libvirtの利点は二つある。

一点目は、他の仮想化ソリューションへの移行が容易になることだ。
現時点でCentOSおよびRHELでは、仮想化ソリューションとしてXenとKVMをサポートしているが、今後Xenはサポートから外される方針のようだ。Xenユーザにとっては、KVMへの移行が今後の課題となるだろう。
移行時の課題の一つが、管理方法の変更だ。Xenでは通常、xmコマンドを用いて管理する。これはXen専用のコマンドなので、KVMを管理することはできない。
CentOSおよびRHELでは、KVMとXenを統合管理するために、RPMパッケージlibvirt準備されている。Libvirtによる管理に慣れておけば、XenからKVMへの移行に役立つだろう。
Libvirtは、XenとKVMの他に、QEMU、Linux Containers、OpenVZ、UMLをサポートしている。将来的にはVMwareもサポートされる予定だ。

二点目は、セキュリティだ。
リモート管理の場合、Xenのアクセス制御は、IPアドレス・ホスト名ベースのものしかなく、貧弱だ。一方、Libvirtでは、ユーザ名・パスワード認証、Kerberos認証、および、TLS(SSL)による認証(および暗号化)をサポートしている。Iptablesを併用すれば、IPアドレスベースのアクセス制御も可能だ。
ローカルからの管理の場合、XenもlibvirtもUNIXソケットを使うが、Xenでは、rootに対する読み書き権限が与えられ、その他のユーザに関しては、読み取り権限が与えられていて、基本的に変更できない。一方、libvirtでは、任意の1グループを特権グループとして設定することができ、これに対して書き込み権限を与えることもできる。また、PolicyKitを使ったアクセス制御を行うこともできる。

2008/12/16追記:
Xenの新しいバージョンでは、新しい管理API・XenApiが準備されている。『XM and XenAPI developement on Xen Summit April 2007』によると、TLSによる暗号化やPAM認証が使えるらしい。

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/11/02

virt-clone

CentOS 5.2上で仮想化パッケージ(@virtualization)をインストールすると、virt-cloneコマンドがインストールされる。
$ rpm -qf `which virt-clone`
python-virtinst-0.300.2-8.el5
$
このコマンドは、Xen DomUを複製するのに使用する。
$ virt-clone --help
usage: virt-clone [options]

options:
-h, --help show this help message and exit
-o ORIGINAL_GUEST, --original=ORIGINAL_GUEST
オリジナルゲストの名前か uuid:
状態は停止でなければなりません
-n NEW_NAME, --name=NEW_NAME
新しいゲストの名前
-u NEW_UUID, --uuid=NEW_UUID
クローンゲストの新しい uuid:
省略値はランダムに生成された UUID です
-m NEW_MAC, --mac=NEW_MAC
クローンゲスト用の固定 MAC アドレス。・
略値はランダムに生成されます
-f NEW_DISKFILE, --file=NEW_DISKFILE
ディスクイメージとして使用される、新
ゲスト用の新ファイル
--connect=CONNECT URI でハイパーバイザーに接続
--force-copy=TARGET 装置のコピーを強制する (例えば 'hdc'
が読込みのみの cdrom 装置なら、--force-
copy=hdc)
--nonsparse クローニングのディスクイメージに疎ら
なファイルを使用しないでください
--preserve-data 新ファイルを新ゲスト用のディスクイメ
ージとして使用するよう保存する
-d, --debug デバッグ情報を印刷
--force Do not prompt for input. Answers yes where applicable,
terminates for all other prompts
$
実際に使ってみよう。まず、元となるDomU dc0がインストールされている。
[root@fs1 xen]# ls /etc/xen/dc*
/etc/xen/dc0
[root@fs1 xen]# cat /etc/xen/dc0
name = "dc0"
uuid = "d9911ef3-1919-9972-fe4c-96c7ece17f7b"
maxmem = 256
memory = 256
vcpus = 1
bootloader = "/usr/bin/pygrub"
on_poweroff = "destroy"
on_reboot = "restart"
on_crash = "restart"
vfb = [ ]
disk = [ "phy:/dev/VolGroupXX/LogVolDc0,xvda,w" ]
vif = [ "mac=00:16:3e:1d:89:00,bridge=br4000" ]
[root@fs1 xen]# ls /dev/VolGroupXX/LogVolDc*
/dev/VolGroupXX/LogVolDc0
[root@fs1 xen]# lvs /dev/VolGroupXX/LogVolDc0
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
LogVolDc0 VolGroupXX -wi-a- 4.00G
[root@fs1 xen]#
これをdc1という名前で複製しよう。イメージを格納する論理ボリューム(logical volume, LV) LogVolDc1をボリュームグループ(volume group, VG) VolGroupXX上に作成する。
[root@fs1 xen]# lvcreate --name=LogVolDc1 --size=4G VolGroupXX
Logical volume "LogVolDc1" created
[root@fs1 xen]#
コマンドvirt-cloneで複製を実行する。
[root@fs1 xen]# virt-clone --original=dc0 --name=dc1 --file=/dev/VolGroupXX/LogVolDc1
Cloning from /dev/VolGroupXX/LogVolDc0 to /dev/VolGroupXX/LogVolDc1
Cloning domain... 100% |=========================| 4.0 GB 03:23
[root@fs1 xen]#
イメージをコピーするため、実行に三分半弱かかっている。
DomU dc1の定義ファイルは以下の様になっている。
[root@fs1 xen]# cat /etc/xen/dc1
name = "dc1"
uuid = "ce08f29d-9006-c607-7891-786ffa421ca7"
maxmem = 256
memory = 256
vcpus = 1
bootloader = "/usr/bin/pygrub"
on_poweroff = "destroy"
on_reboot = "restart"
on_crash = "restart"
vfb = [ ]
disk = [ "phy:/dev/VolGroupXX/LogVolDc1,xvda,w" ]
vif = [ "mac=00:16:3e:1c:2f:6e,bridge=br4000" ]
[root@fs1 xen]#
DomU名の他に、UUIDやMACアドレスが変更されていることが解る。
当然、このDomUを実行することもできる。
[root@fs1 xen]# xm create -c dc1

2008/10/01

IP reachableでない場合のremote copy

リモートマシンのファイルをコピーする場合、ローカルマシンとIP到達性が確保されていれば、普通にscpを使ってコピーすれば問題ない。しかし、IP到達性が確保されていない場合はどうするか?ここでは、base64コマンドを使う方法を紹介する。

IP到達性が確保されていない場合とは例えば、
  • Xen環境でDomUとDom0間がXenコンソールでしか繋がっていない
  • シリアルポートからTTY接続している
などだ。

上の様な場合でも、標準出力はローカルマシンのコンソールに出力されるので、ここからコピーすればよいのだが、単にファイルをcatすると、バイナリファイルは正常にコピーできないし、テキストファイルであっても、端末エミュレータによってはタブが空白に変換されたり、行末の空白が無視されたりする。

これを避けるために、TTYで正常に出力されるキャラクタ集合でエンコードする。その昔は、uuencodeを使ったが、最近のLinuxでは、base64コマンドが使いやすい。
まず、コピー元のマシンで、以下の様にエンコードする。
[root@dc1 ~]# base64 /usr/share/doc/yum-3.2.8/README
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpZdW0gLSBhbiBhdXRvbWF0aWMg
dXBkYXRlciBhbmQgaW5zdGFsbGVyIGZvciBycG0tYmFzZWQgc3lzdGVtcwotLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpJbmNsdWRlZCBwcm9ncmFtczoKL3Vzci9iaW4veXVt
<<略>>
dHRwOi8vbGludXguZHVrZS5lZHUveXVtLwp3aWtpOiBodHRwOi8vd2lraS5saW51eC5kdWtlLmVk
dS9ZdW0K
[root@dc1 ~]#
この出力結果をデコードするには、base64コマンドに-diオプションを付けて実行する。以下の実行例では、ローカルマシン上で実行しているが、実際には、コンソール間でエンコードされたデータをコピー&ペーストする。
[root@dc1 ~]# base64 /usr/share/doc/yum-3.2.8/README | base64 -di
-------------------------------------
Yum - an automatic updater and installer for rpm-based systems
-------------------------------------

Included programs:
/usr/bin/yum Main program
<<略>>
wiki: http://wiki.linux.duke.edu/Yum
[root@dc1 ~]#
なお、base64コマンドが無い場合は、opensslコマンドで代用する。
[root@dc1 ~]# openssl base64 < /usr/share/doc/yum-3.2.8/README | openssl base64 -d
-------------------------------------
Yum - an automatic updater and installer for rpm-based systems
<<略>>

2008/09/17

Quota・その3・運用

実際にユーザuser01で、制限がどう働くか見てみよう。
まず、quotaの状況を確認する。
[user01@dc1 ~]$ quota
Disk quotas for user user01 (uid 500):
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/VolGroup00-LogVol00
76   46080   51200              10       0       0
[user01@dc1 ~]$
この時点では、どの制限にも達していない。
ファイルサイズ45MBのファイルを作成する。
[user01@dc1 ~]$ head --bytes=`expr 45 \* 1024 \* 1024` /dev/zero > 45M.dat
dm-0: warning, user block quota exceeded.
[user01@dc1 ~]$
ファイルは作成されたが、ソフトリミットに達した旨警告された。状況を確認する。
[user01@dc1 ~]$ quota
Disk quotas for user user01 (uid 500):
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/VolGroup00-LogVol00
46212*  46080   51200   7days      11       0       0
[user01@dc1 ~]$
制限に達したため、使用ブロック容量の後に「*」が表示されている。猶予時間(grace time)は、7日間になっている。
この状態では、ファイルを作成できるが、ハードリミットに達するとそれ以上書込めなくなる。ファイルサイズ1MBのファイルを一つづつ作ってみる。
[user01@dc1 ~]$ for (( i=1; $i <= 6; i=`expr $i + 1` )) do command="head --bytes=`expr 1024 \* 1024` /dev/zero > 1M-$i.dat"; echo $command; eval $command; done
head --bytes=1048576 /dev/zero > 1M-1.dat
head --bytes=1048576 /dev/zero > 1M-2.dat
head --bytes=1048576 /dev/zero > 1M-3.dat
head --bytes=1048576 /dev/zero > 1M-4.dat
head --bytes=1048576 /dev/zero > 1M-5.dat
dm-0: write failed, user block limit reached.
head: write error: Disk quota exceeded
head: write error
head --bytes=1048576 /dev/zero > 1M-6.dat
-bash: 1M-6.dat: Disk quota exceeded
[user01@dc1 ~]$
五番目のファイルでハードリミットに達し、途中で書込めなくなった。六番目のファイルは、作成する前に失敗している。確認してみよう。
[user01@dc1 ~]$ ls -l
total 51124
-rw-r--r-- 1 user01 users  1048576 Sep 17 00:32 1M-1.dat
-rw-r--r-- 1 user01 users  1048576 Sep 17 00:32 1M-2.dat
-rw-r--r-- 1 user01 users  1048576 Sep 17 00:32 1M-3.dat
-rw-r--r-- 1 user01 users  1048576 Sep 17 00:32 1M-4.dat
-rw-r--r-- 1 user01 users   872448 Sep 17 00:32 1M-5.dat
-rw-r--r-- 1 user01 users 47185920 Sep 17 00:32 45M.dat
[user01@dc1 ~]$ quota
Disk quotas for user user01 (uid 500):
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/VolGroup00-LogVol00
51200*  46080   51200              16       0       0
[user01@dc1 ~]$
ハードリミットに達したため、猶予時間が表示されなくなった事に注意。この状態では、空ファイルすら作れない。
[user01@dc1 ~]$ touch a
touch: cannot touch `a': Disk quota exceeded
[user01@dc1 ~]$
ファイルを削除し、ハードリミットを下回れば、再びファイルを作成可能になる。
[user01@dc1 ~]$ rm 1M-5.dat
[user01@dc1 ~]$ touch a
[user01@dc1 ~]$


この状態を、管理者側で確認してみよう。
[root@dc1 ~]# repquota -a
*** Report for user quotas on device /dev/mapper/VolGroup00-LogVol00
Block grace time: 7days; Inode grace time: 7days
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      -- 1571120       0       0          59255     0     0
daemon    --      20       0       0              3     0     0
lp        --      16       0       0              2     0     0
smmsp     --      16       0       0              2     0     0
avahi     --       8       0       0              1     0     0
apache    --      24       0       0              3     0     0
ntp       --      16       0       0              2     0     0
rpc       --       4       0       0              1     0     0
rpcuser   --       8       0       0              1     0     0
luci      --  263348       0       0          20552     0     0
dovecot   --       8       0       0              1     0     0
webalizer --      32       0       0              4     0     0
piranha   --      16       0       0              3     0     0
rpm       --   24324       0       0             75     0     0
ricci     --      60       0       0              8     0     0
user01    +-   50352   46080   51200  6days      17     0     0
user02    --      76   46080   51200             10     0     0
user03    --      76   46080   51200             10     0     0


[root@dc1 ~]#
ユーザuser01の猶予時間が6日間と表示されている。
管理者は各ユーザの猶予時間を変更することができる。5分(300秒)に変更してみよう。
[root@dc1 ~]# setquota -T user01 300 unset -a
[root@dc1 ~]# repquota -a
*** Report for user quotas on device /dev/mapper/VolGroup00-LogVol00
Block grace time: 7days; Inode grace time: 7days
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      -- 1571120       0       0          59255     0     0
daemon    --      20       0       0              3     0     0
lp        --      16       0       0              2     0     0
smmsp     --      16       0       0              2     0     0
avahi     --       8       0       0              1     0     0
apache    --      24       0       0              3     0     0
ntp       --      16       0       0              2     0     0
rpc       --       4       0       0              1     0     0
rpcuser   --       8       0       0              1     0     0
luci      --  263348       0       0          20552     0     0
dovecot   --       8       0       0              1     0     0
webalizer --      32       0       0              4     0     0
piranha   --      16       0       0              3     0     0
rpm       --   24324       0       0             75     0     0
ricci     --      60       0       0              8     0     0
user01    +-   50352   46080   51200  00:05      17     0     0
user02    --      76   46080   51200             10     0     0
user03    --      76   46080   51200             10     0     0


[root@dc1 ~]#


ユーザuser01で、動作を確認してみる。設定直後。
[user01@dc1 ~]$ quota
Disk quotas for user user01 (uid 500):
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/VolGroup00-LogVol00
50352*  46080   51200   00:05      17       0       0
[user01@dc1 ~]$
ソフトリミットに達しているが、猶予時間がある。この状態では、まだファイルを作成することができる。
五分後。
[user01@dc1 ~]$ quota
Disk quotas for user user01 (uid 500):
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/VolGroup00-LogVol00
50352*  46080   51200    none      17       0       0
[user01@dc1 ~]$
猶予時間がnoneになっている。この状態では、空ファイルも作成できない。
[user01@dc1 ~]$ touch b
dm-0: write failed, user block quota exceeded too long.
touch: cannot touch `b': Disk quota exceeded
[user01@dc1 ~]$
この制限は、ソフトリミットを下回るまで解除されない。
[user01@dc1 ~]$ rm 1M-*
[user01@dc1 ~]$ quota
Disk quotas for user user01 (uid 500):
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/VolGroup00-LogVol00
46224*  46080   51200    none      13       0       0
[user01@dc1 ~]$ touch b
dm-0: write failed, user block quota exceeded too long.
touch: cannot touch `b': Disk quota exceeded
[user01@dc1 ~]$ rm 45M.dat
[user01@dc1 ~]$ touch b
[user01@dc1 ~]$ quota
Disk quotas for user user01 (uid 500):
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/VolGroup00-LogVol00
92   46080   51200              13       0       0
[user01@dc1 ~]$

その1・ファイルシステム毎の設定』『その2・ユーザ毎の設定』『その3・運用

Quota・その2・ユーザ毎の設定

一般ユーザuser0[123]を作成し、容量制限を設定する。
[root@dc1 ~]# useradd -g users -m user01
[root@dc1 ~]# useradd -g users -m user02
[root@dc1 ~]# useradd -g users -m user03
[root@dc1 ~]#
当然、この時点ではこれらのユーザにも容量制限は働いていない。
[root@dc1 ~]# repquota -a
*** Report for user quotas on device /dev/mapper/VolGroup00-LogVol00
Block grace time: 7days; Inode grace time: 7days
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      -- 1571120       0       0          59255     0     0
daemon    --      20       0       0              3     0     0
lp        --      16       0       0              2     0     0
smmsp     --      16       0       0              2     0     0
avahi     --       8       0       0              1     0     0
apache    --      24       0       0              3     0     0
ntp       --      16       0       0              2     0     0
rpc       --       4       0       0              1     0     0
rpcuser   --       8       0       0              1     0     0
luci      --  263348       0       0          20552     0     0
dovecot   --       8       0       0              1     0     0
webalizer --      32       0       0              4     0     0
piranha   --      16       0       0              3     0     0
rpm       --   24324       0       0             75     0     0
ricci     --      60       0       0              8     0     0
user01    --      76       0       0             10     0     0
user02    --      76       0       0             10     0     0
user03    --      76       0       0             10     0     0


[root@dc1 ~]#
これらのユーザに対して、前の記事冒頭で述べた容量制限を設定する。まず、user01に対して設定を行う。この作業は、edquotaコマンドでも実行可能だが、非対話的に実行するため、setquotaコマンドを使用する。最初に作成した一般ユーザuser01のUID番号は、500であることに注意。
[root@dc1 ~]# setquota 500 46080 51200 0 0 /
[root@dc1 ~]# repquota -a
*** Report for user quotas on device /dev/mapper/VolGroup00-LogVol00
Block grace time: 7days; Inode grace time: 7days
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      -- 1571120       0       0          59255     0     0
daemon    --      20       0       0              3     0     0
lp        --      16       0       0              2     0     0
smmsp     --      16       0       0              2     0     0
avahi     --       8       0       0              1     0     0
apache    --      24       0       0              3     0     0
ntp       --      16       0       0              2     0     0
rpc       --       4       0       0              1     0     0
rpcuser   --       8       0       0              1     0     0
luci      --  263348       0       0          20552     0     0
dovecot   --       8       0       0              1     0     0
webalizer --      32       0       0              4     0     0
piranha   --      16       0       0              3     0     0
rpm       --   24324       0       0             75     0     0
ricci     --      60       0       0              8     0     0
user01    --      76   46080   51200             10     0     0
user02    --      76       0       0             10     0     0
user03    --      76       0       0             10     0     0


[root@dc1 ~]#
ユーザuser01の設定を他のユーザuser0[23](UID番号50[12])にコピーする。設定のコピーには、edquotaを使う。非対話的に実行される。
[root@dc1 ~]# for (( uid=501; $uid <= 502; uid=`expr $uid + 1` )) do command="edquota -p 500 $uid"; echo $command; eval $command; done
edquota -p 500 501
edquota -p 500 502
[root@dc1 ~]# repquota -a
*** Report for user quotas on device /dev/mapper/VolGroup00-LogVol00
Block grace time: 7days; Inode grace time: 7days
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      -- 1571120       0       0          59255     0     0
daemon    --      20       0       0              3     0     0
lp        --      16       0       0              2     0     0
smmsp     --      16       0       0              2     0     0
avahi     --       8       0       0              1     0     0
apache    --      24       0       0              3     0     0
ntp       --      16       0       0              2     0     0
rpc       --       4       0       0              1     0     0
rpcuser   --       8       0       0              1     0     0
luci      --  263348       0       0          20552     0     0
dovecot   --       8       0       0              1     0     0
webalizer --      32       0       0              4     0     0
piranha   --      16       0       0              3     0     0
rpm       --   24324       0       0             75     0     0
ricci     --      60       0       0              8     0     0
user01    --      76   46080   51200             10     0     0
user02    --      76   46080   51200             10     0     0
user03    --      76   46080   51200             10     0     0


[root@dc1 ~]#
なお、setquotaおよびedquotaコマンドで、ユーザを指定するのに名前で指定することもできるが、ここではUID番号で指定した。これには次のような理由がある。名前指定の場合、先にユーザが登録されている必要がある。一方、UID番号指定の場合には、その制約は無い。将来登録されるユーザに対して容量制限を行いたい場合、ユーザ登録に先立って、それらのユーザが登録されるUID番号の範囲に対して、UID番号指定で容量制限を設定することができる。一方、名前指定ではこれは不可能だ。


その1・ファイルシステム毎の設定』『その2・ユーザ毎の設定』『その3・運用

Quota・その1・ファイルシステム毎の設定

今までquota・ディスク容量制限というものをやったことが無かったのだが、必要に迫られ、やってみた。

CentOS機dc1上で、ユーザuser0[123]を作成し、これらにそれぞれ、45MBのソフトリミット、50MBのハードリミットを設定する。RHELでも同様に作業できる。大まかな流れは以下の通り。
  1. ファイルシステム毎の設定
  2. ユーザ毎の設定
  3. 運用

まず、容量制限を設定するファイルシステムに対して、quotaが動くよう設定する。インストール時に特に指定しなければ、LVMを使って以下の様に設定されている。
[root@dc1 ~]# cat /etc/fstab
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
[root@dc1 ~]#
ユーザが自由に書込みできるのは、ユーザのホームディレクトリ/home/user[123]以下で、これはルート(/)に含まれている。
# 検索してみると、ルートにquotaを設定することはできない、と書いてあるページもあるが、これは誤りだ。

ルートのエントリを以下の通り編集する。
[root@dc1 ~]# cp -p /etc/fstab /etc/fstab.orig
[root@dc1 ~]# awk '{if ($2=="/" ) gsub(/defaults/,"defaults,usrquota,grpquota"); print $0 }' < /etc/fstab.orig > /etc/fstab
[root@dc1 ~]# cat /etc/fstab
/dev/VolGroup00/LogVol00 /                       ext3    defaults,usrquota,grpquota        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
[root@dc1 ~]#
ユーザ単位の制限のみ必要で、グループ単位の制限が不要の場合は、「,grpquota」は無くてもよい。

編集し終わったら、対象となるファイルシステムを再マウントする(unmount→mount)すればよい。しかし、ルートの場合は再起動するしかない。
[root@dc1 ~]# shutdown -r now


再起動後、シングルユーザモードに移行し、quotacheckコマンドを実行する。
シングルユーザモードで実行するのは、以下の理由による。デフォルトでは、quotacheckは、対象ファイルシステムをread-onlyモードで再マウントしようとするが、ルートの場合はこれが失敗する。オプション「-m」を指定すれば、この動作を行わないが、quotacheckコマンド実行中に対象ファイルシステムで書込みが発生すると、使用量に誤差がでてしまう。シングルユーザモードにすれば、書込みは最低限となる。
シングルユーザモードに移行する。
[root@dc1 ~]# telinit 1
INIT: Switching to runlevel: 1
INIT: Sending processes the TERM signal
Shutting down Cluster Module - cluster monitor: [  OK  ]
Shutting down ricci: [  OK  ]
<<略>>

Telling INIT to go to single user mode.
INIT: Going single user
INIT: Sending processes the TERM signal
INIT: Sending processes the KILL signal
sh-3.2#
この時点では、quotaファイルaquota.{user,group}は存在していない。
sh-3.2# ls -l /
total 146
drwxr-xr-x  2 root root  4096 Aug 20 01:54 bin
drwxr-xr-x  4 root root  1024 Aug 19 19:55 boot
drwxr-xr-x 10 root root  2840 Sep 17 00:28 dev
drwxr-xr-x 86 root root 12288 Sep 17 00:28 etc
drwxr-xr-x  2 root root  4096 Mar 30  2007 home
drwxr-xr-x 14 root root  4096 Aug 20 01:54 lib
drwx------  2 root root 16384 Aug 19 19:49 lost+found
<<略>>
drwxrwxrwt  3 root root  4096 Sep 17 00:27 tmp
drwxr-xr-x 14 root root  4096 Aug 19 19:52 usr
drwxr-xr-x 23 root root  4096 Aug 19 20:01 var
sh-3.2#
コマンドquotacheckを実行する。
sh-3.2# quotacheck -cugfma
グループ単位の制限が不要の場合は、「-g」オプションは不要。実行完了までしばらく時間がかかる。
実行後は、quotaファイルが作成されている。
sh-3.2# ls -l /
total 170
-rw-------  1 root root  7168 Sep 17 00:28 aquota.group
-rw-------  1 root root  6144 Sep 17 00:28 aquota.user
drwxr-xr-x  2 root root  4096 Aug 20 01:54 bin
drwxr-xr-x  4 root root  1024 Aug 19 19:55 boot
drwxr-xr-x 10 root root  2840 Sep 17 00:28 dev
drwxr-xr-x 86 root root 12288 Sep 17 00:28 etc
drwxr-xr-x  2 root root  4096 Mar 30  2007 home
drwxr-xr-x 14 root root  4096 Aug 20 01:54 lib
drwx------  2 root root 16384 Aug 19 19:49 lost+found
<<略>>
drwxrwxrwt  3 root root  4096 Sep 17 00:27 tmp
drwxr-xr-x 14 root root  4096 Aug 19 19:52 usr
drwxr-xr-x 23 root root  4096 Aug 19 20:01 var
sh-3.2#
次に、対象ファイルシステムを再マウントするが、ルートの場合は再起動するしかない。
sh-3.2# shutdown -r now


再起動後、対象ファイルシステムに対してquotaが実行されているかどうかを確認する。
[root@dc1 ~]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw,usrquota,grpquota)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/xvda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
[root@dc1 ~]# repquota -a
*** Report for user quotas on device /dev/mapper/VolGroup00-LogVol00
Block grace time: 7days; Inode grace time: 7days
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      -- 1570628       0       0          59255     0     0
daemon    --      20       0       0              3     0     0
lp        --      16       0       0              2     0     0
smmsp     --      16       0       0              2     0     0
avahi     --       8       0       0              1     0     0
apache    --      24       0       0              3     0     0
ntp       --      16       0       0              2     0     0
rpc       --       4       0       0              1     0     0
rpcuser   --       8       0       0              1     0     0
luci      --  263348       0       0          20552     0     0
dovecot   --       8       0       0              1     0     0
webalizer --      32       0       0              4     0     0
piranha   --      16       0       0              3     0     0
rpm       --   24324       0       0             75     0     0
ricci     --      60       0       0              8     0     0


[root@dc1 ~]#
この段階では、どのユーザに対しても制限が設定されていない。


その1・ファイルシステム毎の設定』『その2・ユーザ毎の設定』『その3・運用

2008/07/25

Xen DomU上でDRBDを使う・その6・ベンチマーク

DRBDデバイス/dev/drbd0に直接書込み、速度を測定する。
[root@dc2 ~]# dd bs=64M if=/dev/zero of=/dev/drbd0
dd: writing `/dev/drbd0': No space left on device
64+0 records in
63+0 records out
4294799360 bytes (4.3 GB) copied, 227.723 seconds, 18.9 MB/s
[root@dc2 ~]#
このとき、もう一方のノードdc3の/var/log/messagesには、次のようなメッセージが記録される。この原因は不明。
Jul 24 22:32:08 dc3 kernel: drbd0: local disk flush failed with status -95


この結果を、『その2・DRBD設定前の確認』のときの結果と比較してみよう。DRBDを経由せず、直接/dev/xvdbに書込んだ場合が39.9Mbyte/秒、DRBD経由で/dev/drbd0に書込んだ場合が18.8Mbyte/秒。
/dev/drbd0に書込む場合、/dev/xvdbに書込む場合に比べて、ディスクへの書込みが二倍以上発生する。なぜなら、/dev/drbd0に書込むということは、dc2上の/dev/xvdbとdc3上の/dev/xvdbの両方にデータ書込んだ上で、メタデータも書込むからだ。これらの書込みは結局、Dom0上の同一ディスクへの書込みとなるため直列化され、倍以上の時間が掛かっていると考えられる。

この結果より、/etc/drbd.confで設定した「rate 5M」は、初期同期の場合には効いているが、通常のディスクアクセス時には効いていない事も解る。


その0・概要』『その1・Xen環境の準備』『その2・DRBD設定前の確認』『その3・drbd.confの設定』『その4・DRBDの初期化』『その5・初期同期』『その6・ベンチマーク

Xen DomU上でDRBDを使う・その5・初期同期

両ノードdc[23]で設定およびDRBDリソースの初期化を行った時点では、ディスクの同期が取れていない不一致(Inconsistent)状態にある。これを解消するため、『The initial device synchronization』に従い、初期同期を行う。
初期同期コマンドは、dc[23]のどちらか一方からのみ実行すればよい。もし、有効なデータがどちらかにのみ入っている場合は、そのノードで実行する。そうでない場合は、どちらで実行してもよい。
[root@dc3 ~]# drbdadm -- --overwrite-data-of-peer primary r0
drbd0: Forced to consider local data as UpToDate!
[root@dc3 ~]#
しばらく待って/proc/drbdを確認する。
[root@dc3 ~]# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-i386-bui
ld, 2008-06-26 16:40:54
0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r---
ns:8976 nr:0 dw:0 dr:8976 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 oos:4185164
[>....................] sync'ed:  0.3% (4185164/4194140)K
finish: 4:04:08 speed: 244 (240) K/sec
[root@dc3 ~]#
同期速度が、直近244Kbyte/秒、平均240Kbyte/秒しか出ていない(しつこいようだが、Mbpsではないことに注意)。「rate 5M」と設定したので、5Mbyte/秒出るはずだが、どうもデフォルト値の250Kbyte/秒(『Appendix A. DRBD system manual pages』参照)が適用されているようだ。
これを回避するために、設定を再読み込みさせる。
[root@dc3 ~]# drbdadm adjust r0
[root@dc3 ~]# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-i386-bui
ld, 2008-06-26 16:40:54
0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r---
ns:86320 nr:0 dw:0 dr:86320 al:0 bm:5 lo:60 pe:68 ua:60 ap:0 oos:4108092
[>....................] sync'ed:  2.2% (4108092/4194140)K
finish: 0:12:43 speed: 5,344 (1,244) K/sec
[root@dc3 ~]#
設定の通り、5Mbyte/秒に近い数字が出ている。これは、dc2側でも実行する。
しばらくすると同期が完了する。ログ/var/log/messagesを確認する。
Jul 24 22:14:33 dc2 kernel: drbd0: peer( Secondary -> Primary ) pdsk( Inconsistent -> UpToDate )
Jul 24 22:14:33 dc2 kernel: drbd0: Writing meta data super block now.
Jul 24 22:14:33 dc2 kernel: drbd0: Becoming sync target due to disk states.
Jul 24 22:14:33 dc2 kernel: drbd0: Writing the whole bitmap, full sync required after drbd_sync_handshake.
Jul 24 22:14:33 dc2 kernel: drbd0: Writing meta data super block now.
Jul 24 22:14:33 dc2 kernel: drbd0: writing of bitmap took 0 jiffies
Jul 24 22:14:33 dc2 kernel: drbd0: 4096 MB (1048535 bits) marked out-of-sync by on disk bit-map.
Jul 24 22:14:33 dc2 kernel: drbd0: Writing meta data super block now.
Jul 24 22:14:33 dc2 kernel: drbd0: conn( Connected -> WFBitMapT )
Jul 24 22:14:33 dc2 kernel: drbd0: conn( WFBitMapT -> WFSyncUUID )
Jul 24 22:14:33 dc2 kernel: drbd0: helper command: /sbin/drbdadm before-resync-target
Jul 24 22:14:33 dc2 kernel: drbd0: conn( WFSyncUUID -> SyncTarget )
Jul 24 22:14:33 dc2 kernel: drbd0: Began resync as SyncTarget (will sync 4194140 KB [1048535 bits set]).
Jul 24 22:14:33 dc2 kernel: drbd0: Writing meta data super block now.
Jul 24 22:16:09 dc2 kernel: drbd0: Writing meta data super block now.
Jul 24 22:29:06 dc2 kernel: drbd0: Resync done (total 872 sec; paused 0 sec; 4808 K/sec)
Jul 24 22:29:06 dc2 kernel: drbd0: conn( SyncTarget -> Connected ) disk( Inconsistent -> UpToDate )
Jul 24 22:29:06 dc2 kernel: drbd0: helper command: /sbin/drbdadm after-resync-target
Jul 24 22:29:06 dc2 kernel: drbd0: Writing meta data super block now.
4,194,140KBの同期に14分33秒掛かっている。およそ4.7Mbyte/秒で、ほぼ設定値の通り。
この時点では、dc3がprimaryとなっているが、dual-primaryモードで設定しているので、dc2もprimaryへ切り替える。
[root@dc2 ~]# drbdadm primary r0
[root@dc2 ~]# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-i386-bui
ld, 2008-06-26 16:40:54
0: cs:Connected st:Primary/Primary ds:UpToDate/UpToDate C r---
ns:0 nr:4194140 dw:4194140 dr:0 al:0 bm:256 lo:0 pe:0 ua:0 ap:0 oos:0
[root@dc2 ~]#


その0・概要』『その1・Xen環境の準備』『その2・DRBD設定前の確認』『その3・drbd.confの設定』『その4・DRBDの初期化』『その5・初期同期』『その6・ベンチマーク

Xen DomU上でDRBDを使う・その4・DRBDの初期化

Enabling your resource for the first time』に従ってDRBDリソースr0を初期化する。まず、dc2から作業する。
[root@dc2 ~]# drbdadm create-md r0
v08 Magic number not found
v07 Magic number not found
v07 Magic number not found
v08 Magic number not found
Writing meta data...
initialising activity log
NOT initialized bitmap
New drbd meta data block sucessfully created.
[root@dc2 ~]# drbdadm attach r0
drbd0: No usable activity log found.
drbd0: Barriers not supported on meta data device - disabling
[root@dc2 ~]# drbdadm connect r0
[root@dc2 ~]# 
この時点では、dc3が初期化されていないため、接続が完了しないことを確認する。
[root@dc2 ~]# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-i386-bui
ld, 2008-06-26 16:40:54
0: cs:WFConnection st:Secondary/Unknown ds:Inconsistent/DUnknown C r---
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 oos:4194140
[root@dc2 ~]#
以下のことが判る。
  • 接続状態(cs)が接続待ち(WFConnection)、
  • ロール(st)は、自分自身(dc2)がSecondary、相手(dc3)が不明(Unknown)
  • ディスク状態(ds)は、自分自身(dc2)が不一致、相手(dc3)が不明

続いて、dc3を初期化する。
[root@dc3 ~]# drbdadm create-md r0
v08 Magic number not found
v07 Magic number not found
v07 Magic number not found
v08 Magic number not found
Writing meta data...
initialising activity log
NOT initialized bitmap
New drbd meta data block sucessfully created.
[root@dc3 ~]# drbdadm attach r0
drbd0: No usable activity log found.
drbd0: Barriers not supported on meta data device - disabling
[root@dc3 ~]# drbdadm connect r0
[root@dc3 ~]# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-i386-bui
ld, 2008-06-26 16:40:54
0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r---
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 oos:4194140
[root@dc3 ~]#
この時点では、dc[23]の両方が初期化されているため、通信状態(cs)が確立(Connected)となっている。両ノードともロール(st)がSecondaryで、ディスク状態(ds)が不一致(Inconsistent)となっている。


その0・概要』『その1・Xen環境の準備』『その2・DRBD設定前の確認』『その3・drbd.confの設定』『その4・DRBDの初期化』『その5・初期同期』『その6・ベンチマーク

Xen DomU上でDRBDを使う・その3・drbd.confの設定

各DomU dc[23]上の/etc/drbd.confを以下の通り設定する。
global {
usage-count no;
}
common {
protocol C;
}
resource r0 {
net {
allow-two-primaries;
shared-secret "9wEtE83PFS4xChqY+aT";
}
startup {
become-primary-on both;
}
syncer {
rate 5M;
verify-alg sha1;
}
device    /dev/drbd0;
disk      /dev/xvdb;
meta-disk internal;
on dc2.xencluster {
address   192.168.56.8:7789;
}
on dc3.xencluster {
address   192.168.56.9:7789;
}
}
設定内容は以下の通り。
  • リソースr0を定義。dc[23]からアクセスされる。
  • 両ノードが同時にprimaryになることができる(allow-two-primaries)。
  • ネットワーク接続時の認証のためのパスワードを設定している(shared-secret)。
  • 起動時に、両ノードがprimaryとなる(become-primary-on)。
  • 同期速度は5Mbyte/秒(rate)。単位がMbpsでないことに注意。
  • 両ノードとも、低レベルデバイスは/dev/xvdb(disk)、DRBDデバイスは/dev/drbd0(device)。
  • メタデータ形式はinternal(meta-disk)。つまり、/dev/xvdb内にメタデータを持つ。
  • dc[23]はそれぞれ、192.168.56.[89]の7789/tcpで接続を待つ。

なお、各ノードの設定の共通部分(disk、deviceおよびmeta-disk)をまとめて記述できるのは、DRBD 8.2系から。RPM package drbd82-xenではなくdrbd-xenをインストールしている場合は、これらの設定は、on ノード名節の中でそれぞれ記述する。


その0・概要』『その1・Xen環境の準備』『その2・DRBD設定前の確認』『その3・drbd.confの設定』『その4・DRBDの初期化』『その5・初期同期』『その6・ベンチマーク

Xen DomU上でDRBDを使う・その2・DRBD設定前の確認

各DomU dc[23]上には、OSイメージが格納されている/dev/xvdaの他に、/dev/xvdbが見えている。
[root@dc2 ~]# ls -l /dev/xvd*
brw-r----- 1 root disk 202,  0 Jul 24 21:41 /dev/xvda
brw-r----- 1 root disk 202,  1 Jul 24 21:41 /dev/xvda1
brw-r----- 1 root disk 202,  2 Jul 24 21:41 /dev/xvda2
brw-r----- 1 root disk 202, 16 Jul 24 21:41 /dev/xvdb
[root@dc2 ~]#
OSインストール直後は、DRBDの設定が行われていないため、/proc/drbdにはリソースが何も表示されない。
[root@dc2 ~]# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-i386-bui
ld, 2008-06-26 16:40:54
[root@dc2 ~]#
この状態で、/dev/xvdbに対する書き込み速度を計測する。
[root@dc2 ~]# dd bs=64M if=/dev/zero of=/dev/xvdb
dd: writing `/dev/xvdb': No space left on device
65+0 records in
64+0 records out
4294967296 bytes (4.3 GB) copied, 107.757 seconds, 39.9 MB/s
[root@dc2 ~]#
[root@dc3 ~]# dd bs=64M if=/dev/zero of=/dev/xvdb
dd: writing `/dev/xvdb': No space left on device
65+0 records in
64+0 records out
4294967296 bytes (4.3 GB) copied, 107.6 seconds, 39.9 MB/s
[root@dc3 ~]#
ほぼ40Mbyte/秒の速度が出ている。単位がMbpsではないことに注意。


その0・概要』『その1・Xen環境の準備』『その2・DRBD設定前の確認』『その3・drbd.confの設定』『その4・DRBDの初期化』『その5・初期同期』『その6・ベンチマーク

Xen DomU上でDRBDを使う・その1・Xen環境の準備

Xen環境構築の詳細については、『Red Hat Cluster: CentOS 5.1上でRHCSを使ってみる』を参照。ここでは、DomUのKickstart設定ファイルを紹介する。以下の点に注意して欲しい。
  • RPMパッケージdrbd82およびkmod-drbd82-xenをインストールする。
  • ファイアウォール設定で、DRBDの通信、TCPポート7788~7799を許可する。

logging --host=192.168.55.32 --level=debug

install
url --url http://Repository.LocalDomain/centos/5/os/i386
lang en_US.UTF-8
keyboard jp106
network --device eth0 --bootproto dhcp --hostname=localhost.localdomain
rootpw --iscrypted $1$NG4SU1bL$I8FOJo.81cUrO6Xj4dau41
firewall --enabled --ssh --port=snmp:udp
authconfig --enableshadow --enablemd5
selinux --permissive
timezone Asia/Tokyo
bootloader --location=mbr --driveorder=xvda --append="console=xvc0"

services --enabled=ntpd,oddjobd,snmpd --disabled=acpid,apmd,avahi-daemon,bluetooth,cpuspeed,cups,gpm,hidd,lm_sensors,mdmonitor,microcode_ctl,nfslock,pcscd,smartd,xfs,yum-updatesd

clearpart --all --drives=xvda --initlabel
part /boot --fstype ext3 --size=100 --ondisk=xvda
part pv.2 --size=0 --grow --ondisk=xvda
volgroup VolGroup00 --pesize=32768 pv.2
logvol swap --fstype swap --name=LogVol01 --vgname=VolGroup00 --size=272 --grow --maxsize=544
logvol / --fstype ext3 --name=LogVol00 --vgname=VolGroup00 --size=1024 --grow
repo --name=base --baseurl=http://Repository.LocalDomain/centos/5/os/i386/
repo --name=updates --baseurl=http://Repository.LocalDomain/centos/5/updates/i386/
repo --name=addons --baseurl=http://Repository.LocalDomain/centos/5/addons/i386/
repo --name=extras --baseurl=http://Repository.LocalDomain/centos/5/extras/i386/

reboot

%packages
@admin-tools
@base
@cluster-storage
@clustering
@core
@emacs
@mail-server
@network-server
@ruby
@server-cfg
@system-tools
@text-internet
@web-server
-smartmontools
-OpenIPMI*
-squid
-samba-*
-system-config-samba
lynx
tftp
kernel-xen
kmod-gfs-xen
-kernel
-kmod-gfs
-kmod-gnbd
-NetworkManager
-bluez-utils
device-mapper-multipath
-irda-utils
-pcmciautils
net-snmp-utils
net-snmp-libs
net-snmp
iscsi-initiator-utils
-apmd
-acpid
drbd82
kmod-drbd82-xen
-kmod-drbd82

%post --log=/mnt/sysimage/root/install-post.log
### network
echo 'NOZEROCONF=yes' >> /etc/sysconfig/network

/bin/cp -p /etc/sysconfig/network-scripts/ifcfg-eth0 /tmp/ifcfg-eth0
/bin/sed 's/^HWADDR=/#HWADDR=/' < /tmp/ifcfg-eth0 > /etc/sysconfig/network-scripts/ifcfg-eth0

/bin/egrep -v '^#' /etc/sysconfig/network-scripts/ifcfg-eth0 | /bin/sed 's/eth0/eth1/' > /etc/sysconfig/network-scripts/ifcfg-eth1
/bin/egrep -v '^#' /etc/sysconfig/network-scripts/ifcfg-eth0 | /bin/sed 's/eth0/eth2/' > /etc/sysconfig/network-scripts/ifcfg-eth2
/sbin/restorecon /etc/sysconfig/network-scripts/ifcfg-eth[12]

### logrotate
/bin/cat > /etc/logrotate.d/00local.conf <<EOL
rotate 20
compress
start 100
EOL
/sbin/restorecon /etc/logrotate.d/00local.conf

### yum update from the local repository
/bin/cp -p /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.dist
/bin/sed 's/mirrorlist=/#mirrorlist=/
s/#baseurl=/baseurl=/
s/mirror.centos.org/Repository.LocalDomain/' < /etc/yum.repos.d/CentOS-Base.repo.dist > /etc/yum.repos.d/CentOS-Base.repo

### For Cluster
##### /etc/cluster/fence_xvm.key
/usr/bin/base64 -di > /etc/cluster/fence_xvm.key <<EOL
Atf+JoYSVwnPqBR8vnbG68EaY/Y4sr570YywcWXUcsZD6BwQAMA0x62YIMSlHArX60JzvNeh95x7
<<略>>
EN00EFaiso4dDtVaX2RYJf30RExW4E312yu+XwoXjrES0uLIK33p0HToOXUX3RjsCqYuM7ulE5iD
EOL
/bin/chmod 600 /etc/cluster/fence_xvm.key

##### iptables
/bin/cp -p /etc/sysconfig/iptables /etc/sysconfig/iptables.dist
/bin/cat > /etc/sysconfig/iptables <<EOL
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 7788:7799 -i eth1 -s 192.168.56.0/24 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 7788:7799 -i eth2 -s 192.168.57.0/24 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -s 192.168.55.0/24 -i eth0 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
EOL

### sshd
/bin/cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.dist
/bin/sed 's/^PasswordAuthentication yes/PasswordAuthentication no/' < /etc/ssh/sshd_config.dist > /etc/ssh/sshd_config

/bin/mkdir ~root/.ssh
/bin/chmod 600 ~root/.ssh
/bin/cat > ~root/.ssh/authorized_keys2 <<EOL
ssh-dss AAAA<<略>>
EOL
/bin/chmod 644 ~root/.ssh/authorized_keys2

### Mail
##### /etc/mail/sendmail.cf
/usr/bin/patch /etc/mail/sendmail.mc <<EOL
26c26
< dnl define(\`SMART_HOST', \`smtp.your.provider')dnl
---
> define(\`SMART_HOST', \`SmtpServer.LocalDomain')dnl
EOL
(cd /etc/mail; /usr/bin/make sendmail.cf)

##### /etc/aliases
/usr/bin/patch /etc/aliases <<EOL
96c96
< #root:             marc
---
> root:              root@LocalDomain
EOL
/usr/bin/newaliases

### SNMP
/bin/cat > /etc/snmp/snmpd.conf <<EOL
com2sec localhost localhost           COMMUNITY_STRING
com2sec localnet  192.168.55.0/24    COMMUNITY_STRING

group   gOpLocalhost   v1            localhost
group   gOpLocalhost   v2c           localhost
group   gOpLocalnet    v1            localnet
group   gOpLocalnet    v2c           localnet

view    all           included   .1
view    systemview    included   REDHAT-CLUSTER-MIB:RedHatCluster

access  gOpLocalhost   ""      any       noauth    exact  all    none    all
access  gOpLocalnet    ""      any       noauth    exact  all    none    all

syslocation Unknown
syscontact root@LocalDomain

disk /     100000

load 10

# for cluster
dlmod RedHatCluster     /usr/lib/cluster-snmp/libClusterMonitorSnmp.so
EOL

/bin/cat > /etc/snmp/snmp.conf <<EOL
mibs +REDHAT-MIB:REDHAT-CLUSTER-MIB
EOL

### NTP on Xen DomU
/bin/cat >> /etc/sysctl.conf <<EOL

# For ntpd on Xen DomU.
xen.independent_wallclock = 1
EOL

### cron
/bin/cp -p /etc/crontab /etc/crontab.dist
/bin/sed 's/^\(..\) 4 /\1 5 /' < /etc/crontab.dist > /etc/crontab

### grub
/bin/cp -p /boot/grub/grub.conf /boot/grub/grub.conf.dist
/bin/sed 's/ rhgb quiet//' < /boot/grub/grub.conf.dist > /boot/grub/grub.conf

### /etc/bashrc
/bin/cp -p /etc/bashrc /etc/bashrc.dist
/bin/sed 's/xterm\*)/xterm*|vt100*)/' < /etc/bashrc.dist > /etc/bashrc
この設定を元に、Xen DomU dc0を作成する。
# virt-install --name=dc0 --ram=256 --file=/dev/VolGroupXX/LogVolDc0 --mac='00:16:3e:1d:91:00' --bridge=br4000 --nographics --location='http://Repository.LocalDomain/centos/5/os/i386' --extra-args='ks=http://Repository.LocalDomain/centos/conf/DomU-DRBD-ks.cfg'
DomU dc0のインストールが完了したら、LV(logical volume, 論理ボリューム) /dev/VolGroupXX/LogVolDc0を元にDomU dc[23]用のLVをスナップショットLVとして作成する(『XenとLVM・その3・スナップショットLVの利用』参照)
# lvcreate --snapshot --size=1G --name=LogVolDc2 /dev/VolGroupXX/LogVolDc0
Logical volume "LogVolDc2" created
# lvcreate --snapshot --size=1G --name=LogVolDc3 /dev/VolGroupXX/LogVolDc0
Logical volume "LogVolDc3" created
#
続いて、dc[23]に/dev/xvdbとしてエクスポートするためのLVを作成する。
# lvcreate --size=4G --name=LogVolR0-2 /dev/VolGroupXX
Logical volume "LogVolR0-2" created
# lvcreate --size=4G --name=LogVolR0-3 /dev/VolGroupXX
Logical volume "LogVolR0-3" created
#
DomU dc2の設定ファイル/etc/xen/dc2は以下の通り。
name = "dc2"
uuid = "3cc1d59c-b2b1-42a6-b31a-35be18db188d"
maxmem = 512
memory = 256
vcpus = 1
bootloader = "/usr/bin/pygrub"
on_poweroff = "destroy"
on_reboot = "restart"
on_crash = "restart"
vfb = [  ]
disk = [ "phy:/dev/VolGroupXX/LogVolDc2,xvda,w",
"phy:/dev/VolGroupXX/LogVolR0-2,xvdb,w" ]
vif = [ "mac=00:16:3e:1d:91:02,bridge=br4000",
"mac=00:16:3e:1d:92:02,bridge=br4001",
"mac=00:16:3e:1d:93:02,bridge=br4002" ]
DomU dc2を起動する。
# xm create -c dc2
<<略>>
INIT: version 2.86 booting
Welcome to  CentOS release 5.2 (Final)
Press 'I' to enter interactive startup.
<<略>>
Starting DRBD resources:    no resources defined!
no resources defined!
[ ]no resources defined!
.
no resources defined!
no resources defined!
[  OK  ]
<<略>>

CentOS release 5.2 (Final)
Kernel 2.6.18-92.1.6.el5xen on an i686

dc2.LocalDomain login:
DRBDの設定を行っていないため、その旨警告メッセージが表示されている。DomU dc3についても同様に作業する。


その0・概要』『その1・Xen環境の準備』『その2・DRBD設定前の確認』『その3・drbd.confの設定』『その4・DRBDの初期化』『その5・初期同期』『その6・ベンチマーク

2008/07/23

Xen DomU上でDRBDを使う・その0・概要

DRBDは、ネットワーク越しにディスクのミラーリング(RAID1)を実現するソフトウェア。Xen DomU上でこの動作検証を行う。以下は今回検証環境の概念図。

今回は、『The DRBD User's Guide』の『Chapter 5. Configuring DRBD』を実行・検証する。
CentOSのRPMパッケージには、drbd 8.0系であるdrbdおよびkmod-drbd-xenと、8.2系であるdrbd82およびkmod-drbd82がある。今回は、8.2系を使用する。
検証内容は以下の通り。
  • Xen Dom0 fs1上にDomU dc[23]を作成する。
  • DomU dc[23]に対して、それぞれDom0 fs1上のLV(logical volume, 論理ボリューム) LogVolR0-[23]を/dev/xvdbとして与える。
  • DomU dc[23]上で、/dev/xvdbを低レベルデバイスとするDRBD /dev/drbd0を作成する。
  • /dev/xvdbおよび/dev/xvdbに対する書き込み速度を比較する。
なお、CentOS5では、DRBDはextra扱いであり、実用システムに適用すべきではないかもしれない。


その0・概要』『その1・Xen環境の準備』『その2・DRBD設定前の確認』『その3・drbd.confの設定』『その4・DRBDの初期化』『その5・初期同期』『その6・ベンチマーク

2008/07/21

To Do

Google Codeの中におもしろそうなものを発見→Ganeti

ずっと前から口だけ大将になっているCobbler & Koan。Extra Packages for Enterprise Linux (EPEL)にRPMが準備されているので、簡単なんだけど…

2008/07/15

Ruby on Rails 2.1 on CentOS 5.2・その3・Gemパッケージのインストール

RoRをインストールする。RoRはGemパッケージとして提供されている。インストールには、gemコマンドを使用する。
# gem install rails --include-dependencies
INFO:  `gem install -y` is now default and will be removed
INFO:  use --ignore-dependencies to install only the gems you list
Successfully installed rake-0.8.1
Successfully installed activesupport-2.1.0
Successfully installed activerecord-2.1.0
Successfully installed actionpack-2.1.0
Successfully installed actionmailer-2.1.0
Successfully installed activeresource-2.1.0
Successfully installed rails-2.1.0
7 gems installed
Installing ri documentation for rake-0.8.1...
Installing ri documentation for activesupport-2.1.0...
Installing ri documentation for activerecord-2.1.0...
Installing ri documentation for actionpack-2.1.0...
Installing ri documentation for actionmailer-2.1.0...
Installing ri documentation for activeresource-2.1.0...
Installing RDoc documentation for rake-0.8.1...
Installing RDoc documentation for activesupport-2.1.0...
Installing RDoc documentation for activerecord-2.1.0...
Installing RDoc documentation for actionpack-2.1.0...
Installing RDoc documentation for actionmailer-2.1.0...
Installing RDoc documentation for activeresource-2.1.0...
#
RoR 2.1では、標準のデータベースとして、SQLite3を使用するので、Gemパッケージsqlite3-rubyも併せてインストールした方が良い。
# gem install sqlite3-ruby
Building native extensions.  This could take a while...
Successfully installed sqlite3-ruby-1.2.2
1 gem installed
Installing ri documentation for sqlite3-ruby-1.2.2...
Installing RDoc documentation for sqlite3-ruby-1.2.2...
#
これでインストールは終了のはずなのだが、このままだとRoRが正しく動作しない。例えば、『チュートリアルステップ6』でhttp://RAILS/friends/viewを表示させると、ブラウザにエラー画面が表示される。


次のエラーメッセージが表示されている。
no such file to load -- sqlite3/database
これは、Gemパッケージsqlite3-rubyのパーミッションが間違っているためだ。確認し、修正する。
# cd /usr/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.2.2
# find . -perm 0662
./doc/faq/faq.rb
./ext/sqlite3_api/extconf.rb
./ext/sqlite3_api/sqlite3_api.i
./lib/sqlite3/database.rb
./lib/sqlite3/translator.rb
./test/tc_errors.rb
./test/tc_integration.rb
# ls -l lib/sqlite3/
total 116
-rw-r--r-- 1 root root  1745 Jul 15 17:38 constants.rb
-rw-rw--w- 1 root root 24774 Jul 15 17:38 database.rb
drwxr-xr-x 4 root root  4096 Jul 15 17:38 driver
-rw-r--r-- 1 root root  2307 Jul 15 17:38 errors.rb
-rw-r--r-- 1 root root  7480 Jul 15 17:38 pragmas.rb
-rw-r--r-- 1 root root  4690 Jul 15 17:38 resultset.rb
-rw-r--r-- 1 root root  6843 Jul 15 17:38 statement.rb
-rw-rw--w- 1 root root  3738 Jul 15 17:38 translator.rb
-rw-r--r-- 1 root root  1057 Jul 15 17:38 value.rb
-rw-r--r-- 1 root root   153 Jul 15 17:38 version.rb
# chmod 644 `find . -perm 0662`
#

その0・概要
その1・RubyのRPMパッケージのビルドとインストール
その2・RubyGemsのインストール
その3・Gemパッケージのインストール

Ruby on Rails 2.1 on CentOS 5.2・その2・RubyGemsのインストール

RubyGemsをダウンロードする。
$ mkdir -p Src/Ruby
$ cd Src/Ruby
$ wget http://rubyforge.org/frs/download.php/38646/rubygems-1.2.0.tgz
--23:47:10--  http://rubyforge.org/frs/download.php/38646/rubygems-1.2.0.tgz
Resolving rubyforge.org... 205.234.109.19
Connecting to rubyforge.org|205.234.109.19|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://rubyforge-files.ruby-forum.com/rubygems/rubygems-1.2.0.tgz [following]
--23:47:11--  http://rubyforge-files.ruby-forum.com/rubygems/rubygems-1.2.0.tgz
Resolving rubyforge-files.ruby-forum.com... 88.198.17.227
Connecting to rubyforge-files.ruby-forum.com|88.198.17.227|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 246920 (241K) [application/x-gtar]
Saving to: `rubygems-1.2.0.tgz'

100%[=======================================>] 246,920     75.3K/s   in 3.2s

23:47:15 (75.3 KB/s) - `rubygems-1.2.0.tgz' saved [246920/246920]

$
展開する。
$ tar xvzf rubygems-1.2.0.tgz
rubygems-1.2.0/
rubygems-1.2.0/.document
rubygems-1.2.0/bin/
<<略>>
rubygems-1.2.0/test/test_gem_version_option.rb
rubygems-1.2.0/test/test_kernel.rb
rubygems-1.2.0/TODO
$
インストールする。
# cd /home/kenetsu/Src/Ruby/rubygems-1.2.0
# ruby setup.rb
mkdir -p /usr/lib/ruby/site_ruby/1.8
mkdir -p /usr/bin
install -c -m 0644 rubygems.rb /usr/lib/ruby/site_ruby/1.8/rubygems.rb
<<略>>
RubyGems installed the following executables:
/usr/bin/gem

If `gem` was installed by a previous RubyGems installation, you may need
to remove it by hand.

#

その0・概要
その1・RubyのRPMパッケージのビルドとインストール
その2・RubyGemsのインストール
その3・Gemパッケージのインストール

Ruby on Rails 2.1 on CentOS 5.2・その1・RubyのRPMパッケージのビルドとインストール

Ruby on Rails (RoR)には、Rubyが必要。RoR 2.1の場合、Ruby 1.8.6が推奨バージョン。1.8.[542]でも動くが、1.8.[37]では動かない(『Get Ruby on Rails in no time』)。一方、CentOS 5.2の標準RPMパッケージでは、
$ rpm -q ruby
ruby-1.8.5-5.el5_1.1
$
とある通り、1.8.5。従って、CentOS 5.2標準のままでも、RoR 2.1は動作する。しかし今回は、1.8.6のRPMを準備した。RPMのビルド環境の準備に関しては、『RHL9用のbind-9.2.8.*.rpmを作る』を参照。
$ mkdir -p RPM/BUILD RPM/RPMS/i386 RPM/SOURCES RPM/SRPMS RPM/SPECS
$ echo %_topdir $PWD/RPM > ~/.rpmmacros
$
SRPMパッケージは、Fedora 9のものを使用する。『Fedora Public Active Mirrors』から適切なサイトを選び、最新のSRPMをダウンロードする。
$ cd RPM/SRPMS
$ wget http://ftp.jaist.ac.jp/pub/Linux/Fedora/updates/9/SRPMS/ruby-1.8.6.230-4.fc9.src.rpm
--23:32:32--  http://ftp.jaist.ac.jp/pub/Linux/Fedora/updates/9/SRPMS/ruby-1.8.6.230-4.fc9.src.rpm
Resolving ftp.jaist.ac.jp... 150.65.7.130
Connecting to ftp.jaist.ac.jp|150.65.7.130|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5057508 (4.8M) [application/x-wais-source]
Saving to: `ruby-1.8.6.230-4.fc9.src.rpm'

100%[=======================================>] 5,057,508   81.5K/s   in 59s

23:33:34 (83.6 KB/s) - `ruby-1.8.6.230-4.fc9.src.rpm' saved [5057508/5057508]

$
ビルドする。
$ rpmbuild --rebuild ruby-1.8.6.230-4.fc9.src.rpm
Installing ruby-1.8.6.230-4.fc9.src.rpm
warning: InstallSourcePackage: Header V3 DSA signature: NOKEY, key ID 4f2a6fd2
warning: user mockbuild does not exist - using root
<<略>>
+ cd /home/kenetsu/RPM/BUILD
+ rm -rf ruby-1.8.6.230
+ exit 0
$
できたRPMをインストールする。
# cd /home/kenetsu/RPM/RPMS/i386
# rpm -Uvh *.rpm
Preparing...                ########################################### [100%]
1:ruby-libs              ########################################### [ 10%]
2:ruby                   ########################################### [ 20%]
3:ruby-irb               ########################################### [ 30%]
4:ruby-rdoc              ########################################### [ 40%]
5:ruby-debuginfo         ########################################### [ 50%]
6:ruby-devel             ########################################### [ 60%]
7:ruby-docs              ########################################### [ 70%]
8:ruby-mode              ########################################### [ 80%]
9:ruby-ri                ########################################### [ 90%]
10:ruby-tcltk             ########################################### [100%]
#


その0・概要
その1・RubyのRPMパッケージのビルドとインストール
その2・RubyGemsのインストール
その3・Gemパッケージのインストール

Ruby on Rails 2.1 on CentOS 5.2・その0・概要

CentOS 5.2上でRuby on Rails(RoR) version 2.1を試してみる。このシリーズでは、『Ruby on Rail チュートリアル』が動くことを目標とする。

まずはインストール。次の作業を行う。
  1. RubyのRPMパッケージのビルドとインストール
  2. RubyGemsのインストール
  3. Gemパッケージのインストール
RubyのRPMパッケージについては、必須ではない。CentOS標準のRPMパッケージでもRoRは動くはずだ。
Gemパッケージのインストールでは、『Get Ruby on Rails in no time』にある手順に加え、Gemパッケージsqlite3-rubyをインストールする。ただし、現行バージョンには問題があるため、インストール後に手当てが必要。

以下、それぞれについて解説する。

その0・概要
その1・RubyのRPMパッケージのビルドとインストール
その2・RubyGemsのインストール
その3・Gemパッケージのインストール

2008/07/09

Xen DomUのKickstartインストール時、すべてのパッケージのインストールを指定する方法

CentOSやFecora、Red Hat Enterprise Linux (RHEL)などは、Anaconda Kickstartで自動インストールすることができる。このとき、(ほとんど)すべてのRPMパッケージをインストールしたいとする。非Xenのバニラカーネルなら、%packageセクションで
%packages
@everything
とだけ書けば問題ない。

しかし、Xen DomUの場合はこれではエラーになる。理由は、@everythingのみを指定すると、Xen DomUが必要とするカーネルRPMパッケージ・kernel-xenだけでなく、kernelやkernel-PAEもインストールされ、OS起動時にkernelやkernel-PAEが選択されることがあるからだ。

これを避けるために、%packagesセクションに以下の様に記述する。
%packages
@everything
-kernel
-kernel-PAE
-kmod-gfs
-kmod-gfs-PAE
-kmod-gfs2
-kmod-gfs2-PAE
-kmod-gnbd
-kmod-gnbd-PAE
-libvirt
-xen
-gnome-applet-vm
-libvirt-devel
-libvirt-python
-python-virtinst
-virt-manager
-virt-viewer
Xen DomUをKickstartインストールする方法については、『Red Hat Cluster: CentOS 5.1上でRHCSを使ってみる・その3・DomU dcXのインストール』等を参照。

2008/07/08

CentOS 5.2でanaconda kickstartのバグが修正

CentOS5.2では、CentOS5.1までに存在した、ある不具合が修正された。

例えば、Xen環境では、RPMパッケージkernel-xenをインストールするので、RPMパッケージkernelは不要。そこで、kernelがインストールされないよう、Anaconda Kickstart設定ファイル(『Red Hat Cluster: CentOS 5.1上でRHCSを使ってみる・その4・DomU bs1のインストール』等を参照)の%packagesセクションに
%packages
kernel-xen
-kernel
と書く。しかし、CentOS 5.1では、このように記述しても、kernelがインストールされる。この不具合を回避するため、%postセクションに
%post
yum -y remove kernel
と書く必要があった。

逆に、CentOS 5.2では、Kickstart設定ファイルを上の様に記述すると、別の不具合が発生する。元々RPMパッケージkernelがインストールされないため、代わりにRPMパッケージkernel-xenが削除される。結果として、正常に起動しなくなる。例えば、DomUをインストールすると、インストール後の再起動時に以下の様なメッセージが表示される。
sending termination signals...done
sending kill signals...done
disabling swap...
/dev/mapper/VolGroup00-LogVol01
unmounting filesystems...
/mnt/runtime done
disabling /dev/loop0
/proc done
/dev/pts done
/sys done
/tmp/ramfs done
/selinux done
/mnt/sysimage/boot done
/mnt/sysimage/sys done
/mnt/sysimage/proc done
/mnt/sysimage/selinux done
/mnt/sysimage/dev done
/mnt/sysimage done
rebooting system
Restarting system.

Guest installation complete... restarting guest.
virDomainCreate() failed POST operation failed: (xend.err "Error creating domain: Boot loader didn't return any data!")
Domain installation may not have been
successful. If it was, you can restart your domain
by running 'virsh start dc1'; otherwise, please
restart your installation.
Tue, 08 Jul 2008 11:25:06 ERROR virDomainCreate() failed POST operation failed: (xend.err "Error creating domain: Boot loader didn't return any data!")
Traceback (most recent call last):
File "/usr/sbin/virt-install", line 502, in ?
main()
File "/usr/sbin/virt-install", line 488, in main
dom.create()
File "/usr/lib/python2.4/site-packages/libvirt.py", line 228, in create
if ret == -1: raise libvirtError ('virDomainCreate() failed', dom=self)
libvirtError: virDomainCreate() failed POST operation failed: (xend.err "Error creating domain: Boot loader didn't return any data!")
#

2008/07/07

CentOS 5.1からCentOS 5.2へアップグレードする

CentOS5.1からCentOS5.2へアップグレードを行ってみた。前回の『CentOS 5.0からCentOS 5.1へアップグレードする』もどうぞ。

手順はごく単純。基本的には、CentOS 5.1が動いているマシン上で、yum upgradeコマンドを実行するだけ。
ただし、インターネットへHTTPでの接続性が確保されている必要がある。無理ならば、ローカルミラーリポジトリを作って作業する。『ローカルミラーレポジトリ』参照(最近の流行はcobblerらしいが、まだ試していない)

以下詳細。

まず、更新されるRPMパッケージを確認する。
# yum check-update
Loading "dellsysidplugin" plugin
Loading "installonlyn" plugin
Setting up repositories
fwupdate 100% |=========================| 1.9 kB 00:00
dell-software 100% |=========================| 1.9 kB 00:00
dell-hardware-auto 100% |=========================| 951 B 00:00
base 100% |=========================| 1.1 kB 00:00
updates 100% |=========================| 951 B 00:00
addons 100% |=========================| 951 B 00:00
dell-hardware-main 100% |=========================| 951 B 00:00
extras 100% |=========================| 951 B 00:00
Reading repository metadata in from local files
primary.xml.gz 100% |=========================| 856 kB 00:00
################################################## 2458/2458
primary.xml.gz 100% |=========================| 91 kB 00:00
################################################## 165/165
primary.xml.gz 100% |=========================| 194 B 00:00
primary.xml.gz 100% |=========================| 74 kB 00:00
################################################## 244/244

Deployment_Guide-en-US.noarch 5.2-9.el5.centos base
Deployment_Guide-ja-JP.noarch 5.2-9.el5.centos base
<<略>>
yum.noarch 3.2.8-9.el5.centos.2.1 updates
yum-metadata-parser.i386 1.1.2-2.el5 base
yum-updatesd.noarch 1:0.9-2.el5 base
#
パッケージ一覧が表示されることを確認する。

アップグレードを行う。
# yum -y upgrade
Loading "dellsysidplugin" plugin
Loading "installonlyn" plugin
Setting up Upgrade Process
Setting up repositories
Reading repository metadata in from local files
Resolving Dependencies
--> Populating transaction set with selected packages. Please wait.
---> Downloading header for chkconfig to pack into transaction set.
chkconfig-1.3.30.1-2.i386 100% |=========================| 24 kB 00:00
---> Package chkconfig.i386 0:1.3.30.1-2 set to be updated
---> Downloading header for gnome-screensaver to pack into transaction set.
gnome-screensaver-2.16.1- 100% |=========================| 27 kB 00:00
---> Package gnome-screensaver.i386 0:2.16.1-8.el5 set to be updated
<<略>>
---> Downloading header for crypto-utils to pack into transaction set.
crypto-utils-2.3-2.el5.i3 100% |=========================| 7.8 kB 00:00
---> Package crypto-utils.i386 0:2.3-2.el5 set to be updated
--> Running transaction check
--> Processing Dependency: gtk-vnc-python for package: virt-manager
--> Processing Dependency: gecko-libs = 1.9 for package: yelp
--> Processing Dependency: python-imaging for package: luci
<<略>>
--> Processing Dependency: setroubleshoot-server = 2.0.5-3.el5 for package: setroubleshoot
--> Restarting Dependency Resolution with new changes.
--> Populating transaction set with selected packages. Please wait.
---> Downloading header for device-mapper-event to pack into transaction set.
device-mapper-event-1.02. 100% |=========================| 7.6 kB 00:00
---> Package device-mapper-event.i386 0:1.02.24-1.el5 set to be updated
---> Downloading header for gtk-vnc-python to pack into transaction set.
gtk-vnc-python-0.3.2-3.el 100% |=========================| 2.9 kB 00:00
---> Package gtk-vnc-python.i386 0:0.3.2-3.el5 set to be updated
<<略>>
ヘッダがダウンロードと依存関係が繰り返される。
続けて、パッケージ一覧が表示される。
--> Running transaction check

Dependencies Resolved

=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
dhcpv6-client i386 1.0.10-4.el5_2.2 updates 121 k
replacing dhcpv6_client.i386 0.10-33.el5

kernel-xen i686 2.6.18-92.1.6.el5 updates 15 M
kmod-gfs-xen i686 0.1.23-5.el5 base 138 k
libhugetlbfs i386 1.2-5.el5 base 14 k
replacing libhugetlbfs-lib.i386 1.0.1-1.el5

Updating:
Deployment_Guide-en-US noarch 5.2-9.el5.centos base 7.0 M
Deployment_Guide-ja-JP noarch 5.2-9.el5.centos base 7.1 M
NetworkManager i386 1:0.6.4-8.el5 base 400 k
<<略>>
virt-viewer i386 0.0.2-2.el5 base 24 k
xulrunner i386 1.9-0.beta5.6.el5 base 9.9 M
yum-fastestmirror noarch 1.1.10-9.el5.centos base 13 k

Transaction Summary
=============================================================================
Install 20 Package(s)
Update 244 Package(s)
Remove 0 Package(s)
20パッケージが新たにインストールされ、244パッケージが更新されることが解る。当然環境によってこの辺りの数値は変わる。
続けて、RPMパッケージのダウンロードが行われる。
Total download size: 354 M
Downloading Packages:
(1/264): chkconfig-1.3.30 100% |=========================| 159 kB 00:00
(2/264): gnome-screensave 100% |=========================| 1.8 MB 00:00
(3/264): device-mapper-ev 100% |=========================| 19 kB 00:00
<<略>>
ダウンロードが終了すると、新規インストールもしくは更新が行われる。
(262/264): microcode_ctl- 100% |=========================| 449 kB    00:00
(263/264): ntsysv-1.3.30. 100% |=========================| 24 kB 00:00
(264/264): crypto-utils-2 100% |=========================| 35 kB 00:00
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Updating : libgcc ##################### [ 1/511]
Updating : glibc-common ##################### [ 2/511]
Updating : glibc ##################### [ 3/511]
<<略>>
この作業中、いくつか警告が表示される。以下にその警告の一覧を示す。
  Updating  : pam                                                [ 25/511]warning: /etc/pam.d/system-auth created as /etc/pam.d/system-auth.rpmnew
<<略>>
Updating : lvm2 [136/511]warning: /etc/lvm/lvm.conf created as /etc/lvm/lvm.conf.rpmnew
<<略>>
Installing: perl-XML-LibXML ##################### [139/511]
could not find ParserDetails.ini in /usr/lib/perl5/vendor_perl/5.8.8/XML/SAX
<<略>>
Updating : xen [148/511]warning: /etc/xen/xend-config.sxp created as /etc/xen/xend-config.sxp.rpmnew
<<略>>
Updating : bind [236/511]warning: /etc/sysconfig/named created as /etc/sysconfig/named.rpmnew
<<略>>
この内、bindについては、RPMパッケージbind-chrootをインストールしているため、xenは、VLAN設定のため、設定ファイルを変更しているために警告されている。残りのlvm2およびpamに関しては、システムに変更を加えていなければ、.rpmnewファイルで元ファイルを上書きした方がよいだろう。
この他に、SELinuxの設定を変更するスクリプトが動くため、以下の様なメッセージも大量に発生する。
<<略>>
Updating : selinux-policy-targeted ##################### [248/511]
/sbin/restorecon reset /bin/alsaunmute context system_u:object_r:bin_t:s0->system_u:object_r:alsa_exec_t:s0
/sbin/restorecon reset /etc/rc.d/init.d/auditd context system_u:object_r:initrc_exec_t:s0->system_u:object_r:auditd_script_exec_t:s0
/sbin/restorecon reset /etc/rc.d/init.d/httpd context system_u:object_r:initrc_exec_t:s0->system_u:object_r:httpd_script_exec_t:s0
<<略>>
最後に、インストール・更新されたパッケージの一覧が表示される。
  Cleanup   : microcode_ctl                ##################### [509/511]
Cleanup : ntsysv ##################### [510/511]
Cleanup : crypto-utils ##################### [511/511]

Installed: dhcpv6-client.i386 0:1.0.10-4.el5_2.2 kernel-xen.i686 0:2.6.18-92.1.6.el5 kmod-gfs-xen.i686 0:0.1.23-5.el5 libhugetlbfs.i386 0:1.2-5.el5
Dependency Installed: device-mapper-event.i386 0:1.02.24-1.el5 <<略>> yum-fastestmirror.noarch 0:1.1.10-9.el5.centos
Updated: Deployment_Guide-en-US.noarch 0:5.2-9.el5.centos Deployment_Guide-ja-JP.noarch 0:5.2-9.el5.centos <<略>> make.i386 1:3.81-3.el5
Replaced: dhcpv6_client.i386 0:0.10-33.el5 libhugetlbfs-lib.i386 0:1.0.1-1.el5
Complete!
#
再起動する。
# shutdown -r now

Broadcast message from root (pts/2) (Sun Jul 6 20:55:59 2008):

The system is going down for reboot NOW!
#
起動中に表示されるバージョン番号を確認する。
unmounting old /dev
unmounting old /proc
unmounting old /sys
audit(1215345577.104:2): policy loaded auid=4294967295 ses=4294967295
INIT: version 2.86 booting
Welcome to CentOS release 5.2 (Final)
Press 'I' to enter interactive startup.
Starting udev: (utc): Sun Jul 6 20:59:39 JST 2008 [ OK ]
起動後、ログを確認し、正常起動出来たかをチェックする。

2008/07/01

How do I migrate a system from RHEL 3 to CentOS 3?

CentOSのFAQに『How do I migrate a system from WBEL-3 (White Box Enterprise Linux) to CentOS 3?』という記事がある。この方法は、RHEL (Red Hat Enterprise Linux)にも適用可能とあるので、実際に検証してみた。

CentOS 3用RPMパッケージの署名鍵(sign key)をインストールする。
# rpm --import http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-3
#

RPMパッケージredhat-releaseをcentos-releaseに置き換える。
# rpm -q redhat-release
redhat-release-3ES-1
# rpm -Uvh http://mirror.centos.org/centos/3/os/i386/RedHat/RPMS/centos-release-3-9.1.i386.rpm
http://mirror.centos.org/centos/3/os/i386/RedHat/RPMS/centos-release-3-9.1.i386.rpm を取得しています
Preparing... ########################################### [100%]
1:centos-release ########################################### [100%]
# rpm -q redhat-release
パッケージ redhat-release はインストールされていません
#
RPMパッケージcentos-releaseで更新すれば、redhat-releaseと置き換えられる。
ここでは、バージョン3-9.1をインストールしているが、これは実際にhttp://mirror.centos.org/centos/3/os/i386/RedHat/RPMS/をブラウジングして、最新のバージョン番号で置き換える必要があるかもしれない。

CentOSリポジトリは、yumで管理するが、当然だが、RHEL3の状態では、yumはインストールされていない。
# which yum
/usr/bin/which: no yum in (/usr/kerberos/sbin:/usr/kerberos/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
:/usr/local/sbin:/usr/bin/X11:/usr/X11R6/bin:/root/bin)
#
Yum関連のRPMパッケージをインストールする。
# rpm -Uvh http://mirror.centos.org/centos/3/os/i386/RedHat/RPMS/yum-2.0.8-2.cen
tos3.noarch.rpm
http://mirror.centos.org/centos/3/os/i386/RedHat/RPMS/yum-2.0.8-2.centos3.noarch.rpm を取得しています
Preparing... ########################################### [100%]
1:yum ########################################### [100%]
# rpm -Uvh http://mirror.centos.org/centos/3/os/i386/RedHat/RPMS/centos-yumconf-1-11.noarch.rpm
http://mirror.centos.org/centos/3/os/i386/RedHat/RPMS/centos-yumconf-1-11.noarch.rpm を取得しています
Preparing... ########################################### [100%]
1:centos-yumconf ########################################### [100%]
# which yum
/usr/bin/yum
#
この作業についても、実際にリポジトリを覗き見して、適宜最新のバージョン番号に変える。

実際にアップグレードする前に、更新されるRPMパッケージを確認する(しなくてもよい)
# yum list update
Gathering header information file(s) from server(s)
Server: CentOS-3 - Addons
Server: CentOS-3 - Base
Server: CentOS-3 - Extras
Server: CentOS-3 - Updates
Finding updated packages
Downloading needed headers
emacs-0-21.3-4.10.i386.hd 100% |=========================| 49 kB 00:00
pango-0-1.2.5-5.i386.hdr 100% |=========================| 6.4 kB 00:00
lockdev-0-1.0.1-5.1.i386. 100% |=========================| 2.5 kB 00:00
<<略>>
gtk+-devel-1-1.2.10-31.i3 100% |=========================| 13 kB 00:00
freetype-devel-0-2.1.4-10 100% |=========================| 7.9 kB 00:00
Looking in Available Packages:
Name Arch Version Repo
--------------------------------------------------------------------------------

Looking in Installed Packages:
Name Arch Version Repo
--------------------------------------------------------------------------------

#

アップグレードする。
# yum update
Gathering header information file(s) from server(s)
Server: CentOS-3 - Addons
Server: CentOS-3 - Base
Server: CentOS-3 - Extras
Server: CentOS-3 - Updates
Finding updated packages
Downloading needed headers
Resolving dependencies
.Dependencies resolved
I will do the following:
[install: kernel-smp 2.4.21-57.EL.i686]
[install: kernel 2.4.21-57.EL.i686]
[update: emacs 21.3-4.10.i386]
<<略>>
[deps: bind-libs 20:9.2.4-21.el3.i386]
[deps: elfutils-libelf-devel 0.94.1-2.i386]
Is this ok [y/N]: y
Downloading Packages
Getting emacs-21.3-4.10.i386.rpm
emacs-21.3-4.10.i386.rpm 100% |=========================| 12 MB 02:26
Getting pango-1.2.5-5.i386.rpm
pango-1.2.5-5.i386.rpm 100% |=========================| 337 kB 00:04
Getting lockdev-1.0.1-5.1.i386.rpm
lockdev-1.0.1-5.1.i386.rp 100% |=========================| 12 kB 00:00
<<略>>
Getting man-1.5k-13.rhel3.i386.rpm
man-1.5k-13.rhel3.i386.rp 100% |=========================| 90 kB 00:00
Running test transaction:
Test transaction complete, Success!
hwdata 100 % done 1/854
filesystem 100 % done 2/854
redhat-logos 100 % done 3/854
<<略>>
XFree86-twm 100 % done 432/854
gdm 100 % done 433/854
Completing update for emacs - 434/854
Completing update for pango - 435/854
Completing update for lockdev - 436/854
<<略>>
0.33.7.1-25.3.rhel3.i386 net-snmp-libs 5.0.9-2.30E.24.i386 gdk-pixbuf 1:0.22.0-13.el3.3.i386 jaf 20030319-1.
i386 javamail 20031006-1.i386 FreeWnn-libs 1.11-36.3.i386 bind-libs 20:9.2.4-21.el3.i386 elfutils-libelf-dev
el 0.94.1-2.i386
Transaction(s) Complete
#
ところどころエラーが出るが、無視した。
再起動する。
# shutdown -r now

カーネルのバージョンを確認する。
# uname -a
Linux ホスト名 2.4.21-4.ELsmp #1 SMP Fri Oct 3 17:52:56 EDT 2003 i686 i686 i386 GNU/Linux
#
カーネルが古いままになっている。おそらく、grubの設定ファイルが書き換わっていないのだろう。
# cat /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/sda2
# initrd /initrd-version.img
#boot=/dev/sda
default=2
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title CentOS (2.4.21-57.ELsmp)
root (hd0,0)
kernel /vmlinuz-2.4.21-57.ELsmp ro root=LABEL=/
initrd /initrd-2.4.21-57.ELsmp.img
title CentOS (2.4.21-57.EL)
root (hd0,0)
kernel /vmlinuz-2.4.21-57.EL ro root=LABEL=/
initrd /initrd-2.4.21-57.EL.img
title Red Hat Enterprise Linux ES (2.4.21-4.ELsmp)
root (hd0,0)
kernel /vmlinuz-2.4.21-4.ELsmp ro root=LABEL=/
initrd /initrd-2.4.21-4.ELsmp.img
title Red Hat Enterprise Linux ES-up (2.4.21-4.EL)
root (hd0,0)
kernel /vmlinuz-2.4.21-4.EL ro root=LABEL=/
initrd /initrd-2.4.21-4.EL.img
#
default=2」となっているため、2+1=3番目のエントリ、「title Red Hat Enterprise Linux ES (2.4.21-4.ELsmp)」に対応するものが起動されている。これを、「default=0」に書き換える。
# cp -p /boot/grub/grub.conf /boot/grub/grub.conf.orig
# sed 's/^default=2/default=0/' < /boot/grub/grub.conf.orig > /boot/grub/grub.conf
再起動する。
# shutdown -r now
<<略>>
INIT: version 2.85 bootingiver loaded
Setting default font (lat0-sun16): [ OK ]

Welcome to CentOS
Press 'I' to enter interactive startup.
Configuring kernel parameters: [ OK ]
Setting clock (localtime): 2008 7dered data mode. OK ]
<<略>>
# uname -a
Linux ホスト名 2.4.21-57.ELsmp #1 SMP Wed May 7 06:10:55 EDT 2008 i686 i686 i386 GNU/Linux
#
カーネルのバージョンが新しくなっていることを確認できた。

2008/06/26

net-snmp-5.3.1-24 released

続・snmpd: ioctl 35123 returned -1・その3・RPMのビルドとインストール』でnet-snmp-5.3.1-24のRPMパッケージをを自前でビルドしたが、CentOS-Announce MLに次のメールが届いた。
Subject: [CentOS-announce] CESA-2008:0529 Moderate CentOS 5 i386 net-snmp Update
From: Karanbir Singh
To: email address for centos-announce
Date: Thu, 26 Jun 2008 01:41:19 +0100

CentOS Errata and Security Advisory 2008:0529 Moderate

Upstream details at : https://rhn.redhat.com/errata/RHSA-2008-0529.html

The following updated files have been uploaded and are currently syncing to the mirrors: ( md5sum Filename )

i386:
77a5e79229864fcd06f82d462b528689 net-snmp-5.3.1-24.el5_2.1.i386.rpm
1dd2fc53ee2175dc5e678bbd0decabce net-snmp-devel-5.3.1-24.el5_2.1.i386.rpm
Version 5.3.1-24が必要な場合は、こっちを使ってほしい。

CentOS 5.2リリース記念!BittorrentでDVD ISO imageをdownload

つい先日、CentOS-Announce MLでCentOS5.2のリリースが発表されました。
From: Karanbir Singh <email address for Karanbir>
To: email address for centos-announce
Date: Tue, 24 Jun 2008 13:22:03 +0100


We are pleased to announce the immediate availability of CentOS-5.2 for the i386 and x86_64 Architectures.
CentOS 5を使用している場合は、
Updating from CentOS-5.0 and 5.1

If you are already running CentOS-5 ( either 5.0 or 5.1 ), all you need to do is run : "yum upgrade" on your machine, and that will bring in the new packages from 5.2 and update your machine.
とこのメールにある通り、yum upgradeコマンド一発でアップグレード可能だ(手元の環境では未検証)

早速CentOS 5.2のローカルミラーリポジトリを作成するべく作業中(作成方法については、『ローカルミラーレポジトリ・その1・概要』参照)

CentOS 5.2のISOイメージは、FTP・HTTPでもダウンロード可能だが、
Download Instructions:

First a request from us : When possible, consider using torrents to run the downloads.
とある通り、bittorrentの使用が推奨されている。

しかし、CentOS 5にはbittorrentクライアントが準備されていない。自前でコンパイルしてDVD ISOイメージを入手する。

まず、作業ディレクトリを準備して、Enhanced CTorrentのtar ballをダウンロードする。
$ cd /some/where
$ wget 'http://downloads.sourceforge.net/dtorrent/ctorrent-dnh3.3.2.tar.gz?modtime=1213477987&big_mirror=0&filesize=219053'
--09:51:40-- http://downloads.sourceforge.net/dtorrent/ctorrent-dnh3.3.2.tar.gz?modtime=1213477987&big_mirror=0&filesize=219053
Resolving downloads.sourceforge.net... 216.34.181.60
Connecting to downloads.sourceforge.net|216.34.181.60|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://nchc.dl.sourceforge.net/sourceforge/dtorrent/ctorrent-dnh3.3.2.tar.gz [following]
--09:51:42-- http://nchc.dl.sourceforge.net/sourceforge/dtorrent/ctorrent-dnh3.3.2.tar.gz
Resolving nchc.dl.sourceforge.net... 211.79.60.17, 2001:e10:ffff:1f02::17
Connecting to nchc.dl.sourceforge.net|211.79.60.17|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 219053 (214K) [application/x-gzip]
Saving to: `ctorrent-dnh3.3.2.tar.gz'

100%[=======================================>] 219,053 97.2K/s in 2.2s

09:51:45 (97.2 KB/s) - `ctorrent-dnh3.3.2.tar.gz' saved [219053/219053]

$
これを展開、し、configure & make
$ tar xvzf ctorrent-dnh3.3.2.tar.gz
ctorrent-dnh3.3.2/
ctorrent-dnh3.3.2/rate.h
ctorrent-dnh3.3.2/tracker.h
<<略>>
ctorrent-dnh3.3.2/install-sh
ctorrent-dnh3.3.2/btfiles.h
ctorrent-dnh3.3.2/sigint.cpp
$ cd ctorrent-dnh3.3.2
$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
<<略>>
config.status: WARNING: Makefile.in seems to ignore the --datarootdir setting
config.status: creating config.h
config.status: executing depfiles commands
$ make > make.log 2>&1&
[1] 16130
$
しばらく時間がかかる。
この作業が終わったら、rootになってmake installを実行する(あるいは、インストールせずに、作成された実行ファイル./ctorrentを直接実行してもよい)
# cd /some/where
# make install
make[1]: Entering directory `/some/where/ctorrent-dnh3.3.2'
test -z "/usr/local/bin" || mkdir -p -- "/usr/local/bin"
/usr/bin/install -c 'ctorrent' '/usr/local/bin/ctorrent'
make[1]: Nothing to be done for `install-data-am'.
make[1]: Leaving directory `/some/where/ctorrent-dnh3.3.2'
#


Bittorrentを使う場合、トラッカー情報の入った.torrentファイルが必要になるので、これをダウンロードする。
$ wget 'http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/5.2/isos/i386/CentOS-5.2-i386-bin-DVD.torrent'
--09:57:53-- http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/5.2/isos/i386/CentOS-5.2-i386-bin-DVD.torrent
Resolving ftp.yz.yamagata-u.ac.jp... 210.146.64.99, 133.24.255.161
Connecting to ftp.yz.yamagata-u.ac.jp|210.146.64.99|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 307060 (300K) [application/x-bittorrent]
Saving to: `CentOS-5.2-i386-bin-DVD.torrent'

100%[=======================================>] 307,060 96.3K/s in 3.1s

09:57:57 (96.3 KB/s) - `CentOS-5.2-i386-bin-DVD.torrent' saved [307060/307060]

$
これをctorrentの引数として渡すと、ファイル交換が始まる。Bittorrentは、P2Pなので、ダウンロードと同時にアップロードも行われる。
$ /usr/local/bin/ctorrent CentOS-5.2-i386-bin-DVD.torrent
META INFO
Announce: http://torrent.centos.org:6969/announce
Created On: Sat Jun 21 01:58:31 2008
Piece length: 262144
FILES INFO
Directory: CentOS-5.2-i386-bin-DVD
<1> CentOS-5.2-i386-bin-DVD.iso [4020600832]
<2> md5sum.txt [62]
<3> sha1sum.txt [70]
Total: 3834 MB
Found bit field file; verifying previous state.
Listening on 0.0.0.0:2706
Press 'h' or '?' for help (display/control client options).
Checking completed.
/ 54/46/101 [8767/15338/15338] 2195MB,1048MB | 78,15K/s | 85,5K E:0,19
warn, piece 13265 hash check failed.
- 44/19/101 [8913/15338/15338] 2232MB,1055MB | 87,17K/s | 80,16K E:0,19
warn, piece 7467 hash check failed.
- 43/17/101 [9003/15338/15338] 2255MB,1058MB | 91,13K/s | 16,0K E:0,19
warn, piece 4436 hash check failed.
| 56/27/101 [15337/15338/15338] 3839MB,2056MB | 95,5K/s | 16,0K E:0,31
Download complete.
Total time used: 909 minutes.
Seed for others 72 hours
| 0/10/101 [15338/15338/15338] 3839MB,2274MB | 0,32K/s | 0,32K E:0,36 Connected
warn, received nothing from tracker!
- 0/12/101 [15338/15338/15338] 3839MB,2373MB | 0,18K/s | 0,16K E:0,38 Connectin
warn, received nothing from tracker!
\ 0/18/101 [15338/15338/15338] 3839MB,2385MB | 0,19K/s | 0,40K E:0,39Q
Quit: Are you sure? y
- 0/17/101 [15338/15338/15338] 3839MB,2386MB | 0,25K/s | 0,16K E:0,39 Quitting

$
念のため、チェックサムを確認する。
$ cd CentOS-5.2-i386-bin-DVD
$ cat sha1sum.txt
c89db7f5294465d593e7b02c232e0e9070111487 CentOS-5.2-i386-bin-DVD.iso
$ sha1sum CentOS-5.2-i386-bin-DVD.iso
c89db7f5294465d593e7b02c232e0e9070111487 CentOS-5.2-i386-bin-DVD.iso
$ cat md5sum.txt
1539bad48e984ae1441052dc074c0995 CentOS-5.2-i386-bin-DVD.iso
$ md5sum CentOS-5.2-i386-bin-DVD.iso
1539bad48e984ae1441052dc074c0995 CentOS-5.2-i386-bin-DVD.iso
$

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の無効化