nkjmkzk.net

powered by Kazuki Nakajima

Archive for the ‘xen’ tag

RHEL4.xまたはOEL4.xのゲストOSで/dev/sd*が認識できない問題

RHEL4.xまたはOEL4.xのゲストOSに対して、/dev/sd*のような形で仮想ディスクを認識させたい場合、つまり、

disk = [
'file:/OVS/running_pool/OEL4U7i386/system.img,xvda,w',
'file:/OVS/running_pool/OEL4U7i386/vd1.img,sda,w',
]

な形でディスクを認識させようとしても、起動後にls /devしてみるとsdaはどこにも見あたりません。/var/log/messegesを見てみるとこんなメッセージが出ているはずです。

Dec 19 10:30:53 localhost kernel: register_blkdev: cannot get major 8 for sd
Dec 19 10:30:53 localhost kernel: xen_blk: can't get major 8 with name sd

これは本来使わなくていいはずのscsiカーネルモジュールをロードしてしまっているのが原因です。これを回避するためにはscsiモジュールを取り除いた形でinitrdをリビルドします。まず現状のinitrdにscsiモジュールが含まれてしまっていることを確認するには以下のようにコマンドを実行します。

[root@~]# zcat /boot/initrd-2.6.9-67.0.15.0.1.ELxenU.img | cpio -it | grep ko | grep -i scsi
lib/scsi_mod.ko

scsiモジュールが入っています。これを取り除いた形で新しいinitrdを生成します。

[root@~]# cd /boot/
mkinitrd --omit-scsi-modules --with=xennet --with=xenblk /boot/initrd-2.6.9-78.0.0.0.1.ELxenU.img.scsifix 2.6.9-78.0.0.0.1.ELxenU

[root@~]# ls | grep initrd
initrd-2.6.9-78.0.0.0.1.ELxenU.img
initrd-2.6.9-78.0.0.0.1.ELxenU.img.scsifix

下が新しく作ったinitrdです。scsiモジュールが取り除かれているか確認します。

[root@~]# zcat /boot/initrd-2.6.9-67.0.15.0.1.ELxenU.img.scsifix | cpio -it | grep ko | grep -i scsi
(scsi_mod.koが表示されなければOK

ブートローダの設定ファイルを編集してこの新しいinitrdを使ってブートするようにします。

[root@~]# vi /boot/grub/menu.lst

# 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/VolGroup00/LogVol00
#          initrd /initrd-version.img
#boot=/dev/xvda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Enterprise (2.6.9-78.0.0.0.1.ELxenU)
    root (hd0,0)
    kernel /vmlinuz-2.6.9-78.0.0.0.1.ELxenU ro root=/dev/VolGroup00/LogVol00 console=xvc0 rhgb quiet
    initrd /initrd-2.6.9-78.0.0.0.1.ELxenU.img.scsifix

これで完了です。リブートすれば/dev/sd*も認識できるようになっているはずです。

追記

このscsiモジュール無しのinitrdで起動している場合、VBDを/dev/sd*と認識することはできますが、そのかわりにiSCSIで直接ストレージに接続することができなくなっちゃいます。VBDの場合はxenblkドライバを使えばいいものの、iSCSI直接続の場合は本来のscsiドライバが必要になるからですね。まぁ、併用しなければいけないというような要件はなさげだしいいか。

without comments

Written by 中嶋 一樹

12月 19th, 2008 at 2:45 pm

Posted in Uncategorized

Tagged with

CentOS 5で仮想化システムを構築する(ゲストOSのセットアップ)

ゲストOSを作成するにあたりまずその仮想化のモードについて決めておかなければなりません。Xenには準仮想化と完全仮想化の2種類のモードがあります。それぞれのモードについての詳細な説明は割愛させていただきますが、Xenでは特に準仮想化モードを採用した場合に性能面に大きなアドバンテージがあります。今回はこの準仮想化に絞って話を進めていきます。

仮想化のモードに加えて、ゲストOSはその実体データの保存形式をパーティションベースのものとファイルベースのものから選択することができます。パーティションベースの方はホストOSで認識しているブロックデバイスのパーティションをそのままゲストOSに貸出し、その上にゲストOSをインストールします。このパーティションにはローカルマシン上のハードディスクや、iSCSIまたはFC接続のSANも利用可能です。
ファイルベースの方はパーティションは必要とせず、ファイルを作成してその上にゲストOSをインストールします。ファイルはホストOSからアクセスできるところにあればローカルマシン上のハードディスクにあってもリモートのNFSサーバ上にあっても構いません。
一般的にパーティションベースのゲストOSはディスクI/O性能がファイルベースのもの比べて優れていると言われており、一方ファイルベースのゲストOSはファイルとしてOSを取り扱えるという感覚から移動やバックアップ等が容易であると言われています。さらにファイルベースの場合、Sparseファイルという形式を用いることで実際に消費するディスク容量を大幅に削減することが可能です。このあたりのパフォーマンスや利便性の実際については後に詳しく検証を行いたいと思います。

それではゲストOSの作成方法を見ていきましょう。
CentOS 5ではゲストOS作成支援ツールとしてvirt-managerとvirt-installを提供しています。virt-managerではGUIを利用したウィザードでゲストOSの作成を進めることができます。virt-installは CUIでの操作になります。今回はX Windowが使えない環境でも利用できるvirt-installでの手順をご紹介します。

ゲストOSをパーティションベースで保存する場合はあらかじめパーティションを作成しておく必要があります。fdisk等のツールでゲストOS用に確保したい領域を「/dev/sda5」等として切り出しておきます。LVMの論理ボリュームも指定可能です。この時点でパーティションをフォーマットする必要はありません。ファイルベースで保存する場合はvirt-installで自動作成することができますので事前の準備は不要です。十分なディスクスペースがあることだけを確認しておいて下さい。

次にvirt-installコマンドにてゲストOSのインストールを開始します。virt-installは引数なしで実行すると対話形式でゲストOSに最低限必要なパラメータ入力を順に行うことができます。あるいは引数を与えることでパラメータを一括して指定することもできます。以下は引数を与えて実行する例です。

# virt-install \
--paravirt \
--name=vm01 \
--vcpus=1 \
--ram=512 \
--file=/srv/vm01 \
--file-size=5 \
--location=http://ftp.riken.go.jp/Linux/centos/5/os/x86_64 \
--nographics \
--nonsparse

以下、各オプションの説明です。
–paravirt : 仮想化モードに準仮想化を指定します。
–name : ゲストOSの識別名を指定します。
–vcpus : ゲストOSへの仮想CPU割り当て個数を指定します。
–ram : ゲストOSへのメモリ割り当て量(メガバイト単位)を指定します。
–file : ゲストOSを保存するファイル、またはパーティションを指定します。
–file-size : ゲストOSを保存するファイルのサイズ、つまりゲストOSに割り当てるディスクサイズ(ギガバイト単位)を指定します。
–location : OSのリポジトリを指定します。
*ちなみにlocationに上記の用にインターネット上のミラーサーバを指定するとインストールが開始されるまでに異様に時間がかかる現象がありました。僕の検証用のノートPCのネットワークカードの調子が悪いのが原因かもしれません。同じ現象に遭遇された方はLAN上にレポジトリを立ててやると回避できると思います。面倒ですが。
–nographics : CUIでのインストールを指定します。これを指定しない場合VNC接続でのインストールとなります。
–nonsparse : ゲストOSを保存するファイルにSparseファイルでない通常のファイル形式を指定します。

ファイルの作成が完了するとOSのインストールウィザードが表示されます。

あとはウィザードにしたがってインストールを進めて下さい。通常のOSのインストールと同じ手順となります。インストールが完了するとリブートを促されます。「OK」としてリブートを行うとゲストOSが再起動し、初回起動時のみいくつかの設定項目が表示された後でログインプロンプトが表示されます。Ctrl+]キーを入力するとゲストOSの端末からデタッチしてホストOSのコマンドプロンプトに戻ります。ゲストOSのコンソールに再びアタッチする場合は以下のようにコマンドを実行します。

# xm console vm01

vm01のところには起動中のゲストOSの識別名を指定します。ゲストOSの起動・停止は同様にxmコマンドにて行うことができます。
・起動

# xm create -c /etc/xen/vm01

・停止

# xm shutdown vm01

なお、xm createの際はゲストOSの識別名ではなく、ゲストOSの設定ファイルを指定することに注意して下さい。virt-installで作成したゲストOSの設定ファイルはデフォルトで/etc/xen/以下に保存されています。

ここまででゲストOSを稼働させるまでの基本的な流れと手順を確認しました。
以降では実際に「サーバ集約」という目的におてい仮想化システム構築をシミュレーションし、そのプロセスをひとつづつ解説していきます。

次回は仮想化システム構築の際に最初のハードルとなるサイジングについて焦点を当て、

・ゲストOSのパフォーマンスはどうなのか?
・一台の物理マシンにゲストOSは何台くらい稼働させられるのか?
・ハードウェアはどのように構成すればよいのか?

というところを中心に解説したいと思います。

without comments

Written by 中嶋 一樹

12月 6th, 2008 at 7:06 pm

Posted in Uncategorized

Tagged with ,

CentOS 5で仮想化システムを構築する(ホストOSのセットアップ)

CentOSでXenを用いて仮想化環境を構築する際のハウツーをまとめておきます。ちなみにRHEL5でも同様です。

まずXenのコンポーネントをインストールします。これは非常に簡単で、OSからインストールする場合にはインストール時のシステム構成選択で「仮想化」にチェックをいれてインストールするだけです。これでハイパーバイザーとXen用のカーネル、その他管理ツールやライブラリがインストールされます。すでにOSがインストールされている場合は「ソフトウェアの追加と削除」から「仮想化」を適用すれば同様にインストールできます。Xensource社のサイトから別途ソースをダウンロードして独自ビルドも可能ですが、環境によっては依存関係の問題で一筋縄ではいかないことがありますので今回は安定性を重視してディストリビューションに付属しているパッケージを採用することにします。

Xenについてパッケージをそのまま使うということはあらかじめビルドされたカーネルを使用するということになりますが、これは後々に不都合が発生する場合があります。例えばドライバを追加したい場合です。僕のいつも使っているThinkpad T60にはAtheros Communications社の無線LANが内蔵されていますが、このデバイスは現在正規のカーネルではサポートされていません(ドライバが含まれていません)。なのでこのネットワークインターフェースを使いたい場合には別途madwifiのドライバをインストール必要があります。カーネルモジュールとしてドライバを新たにインストールする場合、現在使っているカーネルのソースツリーが必要になりますが、自分でカーネルをコンパイルしていない限りカーネルのソースツリーはファイルシステム上には存在しません。したがって追加のドライバをインストールするにはカーネルソースツリーを手に入れる必要があります。CentOSや他の一般的なディストリビューションではバイナリ配布しているパッケージのソースをSRPMとして公開しています。今回はカーネルのSRPMをダウンロードしてそれらを適切に展開してファイルシステム上にカーネルソースツリーを構築します。

まずCentOSのミラーサイトより現在稼働しているカーネルに合致するSRPMをダウンロードして保存します。

# ls
kernel-2.6.18-8.1.10.el5.src.rpm

次にこのSRPMをインストールします。

# rpm -ivh kernel-2.6.18-8.1.10.el5.src.rpm

すると/usr/src/redhat/SOURCESにカーネルソース、パッチ、スクリプトが展開されます。
次に/usr/src/redhat/SPECSに移動して「kernel-2.6.spec」というファイルがあることを確認します。

# cd /usr/src/redhat/SPECS
# ls
kernel-2.6.spec

ファイルが確認できたらrpmbuildコマンドによってSOURCESディレクトリ以下のファイル群をマージしてソースツリーを構築します。

rpmbuild -bp kernel-2.6.spec

/usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.x86_64以下にカーネルソースが構築されます。
*僕の環境が64bitなので.x86_64になっていますが32bitだとi386とかなると思います。

これでカーネルソースの構築が完了です。ちなみにこの状態でmadwifiのmakeを試みると失敗します。madwifiはカーネルバージョンを判断するためにutsrelease.h等をチェックしにいきますが、カーネルソースがビルドされていないとこのファイルがまだ生成されておらず、カーネルバージョンの確認ができないためです。ということもあり、折角なのでこのディストリビューション純正のソースを使ってカーネルをビルドしてしまいます。
まずカーネルソースの直下に移動し、その後configsディレクトリの中からkernel-2.6.18-x86_64-xen.configを.configとして現在のディレクトリにコピーします。

# cd /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.x86_64 # cp configs/kernel-2.6.18-x86_64-xen.config ./.config

このファイルはXen用のカーネルをビルドする際に使われるカーネルビルドオプションが記述されたファイルです。通常のカーネルにはないCONFIG_XEN=y等のオプションが追加設定されています。カーネルをいくらかカスタムしたい場合はそのままmake menuconfig等を実行してコンフィギュレーションを詰めます。その後通常通りにカーネルをビルド、インストールしていきます。

# make
# make modules_install
# make install

残念ながらmake installだけではinirdを自動で生成してくれないので手動で作成します。

# mkinitrd -v -f initrd-2.6.18-prep.img 2.6.18-prep

ちなみに2.6.18-prepは今回ビルドするカーネルの識別名になります。デフォルトだとコレになりますが、makeする前にMakefileのEXTRAVERSIONの値を書き換えれば指定も可能です。
これで現在のディレクトリにinitrdが作成されましたのでこれを/bootにコピーしてインストールします。

# cp initrd-2.6.18-prep.img /boot

あとgrubの設定ファイル(/boot/grub/menu.lst)も追記してあげる必要があります。以下のようなカンジです。

default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-prep)
  root (hd0,0)
  kernel /xen.gz-2.6.18-8.1.10.el5
  module /vmlinuz-2.6 ro root=/dev/VG00/LV_root rhgb quiet
  module /initrd-2.6.18-prep.img
title CentOS (2.6.18-8.1.10.el5xen)
  root (hd0,0)
  kernel /xen.gz-2.6.18-8.1.10.el5
  module /vmlinuz-2.6.18-8.1.10.el5xen ro root=/dev/VG00/LV_root rhgb quiet
  module /initrd-2.6.18-8.1.10.el5xen.img

2.6.18-prepの方が今回追加したエントリになります。
これでめでたくカーネルソースツリーの構築とカスタムカーネルのビルドが完了しました。再起動して今作成したカーネルで無事ブートできればOKです。

ちなみにmadwifiをインストールするには以下のようにします。

# tar xvfz madwifi-0.9.3.2.tar.gz
# cd madwifi-0.9.3.2/
# make KERNELPATH=/usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.x86_64
# make install

ここまででインストールは完了。あとは以下のようにmodprobeを実行してドライバモジュールをロードしてデバイスを認識させます。

# modprobe ath_pci

ここまでで仮想化環境を構築するための土台であるハイバーバイザとDom0カーネルのビルドが完了しました。
次回はゲストOS(DomU)インストールについて説明します。

with 2 comments

Written by 中嶋 一樹

12月 6th, 2008 at 7:05 pm

Posted in Uncategorized

Tagged with ,