2013年1月10日木曜日

KVMでDataGuard環境を作ってみよう Part2

冬休みは終わりましたが続きますorz

 (4) 仮想マシンイメージの作成とゲストOSのインストール

まずは仮想マシンイメージファイルを以下のコマンドで作成します。今回はハードディスク容量が400GB弱しかないのに6仮想ゲスト+3DBを作成する必要があるため、容量節約のため動的割り当てファイルを使います。また、Oracleインストールにはある程度のスワップ領域が必要ですが、実際は使わないため、スワップ単体でファイルを作成し、もしサイズが大きくなってしまっても再作成できるようにしておきたいと思います。

# qemu-img create -f qcow2 /vmdata/dg01root.img 15G
# qeme-img create -f qcow2 /vmdata/dg01swap.img 4GB

VirtualBoxがvmdk形式のファイルもいけたので、KVMもいけるかと思い試してみましたが駄目でした (そりゃそうか) 。

仮想ファイル作成後は、仮想ゲストを起動して、OSインストールイメージからOSをインストールします。起動コマンドは以下になるようです (一部実際に利用したのと違うのですが、後述します)。

# /usr/libexec/qemu-kvm -k ja \
                        -hda /vmdata/dg01root.img \
                        -hdb /vmdata/dg01swap.img \
                        -cdrom /root/V33411.iso -boot d \
                        -m 4096 -vnc :1

ここで重要なのが、「-k ja」というオプションです。単に日本語キーボードを使いますよということを指定しているだけなのですが、これがないとデフォルトは英語キーボードとみなされるようですが、コロンとセミコロンのキーを押してもセミコロンになりコロンが入力できない、Shift-^がEscになるなど困ったことになります。特にviで設定ファイルを編集しようとすると保存するときに詰みます。

(実は始めはこのオプションに気付かなかったために、設定ファイルの編集でedやcatを使うという面倒くさいことをやっていました。ちなみに「KVM vnc コロン」とかでGooglingするとsetxkbmapの話ばかりが上位に来ていますが、そもそもX-Window-System絡んでいないのにどう関係しているんでしょうね。)

 あと、「-vnc :1」 でコンソール画面をVNC経由で操作できるようになるのですが、このような表記をするとVNCサーバは127.0.0.1でリッスンするため、ローカルからの接続しか出来ません。今回はSSH転送を利用したので問題ないですが、リモートから繋ぎたい場合は「-vnc dg01:1」のようにホスト名 (リッスンするホスト名orIPアドレス)を明記する必要があるようです。

上述のコマンドを実行した後は、UltraVNC Viewerなどで接続すればOSインストール画面が表示され、OSインストールを行うことが出来ます。ちなみに最初はRealVNC Viewerで接続していたのですが、接続直後にコネクションが切断されるという事象が発生していました。そのためUlraVNCViewerを使っています。

(5) 仮想ゲストのクローニング

今回は仮想ゲストが6台必要ですが、OSインストールを6回繰り返すのは面倒なので、1つインストールしたところで仮想ゲストのイメージをコピーすることで手間を省きたいと思います。

ただ、RedHat系のLinuxではいくつかの設定ファイルでハードウェアの識別IDが直書きされるため、そのままコピーしても上手く起動しなかったり、認識したとおりのデバイス名にならないなどの問題があります。なので、それらの設定を消しこんでから、ホストOS上でcpコマンドでコピーします。
  • /etc/sysconfig/network-scripts/ifcfg-*  (MACアドレス指定)
  •  /etc/udev/rules.d/70-persistent-net.rules  (MACアドレス指定)
  • /etc/fstab  (パーティションUUID指定)
  • /boot/grub/grub.conf  (パーティションUUID指定)
 ここではまず、dg01~dg03のネットワーク通信の確認をしたいので、この3ゲストだけ先に作ってしまいます。(本当はOracleインストールに必要な設定&rpmインストールを終えてからコピーしたいのですが、ネットワーク確認を優先させます。)
# cp /vmdata/dg01root.img /vmdata/dg02root.img
# cp /vmdata/dg01root.img /vmdata/dg03root.img
# cp /vmdata/dg01swap.img /vmdata/dg02swap.img
# cp /vmdata/dg01swap.img /vmdata/dg03swap.img
(よくよく考えればcpするだけならパーティションのUUIDは変わらないはずなので、/etc/fstabと/boot/grub/grub.confの修正は必要なかったのかも知れません。)

(6) 複数の仮想ゲスト起動とネットワーク疎通確認

仮想ホストが3つ出来たところで、ネットワーク設定含め仮想ホストを起動します(前回作成したaddif.shと同じディレクトリで実行します)

  • dg01
# /usr/libexec/qemu-kvm -k ja \
  -hda /vmdata/dg01root.img \
  -hdb /vmdata/dg01swap.img \
  -boot c -m 4096 -vnc :1 \
  -net nic,macaddr:=54:52:00:12:01:01,vlan=0 \
  -net tap,ifname=tap0,script=addif.sh,downscript=no,vlan=0 \
  -net nic,macaddr:=54:52:00:
12:01:02,vlan=1 \
  -net tap,ifname=tap6,script=addif.sh,downscript=no,vlan=1 \
  -net nic,macaddr:=54:52:00:
12:01:03,vlan=2 \
  -net tap,ifname=tap11,script=addif.sh,downscript=no,vlan=2
  • dg02
# /usr/libexec/qemu-kvm -k ja \
  -hda /vmdata/dg02root.img \
  -hdb /vmdata/dg02swap.img \
  -boot c -m 4096 -vnc :2 \
  -net nic,macaddr:=54:52:00:
12:02:01,vlan=0 \
  -net tap,ifname=tap1,script=addif.sh,downscript=no,vlan=0 \
  -net nic,macaddr:=54:52:00:
12:02:02,vlan=1 \
  -net tap,ifname=tap7,script=addif.sh,downscript=no,vlan=1 \
  -net nic,macaddr:=54:52:00:
12:02:03,vlan=2 \
  -net tap,ifname=tap12,script=addif.sh,downscript=no,vlan=2

  • dg03
# /usr/libexec/qemu-kvm -k ja \
  -hda /vmdata/dg03root.img \
  -hdb /vmdata/dg03swap.img \
  -boot c -m 4096 -vnc :3 \
  -net nic,macaddr:=54:52:00:
12:03:01,vlan=0 \
  -net tap,ifname=tap2,script=addif.sh,downscript=no,vlan=0 \
  -net nic,macaddr:=54:52:00:
12:03:02,vlan=1 \
  -net tap,ifname=tap8,script=addif.sh,downscript=no,vlan=1 \
  -net nic,macaddr:=54:52:00:
12:03:03,vlan=2 \
  -net tap,ifname=tap13,script=addif.sh,downscript=no,vlan=2
-netオプションが1仮想ホストにつき6つ出てきますが、2つ1組で1つの仮想NICの設定に対応します。これで仮想OSを起動した後に、VNC経由でコンソールに接続し、IPアドレスやホスト名などのネットワーク設定を入れていきます。

仮想ホスト起動コマンドのオプションについていくつか補足を。

まず、netオプション内でMACアドレスを指定していますが、複数仮想ホストを扱う場合は必須の設定になります。Webの情報では最近のKVMはMACアドレスは重複しないように自動採番されると記載されていることが多いです。確かに、指定しなかった場合、1番目のNICは54:52:00:12:34:56なら2番目のNICは54:52:0:12:34:57と+1されて重複しません。しかし、重複回避は1仮想ホスト内での話であり、2番目の仮想ホストではしっかりと1番目の仮想ホストと同じMACアドレスを割当てようとします。つまり指定しないとdg01のeth0とdg2のeth0でMACアドレスが被ります。

ifnameで仮想NICに接続するTAPインターフェース名を指定します。実際にTAPインターフェースは仮想ホスト起動時に作成されますが、ネットワーク(ブリッジ) に接続する処理は前回作成したaddif.shが担います。そのスクリプトファイルはscript=...で指定します。仮想ホスト終了時にTAPインターフェースは自動削除されますが、その際に実行するスクリプトはdownscript=...で指定します。今回は何もしないのでnoを指定しています。

最後ですが、なぜかVLANの設定が必要です。パブリックネットワークにはVLAN ID=0を、インターコネクトネットワークにはVLAN ID=1を、データ変更転送用ネットワークにはVLAN ID=2を割当てています。これがないと、仮想OSを1つ起動させた状態では、VNC経由のコンソール画面がログインプロンプト表示後にグレーアウトするという不具合が、仮想OSを2つ以上起動させた状態では、qemu-kvmプロセスがCPUコアを100%使い果たしてしまうという問題に遭遇しています。前者の原因は分かりません。後者はスパニングツリー(L2レベルでのループ)によるブロードキャストストームが原因ですが、何処がループになっているのかは理解できていません。 (試しにvlan指定を取り払い、br0~br4に対してSTPを有効にすると問題なく動作します。本来はこっちが本筋な設定なのかも知れません。)

色々問題ありましたが、ここまでくれば、dg01~dg03はパブリックネットワークとデータ転送用ネットワークを通して互いに通信できますし、dg01とdg02はインターコネクトネットワーク経由で通信できますが、dg03は通信できないという想定通りの挙動が得られます。


今回はここまでです。次回はOracleインストール用に仮想OSの設定を行い、RACをインストールします。 

0 件のコメント:

コメントを投稿