harry’s memorandum

おれおれメモ

仮想化技術の用語がややこしい

仮想化技術の用語がややこしくて困る。
ハイパーバイザベアメタルバーチャルマシンモニタ、このあたりはいいんですが、仮想アプライアンスによって機能の名前が微妙に違うので、忘れないようににまとめてみた。

仮想マシンのホストとゲスト

仮想アプライアンス ホスト ゲスト
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へ移行します。

前提

  • フルバーチャルで移行します
  • 試したのはLinuxのみです(ここではFedora8)
  • WindowsやSolarisのV2V,P2Vは未確認*1
  • VMwareのディスクタイプはIDEでインストールしています
  • ホスト名は、Domain-0側は "domain0", VMware側は "knoppix"

方法

f:id:dharry:20090122032350j:image

  • Netowokカードを認識させ通信ができるようにします。DHCPサーバを立てていない場合はStaticにIPアドレスを割り当ててください。
[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が起動していることを確認します。

f:id:dharry:20090122031545j:image

  • VMwareXenとではネットワークカードが違うため/etc/modprobe.confを修正します。*3

vmwareはpcnet32, xenは8139cp

[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

*1:そのうち試したい

*2:nc使う場合src: dd if=/dev/sda bs=16384 | gzip -9 | nc 192.168.1.x 9999
dst: nc -l -p 9999 | gzip -d | nc of=/dev/sda

*3:kuzduが起動してeth0.bakにリネームされeth1ができているかもしれません

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

*1:Free PE / Size は 1.2TBもあるので大丈夫ですね。

*2:メモリもHDDもリソース多すぎる時代なので、遊びでする分には完全仮想のほうが楽ですね。P2Vもddでディスク舐めるなら完全仮想になりますし