XenServer5.6リリース
2010/5/28はiPadの国内販売で賑やかになっていますが、その影でXenServer5.6がリリースされました。個人的には後者を楽しみにしていました。
さっそく、おうちのXenServer5.5をそのままUpgradeで5.6にしてみました。
使う側としてはスナップショットのリバース復活と、OVFのインポート/エクスポート対応が嬉しいです。
kernelのバージョンは結構あがってる。
# uname -a Linux osanna 2.6.27.42-0.1.1.xs5.6.0.44.111158xen #1 SMP Mon May 3 21:26:51 EDT 2010 i686 i686 i386 GNU/Linux
- ダイナミックメモリ(「Memory optimization(メモリ最適化))
- 自動作業負荷バランシング
- パフォーマンスのアラートとレポート
- Red Hat Enterprise Linux/CentOS/Oracle Enterprise Linux 5.4のサポート
- ホストあたり最大64基の論理プロセッサ、256GバイトのRAM、そして16枚のNICをサポート
- XenCenterでOVFインポート/エクスポートをサポート
ダイナミックメモリ(メモリオーバーコミット)は期待していたんだけど、よくよくみると有償じゃないと使えないのか。
あと、スナップショットも稼働中のメモリダンプもしないので、スナップショットを撮った瞬間の状態には戻せない。有償の「Live memory Snapshots and Reverts」にしないとVMwareのようにはできないのか。残念。
CentOS5.4 + Xen4.0 にしてみた
Xen4.0リリース。Testing版だけどgitcoさんが作ってくれているのでインストールだけしてみた。
内容は前回、前々回と同じ。
yumのrepositoryを追加してupdate
$ cd /etc/yum.repos.d $ sudo wget http://www.gitco.de/repo/GITCO-XEN4.0.0_testing_x86_64.repo $ sudo yum update Dependencies Resolved ========================================================================================== Package Arch Version Repository Size ========================================================================================== Updating: xen x86_64 4.0.0-3.el5 gitco-xen4.0.0-testing 12 M xen-devel x86_64 4.0.0-3.el5 gitco-xen4.0.0-testing 408 k xen-libs x86_64 4.0.0-3.el5 gitco-xen4.0.0-testing 366 k Transaction Summary ========================================================================================== Install 0 Package(s) Update 3 Package(s) Remove 0 Package(s) Total download size: 13 M Is this ok [y/N]: y
grub.confのエントリもちゃんと新しいxenでキックすることを確認。
title CentOS (2.6.18-164.15.1.el5xen) root (hd0,0) kernel /xen.gz-4.0.0 module /vmlinuz-2.6.18-164.15.1.el5xen ro root=/dev/VolGroup00/LogVol00 rhgb quiet module /initrd-2.6.18-164.15.1.el5xen.img
リブート
$ sudo reboot
xenの確認
$ sudo xm dmesg | more __ __ _ _ ___ ___ \ \/ /___ _ __ | || | / _ \ / _ \ \ // _ \ '_ \ | || |_| | | | | | | / \ __/ | | | |__ _| |_| | |_| | /_/\_\___|_| |_| |_|(_)___(_)___/ (XEN) Xen version 4.0.0 (root@gitco.tld) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)) S un May 2 19:44:45 CEST 2010
追記
2010/05/08
centosのdomainUが起動しない。準仮想centos5のdomainUのみ今のところだめっぽい。
Ubuntu10.04でConVirt
Ubuntu10.04をいじってたときに、ふとConVirt思い出したのでインストールしてみた。超簡単。
インストール
$ sudo apt-get install convirt
設定
$ sudo /usr/share/convirt/install/managed_server/scripts/convirt-tool setup DISTRO Ubuntu VER 10.04 CODENAME lucid KERNEL 2.6.32-21-generic ARCH i686 Info: Sourcing /usr/share/convirt/install/managed_server/scripts/../../../common/scripts/Ubuntu_functions QEMU PC emulator version 0.12.3 (qemu-kvm-0.12.3), Copyright (c) 2003-2008 Fabrice Bellard qemu-kvm-0.12.3 Virtualization platform KVM Version qemu-kvm-0.12.3 Disabling default dnsmasq service. * Stopping DNS forwarder and DHCP server dnsmasq * (not running) Removing any system startup links for /etc/init.d/dnsmasq ... /etc/rc1.d/K85dnsmasq /etc/rc2.d/S15dnsmasq /etc/rc3.d/S15dnsmasq /etc/rc4.d/S15dnsmasq /etc/rc5.d/S15dnsmasq update-rc.d: warning: convirt-nw start runlevel arguments (2 3 4 5) do not match LSB Default-Start values (3 5) update-rc.d: warning: convirt-nw stop runlevel arguments (0 1 6) do not match LSB Default-Stop values (0 1 2 4 6) Adding system startup for /etc/init.d/convirt-nw ... /etc/rc0.d/K20convirt-nw -> ../init.d/convirt-nw /etc/rc1.d/K20convirt-nw -> ../init.d/convirt-nw /etc/rc6.d/K20convirt-nw -> ../init.d/convirt-nw /etc/rc2.d/S20convirt-nw -> ../init.d/convirt-nw /etc/rc3.d/S20convirt-nw -> ../init.d/convirt-nw /etc/rc4.d/S20convirt-nw -> ../init.d/convirt-nw /etc/rc5.d/S20convirt-nw -> ../init.d/convirt-nw interface eth0 already part of bridge. skiping it BRIDGE NAME=br0 Setup successful.
VMware Open Virtualization Format Tool (ovftool) で仮想イメージをインポート
ovf形式の仮想マシンのテンプレート管理はすごく便利です。VMware vSphere Client で export/importできます。でも、VMware vSphere Clientでインポートすると せっかくHDDのタイプを シンプロビジョニングにしたのに、シックプロビジョニングの状態でデプロイされてしまうのが残念です。*1
しかし、対応策がないわけではありません。vCenterを使わずとも ovf のカスタマイズしつつインポートができる ovftool を使ってみたいと思います。
CentOS5にインストール
$ chmod 755 VMware-ovftool-installer-1.0.0-166674-lin.x86_64.sh $ sudo ./VMware-ovftool-installer-1.0.0-166674-lin.x86_64.sh
まずは参考になるコマンドシンタックスとコマンドラインのexamplesを確認。
$ ovftool --help locators $ ovftool --help examples
適当なところにovfファイルをおいて、esx/esxi/vc にovfをインポート
$ ovftool --diskMode='thin' --name='myhost' ./centos5.4.ovf vi://myuser:mypassword@192.168.1.17 Opening OVF source: centos5.4.ovf Opening VI target: vi://myuser@192.168.1.17/ Target: vi://192.168.1.17/ Disk Transfer Completed Completed successfully
これで、ちゃんとHDDはシンプロビジョニングの状態でインポートできました。
もちろん esx/esxiに直接ログインして vmkfstoolsで シックプロビジョニングをシンプロビジョニングに変更するのもありですけど。
vmkfstools -i /vmfs/volumes/datastore1/centos5/centos5.vmdk -d thin /vmfs/volumes/datastore1/centos5/centos5-thin.vmdk
*1:esxiだけかも
XenServer5.5でsnapshotをrollback(revert to snapshot)してみる
XenでもXenServerの話。
XenServerは体感ではVMwareよりずっと軽く感じる*1ので、最近はとても愛用しているのですが、XenServer5.5のXenCenterにはスナップショットから元に戻す機能が付いていないので少し不満でした。
調べてみると、どうやらXenServer5.5ではcheckpoint(revert to snapshot)の機能は消されているようです。
http://community.citrix.com/display/ocb/2009/07/02/XenServer+-+LVM-based+Snapshots
"Revert"(旧checkpoint)は5.5では提供されていません
でも、スナップショットの中身がLVM-BaseならCLIの機能でいけるんじゃないか、と検索してみました。
http://docs.vmd.citrix.com/XenServer/5.5.0/1.0/en_gb/reference.html#id2584877
ちょっと面倒ですが、いちおういけそう。*2
- 取得したスナップショット名をメモ
- 元に戻すVMのMACアドレスをメモ
- VMの情報を取得
- domain0でUUIDを調べる (xe vm-list)
- VMをシャットダウン(xe vm-shutdown uuid=
) - VMを削除(xe vm-destroy uuid=
) - スナップショットからVMをあたらしく作成(xe vm-install new-name-label=
template= ) - VMを起動(xe vm-start name-label=
) - MACアドレスを元に戻す
こんなの手でやってられないのでスクリプト化。やっつけでまともにテストしてないので保障なし。
require 'optparse' require 'pp' def xelist(sub_command, label) return nil unless ["vm-list", "template-list"].index(sub_command) data = IO.popen("xe #{sub_command} 2> /dev/null", "r").map vms = [] while 0 < data.size hash = {} if data[1].split(":").size == 3 else 3.times {|n| elems = data[n].split(":") key, value = elems[0].split[0].strip.chomp, elems[-1].strip.chomp hash[key] = value } vms << hash end 5.times {|n| data.shift} end key = label.is_uuid? ? "uuid" : "name-label" vms.each {|vm| if vm[key] == label if sub_command == "template-list" return vm["uuid"] else return vm["uuid"] ,vm["name-label"] ,vm["power-state"] end end } return nil end def xevmvif(label) data = IO.popen("xe vm-vif-list 2> /dev/null", "r").map vms = [] while 0 < data.size hash = {} 6.times {|n| elems = data[n].split(":") key, value = elems[0].split[0].strip.chomp, elems[1..-1].join(":").strip.chomp hash[key] = value } vms << hash 8.times {|n| data.shift} end vms.each {|vm| return vm["MAC"] if vm["vm-name-label"] == label } return nil end class String def is_uuid? uuid = self.split("-") return nil unless uuid.size == 5 [8,4,4,4,12] == [uuid[0].size, uuid[1].size, uuid[2].size, uuid[3].size, uuid[4].size] end end def system_e(command_line) puts " $ " + command_line system(command_line) end # main o = {} opt = OptionParser.new opt.on("--vm", "--vm-list {uuid|label-name}") {|v| o[:vm] = v} opt.on("--template", "--templatet {uuid|label-name}") {|v| o[:template] = v} begin opt.parse! rescue OptionParser::ParseError => e puts opt.help exit 2 else [:vm, :template].each {|x| unless o[x] puts opt.help exit 2 end } end result = {} # source vm exist? result[:vm_uuid], result[:vm_label], result[:vm_state] = xelist("vm-list", o[:vm]) # template exist? result[:tvm_uuid] = xelist("template-list", o[:template]) if result[:vm_uuid].nil? puts "#{result[:vm_uuid]} source vm not found."; exit end if result[:tvm_uuid].nil? puts "#{result[:tvm_uuid]} template vm not found."; exit end result[:mac] = xevmvif(result[:vm_label]) system_e("xe vm-shutdown uuid=#{result[:vm_uuid]}") if result[:vm_state] == "running" system_e("xe vm-destroy uuid=#{result[:vm_uuid]}") system_e("xe vm-install new-name-label=#{result[:vm_label]} template=#{result[:tvm_uuid]} > /dev/null 2>&1") system_e("xe vm-start name-label=#{result[:vm_label]}") puts "Please change your mac address - #{result[:mac]}" exit
こんな感じで。ruby revert.rb --vm [対象のvm] --template [戻すスナップショット]
# ruby revert.rb --template test0001_snapshot --vm testvmname $ xe vm-shutdown uuid=4f3ba61b-1253-4d23-eabf-ac82399a659c $ xe vm-destroy uuid=4f3ba61b-1253-4d23-eabf-ac82399a659c $ xe vm-install new-name-label=testvmname template=64610fff-80ff-e294-323a-7297aa5491f9 > /dev/null 2>&1 $ xe vm-start name-label=testvmname Please change your mac address - 3e:da:82:89:cc:7d
Xen - Ruby interface to the Xen API を使ってみる
Xenを操作するために、virt-manager, xmコマンド, virsh でも特に不満はないのですが、Xen Management APIというのがあるそうなので使ってみたくなりました。
xenライブラリをインストール
gem install xen Successfully installed xen-0.1.2.1 1 gem installed Installing ri documentation for xen-0.1.2.1... Installing RDoc documentation for xen-0.1.2.1...
xend-config.sxpを変更
Domain0へリモートアクセスを可能にするため、少々設定。ただXenのバージョンが古いと対応していないかも。私のXenは3.4.1を使っています。
$ cat /etc/xen/xend-config.sxp | grep ^\(xen-api-server (xen-api-server ((0.0.0.0:9363)))
設定を再読み込み。
$ sudo /etc/init.d/xend reload
domainUのboot, reboot, shutdown
dom0 = "mydom0" domu = "mydomu" xenhost = Xen::Host.new(dom0, 9363) vm = xenhost.find_vm(domu) if vm printf("%s: vm is in the state of %s \n", domu, vm.start!) #vm.clean_reboot! #vm.clean_shutdown! #vm.hard_reboot! #vm.hard_shutdown! end
xmコマンドのxm listっぽいのやつ
require 'rubygems' require 'xen' dom0s = ["mydom0"] printf("%-15s%-20s%-10s%-10s%-10s%-10s\n","Dom0", "Name", "ID", "Mem", "VCPUs", "State") dom0s.each {|dom| xenhost = Xen::Host.new(dom, 9363) xenhost.vms.each {|vm| next if vm.is_dom0? rec = vm.record dom0, name, domid, mem, vcpus, state = [ dom, rec["name_label"], rec["domid"], (rec["memory_dynamic_min"].to_i / (1024*1024)), rec["VCPUs_max"], rec["power_state"] ] printf("%-15s%-20s%-10s%-10s%-10s%-10s\n", dom0, name, domid, mem, vcpus, state) } }
感想
思ったより便利ですが、基本的な操作ぐらいしかできない感じです。
gemでxenライブラリをインストールさえすれば、Linux, Windowsでもdomain0へリモートアクセスができるのでネットワーク管理者にとっては嬉しいかも。
thanks!
VMware VIX を使って仮想マシンを色々操作してみる 3
備忘録。
Windowsのvix-perlのライブラリを作るときは
- viperl or ActivePerl をインストール。インストールパスにスペースが入らないようにする。*1
- VisualStudioでコンパイル
- perl.exeと同じディレクトリにperl.exe.manifestファイルを作成
VS2005の時のmanifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="5.8.0.802" processorArchitecture="x86" name="+perl" type="win32"/> <description>ActivePerl</description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.42" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b" language="*"/> </dependentAssembly> </dependency> </assembly>
VS2008の時のmanifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="5.8.0.802" processorArchitecture="x86" name="+perl" type="win32"/> <description>ActivePerl</description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b" language="*"/> </dependentAssembly> </dependency> </assembly>
*1:vmwareのvi-perlのデフォルトはprogram files 以下にインストールしちゃうので注意