Archive for February, 2009
@IT Oracle VMの世界 – スタンドアロン構成でのOracle VM環境構築
@ITにてOracle VM連載 第2弾が掲載されました。
http://www.atmarkit.co.jp/fserver/articles/oraclevm/02/01.html
今回は共有ストレージを使わず、サーバ一台で構成できるスタンドアロン構成でのセットアップ手順です。
ゲストOSでクラッシュダンプを取得するには
現在のところOracle VM上のゲストOSクラッシュダンプを取得したいとき、kdumpは使えなさげです。しかしながらxm dump-coreコマンドを使えば同等のことがもっと簡単に実装できます。
まず、対象のゲストOSのvm.cfg(設定ファイル)を編集してクラッシュ時の動作を設定します。
# vi /OVS/running_pool/GUEST/vm.cfg on_crash = preserve
このように設定することでゲストOSがクラッシュした際に再起動等を行わずにメモリイメージを保持させることができます。
そして実際にクラッシュした際にxm dump-coreでそのメモリイメージをダンプします。
# xm dump-core -C [DOMAIN_ID] [OUTFILE]
これでOUTFILEとしてクラッシュダンプが生成されます。
ファイルシステムのblock sizeを調べるには
OSの内部構造(メモリとかファイルシステムとか)を見ているといろんな単位がでてきます。
- セグメント
- ページフレーム
- ページ
- ブロック
- セクタ
等々。
ややこしい限りです。
たとえばページであれば現在のモダンなLinuxは4Kbyteが一般的です。
しかしファイルシステムのblock sizeとなるとデフォルト値はあるものの、ファイルシステム毎(ext2,ext3,jfs,xfs,reiserfs,ocfs2)にそのデフォルトが異なっていたりしますし、フォーマット時に指定可能な値なのでページサイズほど画一化されていません。よく使用するファイルサイズによって最適な値を選択するのがベストとされています。
なので「今このファイルシステムのblock sizeっていくつになってんの?」というのがわからなくなることがあります。そんなとき、ファイルシステムがext2またはext3であればtune2fsで調べることができます。
# tune2fs -l /dev/sda2 | grep "Block size" Block size: 4096
今回の/dev/sda2は4096byteつまり4Kbyteのblock sizeでフォーマットされていることがわかります。
しかしここで注意しておきたいのは、他のコマンドの出力結果がbyte単位ではなくてblock単位であったときこのファイルシステムのblock sizeとは一致しない可能性があることです。
たとえば、iostatをオプションなしで実行すると結果はblock単位で出力されますが、これは1blockあたり512byteとなっています。*ちなみに-kオプションをつけるとbyte単位で出力されます。
これは、iostatが言っているblockとは、実際にはセクタのことだからです。セクタはディスクデバイスにおけるデータ転送の最小単位で、基本的に512byteとなっているはずです。一方ファイルシステムが言うblockとはファイルシステムがデータを格納するときに確保する領域の最小単位です。したがって、セクタが512byteであり、保存するデータが512byteであったとしても、block sizeが4Kbyteでフォーマットされているファイルシステムでは4Kbyteの領域を消費してこのデータを格納します。ただし、実際はさらにこの無駄を排除するためにblockをフラグメント化して使うという機能が盛り込まれています。これは多分当初ext2では実装されていなかったのだと思いますが、現在はext2/ext3ともに実装されており、mke2fsの-fオプションでそのフラグメントのサイズを指定できます。
追記:フラグメントはext2/ext3ともに未実装のようです。-fオプションはダミーで実際には指定しても効果がありません。オイ!
追記:ためしに1Kbyteのファイル1000個と4Kbyteのファイルを1000個作ってみましたが、どちらも消費領域は4Mbyteでした。フラグメンテーション機能、やはりナス!
このようにOSの内部はいろんな単位が使用されており、さらにその値が時代(ソフトウェアのバージョン)によって違ったり、同じ言葉でも指すものが違ったりするのでなかなか厄介です。
VM Manager VM Released !
*検証の結果何度か手順を修正しました。
これまでOracle VMにはVM Managerという管理ノードが別サーバで必要でした。
今回リリースされたのはそのVM Managerのテンプレートです。つまり、VM Managerを仮想マシ上で動かすことができるようになったので、わざわざVM Manager用に一つハードウェアを用意する必要がなくなったわけです。しかもその仮想マシンがテンプレートという形ですでに提供されているのでManagerのインストールという作業も必要なくなりました。
取り急ぎダウンロードからセットアップまでをご紹介しておきます。
VM Manager VMのダウンロード:
http://edelivery.oracle.com/oraclevm
E-Deliveryの画面が表示されたら「Continue」ボタンを押し、Registrationの画面に進みます。必要な情報を入力し、規約に同意する旨のチェックボックスにチェックをして「Continue」ボタンを押し、Searchの画面に進みます。プルダウンメニューで以下のように選択して「Go」ボタンを押します。
Select a product Pack: Oracle VM Templates Platform: x86 32bit
表示された検索結果の中にVM Managerのテンプレートがあるはずです。下記のテンプレートを選択してダウンロードへと進んでください。
Oracle VM Templates for Oracle VM Manager Media Pack for x86 (32bit)
ダウンロードしたテンプレートをVM Serverの/OVS/running_pool/に保存して解凍・展開します。この時、running_pool以下にはこのテンプレート以外のファイル、ディレクトリがないことを確認してください。
# cd /OVS/running_pool # tar xzf OVM_EL5U2_X86_OVM_MANAGER_PVM.tgz
vm.cfgを編集してMACアドレスを割り当ててあげます。
# vi OVM_EL5U2_x86_OVM_MANAGER_PVM/vm.cfg vif = [ 'bridge=xenbr0,mac=00:16:3E:00:00:01,type=netfront', ]
xm コマンドを使って仮想マシンを起動します。
# xm create OVM_EL5U2_x86_OVM_MANAGER_PVM/vm.cfg
次に今起動した仮想マシンのコンソールに接続するための情報を取得します。
# xm list -l | grep location (location 0.0.0.0:5900) (location 2)
上記出力結果の:5900がVNCで仮想マシンに接続するために必要なポート番号です。
そして接続先のIPにはVM ServerのIPまたはホスト名を指定します。RealVNCだとこんな感じです。

VNCでコンソールにアクセスできるとOSの起動ログが表示された後に、通常VM Managerをインストールするのと同様に初期設定を行うためのプロンプトが出てきます。これらにすべて答えるとセットアップ完了です。以下のようにブラウザでアクセスできます。
http://VM ManagerのIP:8888/OVS
あと、Readmeにも記載がありますが、VM Manager VMをサスペンドしたり、シャットダウンするとVM Managerから操作ができなくなるのでご注意を。(そりゃそうだ)
OCFS2をローカルだけで使うには
OCFS2は主にFibreChannelやiSCSIで接続されたボリュームを複数サーバからマウントしてサーバ間でデータを共有できるようにするためのクラスターファイルシステムです。
OCFS2でボリュームをフォーマットしたりマウントするためには、通常クラスタの情報を記述したcluster.confファイルが必要になります。なので気軽に使うにはちょっと面倒、と感じている方もいらっしゃるかもしれません。しかし実はこのOCFS2、クラスタファイルシステムとしてではなく、ローカルだけで(スタンドアロンで)使用するファイルシステムとしても利用できます。その場合はcluster.confといった設定ファイルも作成する必要がありません。
OCFS2をローカルのみで使用するようにするには、ボリュームを”-M local”オプションをつけてフォーマットするだけです。
# mkfs.ocfs2 -M local --force /dev/sdb
これでOKです。あとは普通にマウントすれば使えるようになります。
# mount /dev/sdb /var
Oracle VMの内部アーキテクチャとベストプラクティス
OTN (Oracle Technology Network)にて掲題の記事が公開されています。
Oracle VMの内部アーキテクチャとベストプラクティス Part 1
Oracle VMの内部アーキテクチャとベストプラクティス Part 2
これはVM Forum 2008 Autumnという全国行脚のセミナーで行ったOracle VMのプレゼン内容を記事化したものです。是非チェックしてみてください。
OSが認識するメモリ容量を制限したいとき
特にパフォーマンステストをやってるといろいろとOSの環境を変えて結果を見比べたくなるときがあります。その中で「メモリ容量を変えたらどうなるか?」というときがしばしばあります。パワープレイでこれを実現するには、よっこらしょ、とラックからサーバを引き出し、ケースをパカッと開けてメモリを引っこ抜くという技が最初に思いつきます。しかしデュアルチャネル構成の場合短絡的にそんなことをしちゃうとサーバが起動しなくなってしまう可能性がありますし、そもそも現場まで言って作業するというのが原始的です。
簡単な方法は、カーネルの起動パラメータ「mem」でOS(カーネル)が認識するメモリ容量を指定してあげるやり方です。これは/boot/grub/grub.confを直接編集して静的に設定してもいいですし、起動時にgrubメニューで都度設定してもOKです。
例えばgrub.confを編集する場合はこんな感じです。
title Fedora (2.6.27.5-117.fc10.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.27.5-117.fc10.x86_64 ro root=UUID=5352e3d6-e0d6-4e6e-9e9f-f3e7e054bfdd rhgb quiet mem=389M
initrd /initrd-2.6.27.5-117.fc10.x86_64.img
起動時に設定する場合はコンソールにgrubメニューが表示されたときに「e」を入力して編集モードに入ることで設定できます。
*余談ですがOracle VM Serverではdom0_memというオプションでdom0に割り当てるメモリ容量を制限しています。
しかし、grub.confっていつから/etc/grub.confからリンクが張られてたんだろう。