理想未来ってなんやねん

娘可愛い。お父さん頑張る。

rubyでlibvirt APIを使ってみる

ruby-libvirtのインストールができたので、実際に使ってみました。

実装されているメソッドを調べる

rubyで動かす情報がまだ少なく、何がどう出来るか分からないので、とりあえずメソッドの一覧を取得してみました。

以下のコードをgetmethods.rbとか適当に名前をつけて保存します。

require 'libvirt'

conn = Libvirt::open("qemu:///system")

obj_methods = Object::methods
conn.methods.each{|conn_method|
	puts conn_method if obj_methods.index(conn_method) == nil
}

実行してみます。

sudo ruby getmethods.rb
結果

どのようなメソッドが存在するか分かりました。

num_of_defined_networks
define_network_xml
max_vcpus
list_defined_storage_pools
discover_storage_pool_sources
close
num_of_defined_domains
version
define_domain_xml
list_defined_networks
lookup_storage_pool_by_name
node_get_info
create_domain_linux
list_defined_domains
lookup_network_by_name
num_of_storage_pools
lookup_storage_pool_by_uuid
capabilities
lookup_domain_by_name
closed?
num_of_networks
lookup_network_by_uuid
hostname
list_storage_pools
create_storage_pool_xml
num_of_domains
lookup_domain_by_id
list_networks
create_network_xml
uri
num_of_defined_storage_pools
define_storage_pool_xml
list_domains
lookup_domain_by_uuid

Libvirt APIとの対比

上記リストと/usr/include/libvirt/libvirt.hを、ざっと眺めて一覧にしてみました。
黙視しただけなので抜けだらけですが、ご了承ください。

libvirt C functions ruby-libvirt methods
virConnectClose close
virConnectFindStoragePoolSources? discover_storage_pool_sources
virConnectGetHostname hostname
virConnectGetMaxVcpus max_vcpus
virConnectListDefinedDomains list_defined_domains
virConnectListDefinedNetworks list_defined_networks
virConnectListDefinedStoragePools list_defined_storage_pools
virConnectListDomains list_domains
virConnectListNetworks list_networks
virConnectListStoragePools list_storage_pools
virConnectNumOfDefinedDomains num_of_defined_domains
virConnectNumOfDefinedNetworks num_of_defined_networks
virConnectNumOfDefinedStoragePools num_of_defined_storage_pools
virConnectNumOfDomains num_of_domains
virConnectNumOfNetworks num_of_networks
virConnectNumOfStoragePools num_of_storage_pools
virDomainCreateLinux create_domain_linux
virDomainDefineXML define_domain_xml
virDomainLookupByID lookup_domain_by_id
virDomainLookupByName lookup_domain_by_name
virDomainLookupByUUID lookup_domain_by_uuid
virGetVersion version
virNetworkCreateXML create_network_xml
virNetworkDefineXML define_network_xml
virNetworkLookupByName lookup_network_by_name
virNetworkLookupByUUID lookup_network_by_uuid
virNodeGetInfo node_get_info
virStoragePoolCreateXML create_storage_pool_xml
virStoragePoolDefineXML define_storage_pool_xml
virStoragePoolLookupByName lookup_storage_pool_by_name
virStoragePoolLookupByUUID lookup_storage_pool_by_uuid

実際に試してみる

だいたい分かったので後は必要になったときに調べることにして、実際に試してみます。

定義されているドメインの一覧の取得

まず、定義されているドメインの一覧を取得してみます。
取得はlist_defined_domainsメソッドで行います。

サンプルコード
require 'libvirt'

conn = Libvirt::open("qemu:///system")
puts conn.list_defined_domains;
実行結果
# ruby list_defined_domains.rb 
vm01
winxp
vm03
vm02

うまくいきました。

ドメインの詳細情報の取得

ドメインの情報を取得してみます。

サンプルコード
require 'libvirt'

conn = Libvirt::open("qemu:///system")
conn.list_defined_domains.each{|dom_name|
	vm = conn.lookup_domain_by_name(dom_name)
	print vm.name, "\n"
	print "  max vcpus : ", vm.max_vcpus, "\n"
}
実行結果
vm01
  max_mem:524288
  memory:524288
  nr_virt_cpu:2
  cpu_time:0
  state:5
winxp
  max_mem:524288
  memory:524288
  nr_virt_cpu:2
  cpu_time:0
  state:5
vm03
  max_mem:524288
  memory:524288
  nr_virt_cpu:2
  cpu_time:0
  state:5
vm02
  max_mem:524288
  memory:524288
  nr_virt_cpu:2
  cpu_time:0
  state:5

ドメインの起動

ドメインの起動はcreateで行います。

サンプルコード
require 'libvirt'

conn = Libvirt::open("qemu:///system")
vm = conn.lookup_domain_by_name("vm01")

vm.create

ドメインの終了

ドメインの終了はshutdownで行います。

サンプルコード
require 'libvirt'

conn = Libvirt::open("qemu:///system")
vm = conn.lookup_domain_by_name("vm01")

vm.shutdown

こんな感じで。

インフラをプログラミングするという考えは面白いですね。

参考

仮想化友の会の平さんのlibvirt入門を参考にさせていただきました。
http://sites.google.com/site/kasotomo/presentation

ドメインの起動の方法が分からなかったので、libvirtに含まれるvirsh.cも参考にしました。

Xen徹底入門 第2版 (CD-ROM付)

Xen徹底入門 第2版 (CD-ROM付)