Archive for the ‘CentOS’ tag
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は何台くらい稼働させられるのか?
・ハードウェアはどのように構成すればよいのか?
というところを中心に解説したいと思います。
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)インストールについて説明します。