連載
» 2010年11月04日 00時00分 UPDATE

Inside Linux KVM(3):libvirt探訪(基礎編) (1/2)

この連載では、オープンソースの仮想化ソフトウェア、Linux KVM(Kernel-based Virtual Machine)とそれを支える技術の最新開発動向を紹介していきます。(編集部)

[佐藤暁,レッドハット株式会社]

 今回は、仮想マシンや関連するリソースの運用管理を支援するライブラリ、libvirtについて探っていきましょう。

「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に提供するリソース、例えば仮想ネットワークやストレージなどの管理も可能となっています。

描画 図1 libvirt アーキテクチャ概要

 このようにlibvirtは多くのVMMをサポートしつつ、KVMの管理用APIとしても広く支持されています。さらにはVMのリソース管理も可能とあって、仮想化管理基盤のなかば標準的なAPIとしての支持を得つつあるといえるでしょう。

注1:かつてはlibvirtのシェル(CUI)、virshのソースコードにもXenへの言及がありました。
注2:LXCやOpenVZ(仮想コンテナ基盤)やUML、QemuをVMMと呼ぶことはあまりないかもしれませんが、ここではこれらも含めた便宜的な総称としてVMMという語を使います。

libvirtを構成するコンポーネント

 libvirtは、lib-(ライブラリ)という名前のとおり、Cライブラリであると説明したばかりです。しかし実は、VMやVM用のリソース管理のためのC APIを提供する共有ライブラリだけでなく、リモート管理を可能にする窓口となるデーモンや、対話的またはバッチ処理を可能にするシェル(CUI)なども含んだ、さまざまなコンポーネントから構成されています。

 ここではlibvirtのこれらのコンポーネントについて、ソースコード配置などとともに簡単に紹介します。なおソースコードは、執筆時(2010年10月)におけるlibvirtの最新gitツリーを参照しています。

libvirt APIライブラリ

 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デーモン

 libvirtdはシステムサービスとして実行されるデーモンであり、libvirt APIを介してVMを制御するための窓口となります。libvirtdはローカルだけではなくリモートからのアクセスも可能にします。libvirtdによってリモートからVMを管理することもできるようになっています。

ソースコード:
daemon/

 libvirtdはlibvirt APIを利用するクライアントアプリケーションの種類によらず、必須のサービスです。

virsh

 virshはもともとはlibvirt APIの利用方法の参照実装でした。vir+sh(shell)と名前にあるように、VMの管理操作用のシェル機能(CUI)を提供します。

ソースコード:
tools/

 VMの管理操作を行う場合は、libvirt APIを利用したVM管理アプリケーションである「virt-manager」など、GUIによる方法が一般的かと思われます。しかし筆者はvirshを使う場合が多いですし、こちらにある程度習熟しておくことをお勧めします。なぜならvirshは、GUIツールではできないことも含めて、libvirt APIで可能なほとんどの管理操作をサポートしているからです。

virshを使ってみよう

 libvirtのインストールなどについてはほかにいろいろ記事もあることですし、ここでは割愛します。必要なパッケージ(libvirtなど)がインストールされていて(注3)、libvirtdサービスが起動していることを確認しておいてください。

 以下の実行例はFedora 13 i386/x86_64環境におけるもので、VMMとしてKVM/Qemuを利用しています。

注3:FedoraもしくはRed Hat Enterprise Linuxの場合は“yum groupinstall Virtualization”でOKです。ほかのディストリビューションについては、適宜そのディストリビューションの仮想化関連の文書などを参照してください。

VMの準備

 virshを試そうにも、VMがないことには始まりません。Intel VTもしくはAMD-Vが有効でKVMが使える(注4)LinuxマシンにFedoraゲストを入れてみましょう。

 VMのインストールはCUI(virt-install)で行います。Fedoraであればpython-virtinstパッケージをインストールしておきます。インストールの方法については本題から外れてしまうので詳細は割愛しますが、おおよそ次のような手順となります。

  1. Fedora-13-i386-netinst.isoを入手し(注5)、/var/lib/libvirt/imagesに配置注5)、/var/lib/libvirt/imagesに配置
  2. virt-installでVMを作成し、Fedoraをインストール
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
virt-install 実行例
注4:VT機能があったとしてもBIOS設定で無効にされていることも多いので、注意します。
注5:例えばftp://ftp.ring.gr.jp/pub/linux/fedora/linux/releases/13/Fedora/i386/iso/などから入手可能です。

virshで簡単VM操作

 まず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 基本的な操作
注6:実はvirsh-likeなシェルの実装はほかにもあり、mlvirsh(http://libvirt.org/ocaml/)は、libvirtおよびlibguestfs開発者のRichard W.M. Jones氏が書いたvirshの代替実装です。mlvirshは「ml」と名前にあるように、OCaml(ML言語の方言)で書かれ、virshの機能のうち主要なコマンドを同様に実装しています。
注7:libvirtではVMやリソースの定義の表現などにXMLが多用されていますが、実はlibvirtプロジェクトを始めたDaniel Veillard氏は、XMLライブラリのデファクトスタンダード的な実装の1つであるlibxml2の作者でもあります。

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。