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も参考にしました。
- 作者: 宮本久仁男,平初,長谷川猛,津村彰
- 出版社/メーカー: 翔泳社
- 発売日: 2009/09/15
- メディア: 大型本
- 購入: 2人 クリック: 46回
- この商品を含むブログ (19件) を見る