2012年5月14日月曜日

KVMで仮想環境構築 for Ubuntu Server 12.04

近頃ずいぶん便利になった仮想化技術ですが、クリーンインストール環境がたまにほしくなるので、
KVM + QEMUを利用してCentOS 6.2Ubuntu Server 12.04のインストールとゲスト環境の複製までやってみます。

ホスト環境はこれまでセットアップしてきたUbuntu Server 12.04を利用します。

ハードウェアの前提確認

まずKVMを導入するにはCPUが仮想化に対応しているかホスト環境で確認します。
IntelのCPUの場合は、次のようにvmxが含まれれば対応しています。

・Intel VTの場合
grep vmx /proc/cpuinfo

flags  : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 lahf_lm dts tpr_shadow vnmi flexpriority
・AMD-Vの場合
grep svm /proc/cpuinfo

OSのダウンロード

インストールに使用するCentOS 6.2 と Ubuntu Server 12.04をダウンロードします。
cd /usr/local/src
curl -LO http://mirror.symnds.com/distributions/CentOS-vault/6.2/isos/x86_64/CentOS-6.2-x86_64-minimal.iso
curl -LO http://ftp.iij.ad.jp/pub/linux/ubuntu/releases/precise/ubuntu-12.04.3-server-amd64.iso

ネットワークの設定(ブリッジ接続)

・参考
https://help.ubuntu.com/12.04/serverguide/network-configuration.html#bridging
http://www.linux-kvm.org/page/Networking

・bridge-utilsのインストール
sudo apt-get install bridge-utils
・設定ファイルの修正
vi /etc/network/interfaces 次のように修正して保存する
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto br0
iface br0 inet static
address 192.168.1.100
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
bridge_ports eth0
bridge_stp off
bridge_maxwait 0
bridge_fd 0
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 8.8.8.8
dns-search example.local

・ネットワークを再起動
sudo /etc/init.d/networking restart

・ネットワークの設定確認(br0の追加)
ifconfig -aの内容
br0       Link encap:Ethernet  HWaddr **:**:**:**:**:**  
    inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
    以下省略

ネットワークの設定(iptables)

・/etc/sysctl.confの修正
vi /etc/sysctl.conf
次の内容を追記して保存する
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
net.ipv4.ip_forward = 1
・設定を読み込み
sysctl -p /etc/sysctl.conf

KVM + QEMU のインストール

sudo apt-get install qemu-kvm virt-manager virt-viewer

イメージファイル作成

適宜容量は変更してください。
qemu-img create -f qcow2 /var/lib/libvirt/images/centos6.img 160G
qemu-img create -f qcow2 /var/lib/libvirt/images/ubuntu1204.img 160G
参考
qcow2形式なので、作成されるイメージファイルが160GB使用するわけではありません。
以下の手順で最小構成インストール直後のファイルサイズは3.3GB(centos6)と2.6GB(ubuntu1204) でした。またvirt-cloneで作成したファイルはそれ以下のサイズとなりました。

ゲストOSのインストール

・CentOS 6.2
virt-install --connect qemu:///system \
 --name=centos6 \
 --connect=qemu:///system \
 --ram=2048  \
 --vcpu=2 \
 --os-type=linux \
 --hvm \
 --os-variant=virtio26 \
 --disk path=/var/lib/libvirt/images/centos6.img,size=160,format=qcow2 \
 --cdrom=/usr/local/src/CentOS-6.2-x86_64-minimal.iso \
 --network bridge=br0 \
 --graphics vnc,port=5900,password=foobar,listen=0.0.0.0,keymap=ja
・Ubuntu Server 12.04
virt-install --connect qemu:///system \
 --name=ubuntu1204 \
 --connect=qemu:///system \
 --ram=2048  \
 --vcpu=2 \
 --os-type=linux \
 --hvm \
 --os-variant=ubuntuprecise \
 --disk path=/var/lib/libvirt/images/ubuntu1204.img,size=160,format=qcow2 \
 --cdrom=/usr/local/src/ubuntu-12.04-server-amd64.iso \
 --network bridge=br0 \
 --graphics vnc,port=5901,password=foobar,listen=0.0.0.0,keymap=ja

VNC接続

・VNCで使用するポートを開ける
環境に合わせて適宜変更してください。
sudo ufw allow proto tcp from 192.168.1.0/24 to any port 5900:5901
・VNCクライアントで接続して各ゲストOSをインストールする
各OSのインストールは省略いたしますが、ホスト名、IPアドレス、VNCのポート番号などは
マスター作成用に普段使用しないものを割り当てた方がよいかと思います。
セットアップが完了した仮想環境は複製して使い回せるため1台のサーバに複数の環境を導入する場合や、
複数のサーバに展開する場合を考慮してあらかじめ設計するとよいでしょう。

インストール完了後に再起動していない模様

OSインストールが環境してvirshコマンドでゲスト環境を確認したところ
いずれも状態がシャットオフで起動していませんでした。
virsh list --all
Id Name                 State
----------------------------------
  - centos6              shut off
  - ubuntu1204           shut off
・virshコマンドでゲストOSを起動します
virsh start centos6
virsh start ubuntu1204
・確認
virsh list --all
 Id Name                 State
----------------------------------
  1 centos6              running
  2 ubuntu1204           running

virshでゲストOSの再起動やシャットダウンができない

ホスト環境からvirsh shutdownコマンドを実行してもゲスト環境(centos6)がシャットダウンせず実行中のままでした。
この問題は、acpidをインストールして解決します。
・ゲストOSにacpidをインストールする
・CentOS 6.2 の場合
sudo yum install acpid.x86_64
/etc/init.d/acpid start

・Ubuntu Server 12.04の場合(最小構成でもインストールされていたためこの手順は不要です)
sudo apt-get install acpid service acpid start
ホスト環境からシャットダウンするか確認してみます。
virsh shutdown centos6
virsh shutdown ubuntu1204
どちらもシャットダウンできました。
virsh list --all
 Id 名前               状態
----------------------------------
  - centos6              シャットオフ
  - ubuntu1204           シャットオフ
これでゲスト環境の準備は完了です。次にゲスト環境を複製を試してみます。

クローン作成

・複製前の準備
一通りセットアップが完了した状態で不要なログなどを削除してから
シャットダウンして配布用マスターとして利用します。

・virtc-cloneコマンドでゲスト環境のクローン作成
virt-clone --connect=qemu:///system \
  -o centos6 \
  -n centos6clone \
  -f /var/lib/libvirt/images/centos6clone.img
・定義ファイルを一部修正
virsh edit centos6clone なぜかディスクがraw形式になっていたのでrawをqcow2に修正しました。
<disk type='file' device='disk'>:
<driver name='qemu' type='qcow2'/>:

vncのポートが重複していると起動しないため、graphicsタグを削除するかポート番号を変更します。
<graphics type='vnc' port='5900' autoport='no' listen='0.0.0.0' keymap='ja'>
<listen type='address' address='0.0.0.0'/>
</graphics>
<video>
<model type='cirrus' vram='9216' heads='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>

virt-cloneがMACアドレス適当に割り当ててくれているのでこれをそのまま利用しますが、
CentOSではネットワーク設定に問題があり修正が入ったのでこのMACアドレスをメモしてください。
<interface type='bridge'>
<mac address='52:54:00:1f:b3:76'/>

・複製したゲストOSを起動する
virsh start centos6clone
・ホスト名を変更する(CentOS)
vi /etc/sysconfig/network
HOSTNAME=kvm2
・ホスト名を変更する(Ubuntu)
vi /etc/hostname
kvm3
・IPアドレスとMACアドレスの変更(CentOS)
vi /etc/sysconfig/network-scripts/ifcfg-eth0
HWADDR=52:54:00:1f:b3:76
IPADDR=192.168.1.101
CentOSでは、virt-cloneで作成したイメージで起動すると、eth0がeth1に書き変わってしまいネットワークの起動に失敗しました。同じ現象と思われる記事 http://d.hatena.ne.jp/ngyuki/20110805/p1 もあるでの私だけではないようです。
dmesgには次のようなログが出力されます。
udev: renamed network interface eth0 to eth1
・eht0がリネームされた場合は次のファイルを削除する(CentOS)
sudo rm -f /etc/udev/rules.d/70-persistent-net.rules
・IPアドレスとMACアドレスの変更(Ubuntu)
vi /etc/network/interfaces
iface eth0 inet static
        address 192.168.1.102
再起動してホスト名とIPアドレスが変更されていることを確認します。
reboot
以上でゲスト環境の複製ができました。

kvm環境すごく便利ですね。
OpenStackやEucalyptusとまではいかなくても、
小規模なプライベートクラウドなら自作できそうですね。

0 件のコメント:

コメントを投稿