この連載では、オープンソースの仮想化ソフトウェア、Linux KVM(Kernel-based Virtual Machine)とそれを支える技術の最新開発動向を紹介していきます。(編集部)
今回は、仮想マシンや関連するリソースの運用管理を支援するライブラリ、libvirtについて探っていきましょう。
libvirtはlib[rary] + virt[ualization]という名前のとおり、仮想マシン(Virtual Machine、以下VM)を仮想マシンモニタ(Virtual Machine Monitor、以下VMM)によらず管理可能にし、安定したC言語のAPIを提供するためのライブラリです。
libvirtはもともとXen(API)に対する安定したAPIを実現し、その上で各種管理ツールを実現するために開発されました。そのため、ソースコードの各所にXenに対する言及が残っています(注1)。
しかしいまではlibvirtは、Xen API向けの抽象化ライブラリにとどまらず、次に挙げるように非常に多くのVMM(注2)をサポートするようになっています。
Xen Hypervisor | http://www.xen.org |
---|---|
Qemu Machine Emulator | http://www.qemu.org |
KVM(Kernel-based Virtual Machine) | http://www.linux-kvm.org |
LXC(LinuX Containers) | http://lxc.sourceforge.net |
UML(User Mode Linux) | http://user-mode-linux.sourceforge.net |
OpenVZ | http://www.openvz.org |
VMWare ESX | http://www.vmware.com |
VirtualBox | http://www.virtualbox.org |
表1 libvirtがサポートするVM |
そして、特にKVMの管理ツールに注目すると、KVMゲストの操作などに実際にはバックエンドとしてlibvirtを利用しているものが数多く存在していることが分かります。
関連リンク
▼KVMの管理ツールの一覧
http://www.linux-kvm.org/page/Management_Tools
またlibvirtは、VMそのものの管理だけではなく、VMに提供するリソース、例えば仮想ネットワークやストレージなどの管理も可能となっています。
このようにlibvirtは多くのVMMをサポートしつつ、KVMの管理用APIとしても広く支持されています。さらにはVMのリソース管理も可能とあって、仮想化管理基盤のなかば標準的なAPIとしての支持を得つつあるといえるでしょう。
libvirtは、lib-(ライブラリ)という名前のとおり、Cライブラリであると説明したばかりです。しかし実は、VMやVM用のリソース管理のためのC APIを提供する共有ライブラリだけでなく、リモート管理を可能にする窓口となるデーモンや、対話的またはバッチ処理を可能にするシェル(CUI)なども含んだ、さまざまなコンポーネントから構成されています。
ここではlibvirtのこれらのコンポーネントについて、ソースコード配置などとともに簡単に紹介します。なおソースコードは、執筆時(2010年10月)におけるlibvirtの最新gitツリーを参照しています。
libvirtの中核は、さまざまなVMMの差異を吸収し、VMの管理操作のために抽象化されたC言語のAPIを提供するlibvirtライブラリです。
libvirtライブラリのVMM非依存のAPIの裏側には、VMMごとにドライバモジュールという形で、libvirt APIをVMM固有の処理に置き換えるバックエンド実装があります。
src/esx/ | VMWare ESX |
---|---|
src/lxc/ | LXC |
src/openvz/ | OpenVZ |
src/qemu/ | Qemu/KVM |
src/umll/ | UML(User Mode Linux) |
src/vbox/ | VirtualBox |
src/xen/ | Xen(旧インターフェイスを利用) |
src/xenapi/ | Xen(新インターフェイス Xen APIを利用) |
表2 libvirtの各種VMM対応バックエンド |
libvirtはまた、VM向けのリソースの管理APIを提供するために、それぞれのリソースについて、こちらもドライバモジュールという形でバックエンド実装を持っています。
src/interface/ | VM向け仮想ネットワーク |
---|---|
src/network/ | VM向け仮想ネットワーク |
src/node_device/ | VMの一般的なデバイス操作 |
src/nwfilter/ | VM向け仮想ネットワークのフィルタリング機能 |
src/secret/ | パスワードや暗号化鍵などの機能 |
表3 VM向けリソースの管理用バックエンド実装 |
libvirtdはシステムサービスとして実行されるデーモンであり、libvirt APIを介してVMを制御するための窓口となります。libvirtdはローカルだけではなくリモートからのアクセスも可能にします。libvirtdによってリモートからVMを管理することもできるようになっています。
ソースコード:
daemon/
libvirtdはlibvirt APIを利用するクライアントアプリケーションの種類によらず、必須のサービスです。
virshはもともとはlibvirt APIの利用方法の参照実装でした。vir+sh(shell)と名前にあるように、VMの管理操作用のシェル機能(CUI)を提供します。
ソースコード:
tools/
VMの管理操作を行う場合は、libvirt APIを利用したVM管理アプリケーションである「virt-manager」など、GUIによる方法が一般的かと思われます。しかし筆者はvirshを使う場合が多いですし、こちらにある程度習熟しておくことをお勧めします。なぜならvirshは、GUIツールではできないことも含めて、libvirt APIで可能なほとんどの管理操作をサポートしているからです。
libvirtのインストールなどについてはほかにいろいろ記事もあることですし、ここでは割愛します。必要なパッケージ(libvirtなど)がインストールされていて(注3)、libvirtdサービスが起動していることを確認しておいてください。
以下の実行例はFedora 13 i386/x86_64環境におけるもので、VMMとしてKVM/Qemuを利用しています。
virshを試そうにも、VMがないことには始まりません。Intel VTもしくはAMD-Vが有効でKVMが使える(注4)LinuxマシンにFedoraゲストを入れてみましょう。
VMのインストールはCUI(virt-install)で行います。Fedoraであればpython-virtinstパッケージをインストールしておきます。インストールの方法については本題から外れてしまうので詳細は割愛しますが、おおよそ次のような手順となります。
sudo virt-install --connect=qemu:///system -n fedora-13 --ram 512 --noreboot --hvm --accelerate --vnc --os-variant=fedora13 --cdrom /var/lib/libvirt/images/Fedora-13-i386-netinst.iso --disk path=/var/lib/libvirt/images/fedora-13-1.img,size=10,device=disk,bus=virtio,format=qcow2 --network network=default,model=virtio
まずlibvirt APIの参照実装かつ標準のCUIツール(注6)であるvirshを通して、libvirtに触れてみます。
libvirtではVMやVMのための各種リソース(仮想ネットワークやストレージなど)をそれぞれ専用のXMLによる定義でモデル化し、そのXML定義をベースとして管理しています(注7)。そして、それぞれのモデルのXML定義には、対応するRelax NGによるスキーマファイルも同梱されています。このため、xmllintなどによる検証(定義ファイルがスキーマに従っていて正しいことのチェック)が可能です。
$ xmllint --noout --relaxng /usr/share/libvirt/schemas/domain.rng fedora-13.xml fedora-13.xml validates $
VMまたはVMのためのリソースの種類によって多少の違いはありますが、基本的な管理操作は同様のインターフェイスになっています。
コマンド | 操作 | 内容 |
---|---|---|
*list | 一覧表示 | 対象を一覧表示 |
*define | 定義 | XML定義ファイルから対象を定義し、登録 |
*create | 生成 | XML定義ファイルから対象を定義、登録し、開始(例:VMを起動) |
*undefine | 削除 | 停止している対象を削除 |
*start | 開始 | 対象を開始(例:VMを起動) |
*destroy | 停止 | 対象を停止(例:VMを停止) |
autostart | 自動起動 | 対象がlibvirtdサービス開始時に自動的に起動されるようにする |
*dumpxml | 定義表示 | 対象のXML定義を出力(例:VM定義を出力) |
*edit | 編集 | 対象のXML定義を編集。実行するとその対象資源のXMLファイルを編集する。環境変数VISUALとEDITOR、両方空であればviを起動し、編集した結果は基本的には次回の起動以降反映される。 |
表4 基本的な操作 |
Copyright © ITmedia, Inc. All Rights Reserved.