仮想化技術の用語がややこしい
仮想化技術の用語がややこしくて困る。
ハイパーバイザ、ベアメタル、バーチャルマシンモニタ、このあたりはいいんですが、仮想アプライアンスによって機能の名前が微妙に違うので、忘れないようににまとめてみた。
仮想マシンのホストとゲスト
仮想アプライアンス | ホスト | ゲスト |
---|---|---|
VMware | ホストOS | ゲストOS |
Xen | Domain-0 | Domain-U |
Hyper-V | 親パーティション(Parent Partition) | 子パーティション(Child Partition) |
OpenVZ | ホストOS | ゲストVPS(仮想プライベート・サーバ) |
Solaris Container | グローバルゾーン | 非グローバルゾーン |
ライブマイグレーション
仮想アプライアンス | ライブマイグレーション |
---|---|
VMware | VMotino |
Xen | XenMotion |
Hyper-V | Quick Migration |
管理コンソール*1
仮想アプライアンス | 管理コンソール |
---|---|
VMware ESX | VirtualCenter(VC) |
VMware ESX | VMware Infrastructure Client(VIclient) |
VMware Server | VMware Console |
Xen | Virt-Manager |
XenServer | XenCenter |
Hyper-V | System Center Virtual Machine Manager(SCVMM) |
KVM | oVirt |
*1:カテゴリを微妙に混ぜてしまっている気がしなくもない。
VMWare の仮想イメージ を Xen へ P2V(V2V)
特にVMware限定でありません。実機からXenへのP2Vでも同じです。
泥臭い方法でXenへ移行します。
前提
方法
[Menu] -> [KNOPPIX] -> [Network/Internet] -> [ネットワークカードの設定]
- fdiskでディスクを確認
root@knoppix: ~# sudo fdisk -l Disk /dev/hda: 5368 GB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = シリンダ数 of 16065 * 512 = 8225280 bytes デバイス Boot Start End Blocks Id System /dev/hda1 * 1 25 200781 83 Linux /dev/hda2 26 652 5036377+ 8e Linux LVM
- ddでディスクをコピー*2
root@knoppix: ~# dd if=/dev/hda | gzip -1 -c | ssh user@domain0 "gzip -cd | dd bs=8192 of=/path/to/fedora.img"
- ファイルイメージではなくデバイス指定でDomain-Uを起動させる場合は、デバイス先にデータをコピー
$ [root@domain0 ~] sudo dd if=/path/to/fedora.img bs=8192 of=/dev/VolGroup00/LogVol04
- Xen Domain-0 側で Xenの定義ファイルを作成します
uuidとmacアドレスはユニークなものを。またvncdisplay番号も他のdomain-uと衝突しないものを割り当ててください。
http://d.hatena.ne.jp/dharry/20090107/1231268431
$ [root@domain0 ~] sudo cat /etc/xen/fedora8 name = "fedora8" uuid = "fcf19d28-add6-cc58-16e0-613e5dc2aad3" maxmem = 512 memory = 512 vcpus = 1 builder = "hvm" kernel = "/usr/lib/xen/boot/hvmloader" boot = "c" localtime = 0 on_poweroff = "destroy" on_reboot = "restart" on_crash = "restart" device_model = "/usr/lib64/xen/bin/qemu-dm" sdl = 0 vnc = 1 vncunused = 1 keymap = "ja" vncdisplay = "4" disk = [ "phy:/dev/VolGroup00/LogVol04,hda,w", ",hdc:cdrom,r" ] vif = [ "mac=00:16:3e:7e:09:a5,bridge=xenbr0,script=vif-bridge" ] serial = "pty"
- Domain-Uを起動します
$ [root@domain0 ~] sudo xen create /etc/xen/fedora8
- Virt-Managerを起動してコンソール画面でV2Vした仮想OSが起動していることを確認します。
[root@domain0 ~]# cat /etc/modprobe.conf alias scsi_hostadapter BusLogic alias scsi_hostadapter1 libata alias scsi_hostadapter2 ata_piix alias eth0 8139cp
- /etc/sysconfig/network-scripts/ifcfg-eth0を修正
[root@domain0 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 # Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] DEVICE=eth0 BOOTPROTO=none BROADCAST=192.168.1.255 #HWADDR=00:0C:29:A8:72:71 HWADDR=00:16:3E:7E:09:A5 IPADDR=192.168.1.44 IPV6INIT=yes IPV6_AUTOCONF=yes NETMASK=255.255.255.0 NETWORK=192.168.1.0 ONBOOT=yes GATEWAY=192.168.1.1 TYPE=Ethernet DNS1=192.168.1.1
- ネットワークを再起動して通信ができること確認
[root@domain0 ~]# sudo /etc/init.d/network restart [root@domain0 ~]# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:16:3E:7E:09:A5 inet addr:192.168.1.4 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::216:3eff:fe7e:9a5/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:304 errors:0 dropped:0 overruns:0 frame:0 TX packets:274 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:26516 (25.8 KiB) TX bytes:31392 (30.6 KiB) Interrupt:5 Base address:0x2000
- 念のためOSを再起動して問題なく稼動できるか確認
[root@domain0 ~]# sync;sync;sync;reboot
Xen Domain-U の UUIDとMACアドレス
xenのdomain-uを複製したあと、定義ファイルのUUIDとMACアドレスを手でコリコリ書くのはバカっぽいので
ユニークなUUIDとMACアドレスを生成するゴミプロ。
#!/usr/bin/ruby # vender-id 00:16:3e mac_address = ["00", "16", "3e"] 3.times {|n| mac_address << format("%02x",rand(255)) } buff = [] 16.times {|n| buff << format("%02x",rand(255)) } uuid = [buff[0,4].join,buff[4,2].join, buff[6,2].join, buff[8,2].join, buff[10,6].join] print <<EOF uuid = "#{uuid.join("-")}" vif = [ "mac=#{mac_address.join(":")},bridge=xenbr0" ] EOF
実行するとこんな感じになります。
$ ruby uniqid-gen.rb uuid = "f9526110-abe6-c228-fda4-b21ce4f2e980" vif = [ "mac=00:16:3e:9e:f2:2b,bridge=xenbr0" ]
追記1(2009/02/02)
id:kenkitiiに、「ださいので、injectを使って書き直せ」とダメ出しを受けたので。
injectはこんなのでいいのかな?
#!/usr/bin/ruby # vender-id 00:16:3e mac_address = "00:16:3e" + (1..3).inject(String.new) {|s,stub| s << ":" + format("%02x",rand(255)).to_s } str = (1..16).inject(String.new){|s,stub| s << format("%02x",rand(255)).to_s } uuid = "#{str[0,8]}-#{str[8,4]}-#{str[12,4]}-#{str[16,4]}-#{str[18,12]}" print <<EOF uuid = "#{uuid}" vif = [ "mac=#{mac_address},bridge=xenbr0" ] EOF
追記(2010/07/21)
Array#inject使うより普通に配列で書いた方がいい気がしてきた。
def rnd(n) Array.new(n){ format("%02x",rand(255)).to_s } end mac = (%w(00 16 3e) + rnd(3)).join(":") uuid = [4, 2, 2, 2, 6].map {|n| rnd(n).join }.join("-") p mac #=>"00:16:3e:0f:f9:54" p uuid #=>"f25a65df-8259-7062-fb4a-dd116c5d59f6"
補足
色々調べたら、uuidを生成するコマンドがLinuxにはあるんですね。
$ uuidgen 4fc40007-a8ab-4ad3-b2f6-02ea1c320389
RedHatのDocumentにMACアドレスを生成するpythonのコードもあったり。
探せば色々あるんだなぁ。
#! /usr/bin/python # macgen.py script generates a MAC address for Xen guests # import random mac = [ 0x00, 0x16, 0x3e, random.randint(0x00, 0x7f), random.randint(0x00, 0xff), random.randint(0x00, 0xff) ] print ':'.join(map(lambda x: "%02x" % x, mac)) Generates e.g.: 00:16:3e:66:f5:77 to stdout
LVM区画にCentOSをインストール
せっかく大容量のHDDを購入してRAID5しているので、
xenで作る仮想OSはファイルイメージではなくディスクデバイスにインストールするようにしてみました。
インストール
まずはPhysical Volume, Volume Group, Logical Volume の3つの情報を
pvscan, vgscan, lvscan コマンドで確認します。
# pvscan PV /dev/md0 VG VolGroup00 lvm2 [1.82 TB / 1.12 TB free] Total: 1 [1.82 TB] / in use: 1 [1.82 TB] / in no VG: 0 [0 ] # vgscan Reading all physical volumes. This may take a while... Found volume group "VolGroup00" using metadata type lvm2 # lvscan ACTIVE '/dev/VolGroup00/LogVol00' [97.66 GB] inherit ACTIVE '/dev/VolGroup00/LogVol02' [97.66 GB] inherit ACTIVE '/dev/VolGroup00/LogVol03' [488.28 GB] inherit ACTIVE '/dev/VolGroup00/LogVol01' [8.00 GB] inherit
xenのdomain-uをディスクデバイスへインストールするため、LVをVolGroup00に作成します。
vgdisplayコマンドでVolGroup00を確認します。*1
# vgdisplay VolGroup00 --- Volume group --- VG Name VolGroup00 System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 6 VG Access read/write VG Status resizable MAX LV 0 Cur LV 5 Open LV 4 Max PV 0 Cur PV 1 Act PV 1 VG Size 1.82 TB PE Size 32.00 MB Total PE 59598 Alloc PE / Size 22771 / 711.59 GB Free PE / Size 36827 / 1.12 TB VG UUID ZG3zpF-k9Ad-VJIX-w5ig-h1HC-2igO-3kvBE1
LV(Logical Volume)を作成します。
# lvcreate --size=20G --name LogVol11 VolGroup00
domain-uをインストールします。*2
virt-managerを起動してインストール先を/dev/VolGroup00/LogVol11
# virt-manager
バックアップ
LVMスナップショットのほうがいいんでしょうけど、
よそのdomain-0へdomain-uをクローンするのに便利なので
先ほどインストールしたdomain-uをイメージファイルにしておきます。
# dd if=/dev/VolGroup00/LogVol11 of=centos.img
忘れないように、/etc/xenの設定ファイルもバックアップ。
# cp -p /etc/xen/centos .
バックアップイメージはそのままdomain-uのファイルイメージとして起動も可能。
restoreする時は、ddのifとofを入れ替えてください。
# dd if=/centos.img of=/dev/VolGroup00/LogVol11