harry’s memorandum

おれおれメモ

XenServer5.6リリース

2010/5/28はiPadの国内販売で賑やかになっていますが、その影でXenServer5.6がリリースされました。個人的には後者を楽しみにしていました。

さっそく、おうちのXenServer5.5をそのままUpgradeで5.6にしてみました。
使う側としてはスナップショットのリバース復活と、OVFのインポート/エクスポート対応が嬉しいです。
f:id:dharry:20100529090032j:image

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

新機能としては
http://virtualization.info/jp/news/2010/05/release-citrix-xenserver-5-6-essentials-for-xenserver.html

  • ダイナミックメモリ(「Memory optimization(メモリ最適化))
  • 自動作業負荷バランシング
  • パフォーマンスのアラートとレポート
  • Red Hat Enterprise LinuxCentOSOracle 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.
ConVirtを起動
$ sudo convirt

f:id:dharry:20100505145809p:image

virt-managerはちょっとシンプルすぎるので、こちらを使うのもいいかもしれないですね。

VMware Open Virtualization Format Tool (ovftool) で仮想イメージをインポート

ovf形式の仮想マシンのテンプレート管理はすごく便利です。VMware vSphere Client で export/importできます。でも、VMware vSphere Clientでインポートすると せっかくHDDのタイプを シンプロビジョニングにしたのに、シックプロビジョニングの状態でデプロイされてしまうのが残念です。*1
f:id:dharry:20100325013837j:image

しかし、対応策がないわけではありません。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

  1. 取得したスナップショット名をメモ
  2. 元に戻すVMのMACアドレスをメモ
  3. VMの情報を取得
  4. domain0でUUIDを調べる (xe vm-list)
  5. VMをシャットダウン(xe vm-shutdown uuid=)
  6. VMを削除(xe vm-destroy uuid=)
  7. スナップショットからVMをあたらしく作成(xe vm-install new-name-label= template=)
  8. VMを起動(xe vm-start name-label=)
  9. 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

*1:vSphereClientよりXenCenterが軽いからかな

*2:稼動中のメモリダンプをしてスナップショットするわけじゃないので、VMwareのような使い勝手にはいかないですね

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へリモートアクセスができるのでネットワーク管理者にとっては嬉しいかも。

VMware VIX を使って仮想マシンを色々操作してみる 3

備忘録。

Windowsのvix-perlのライブラリを作るときは

  1. viperl or ActivePerl をインストール。インストールパスにスペースが入らないようにする。*1
  2. VisualStudioでコンパイル
  3. 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 以下にインストールしちゃうので注意