libvirt
関連記事
libvirt: The virtualization API より:
- Libvirt は仮想マシンや、ストレージ・ネットワークインターフェイスの管理などの仮想化機能を管理するための便利な手段を提供するソフトウェアのコレクションです。ソフトウェアには API ライブラリ、デーモン (libvirtd)、コマンドラインユーティリティ (virsh) が含まれています。
- libvirt の目標は様々な仮想化プロバイダ/ハイパーバイザーを管理する共通の手段を提供することにあります。
- libvirt の主な特徴は以下の通りです:
- VM 管理: 起動・停止・一時停止・保存・復旧・移行などの様々なドメイン操作。ディスク・ネットワークインターフェイス・メモリ・CPU など多数のデバイスのホットプラグ制御。
- リモートマシンのサポート: libvirt デーモンが走ってるマシンなら libvirt の機能は全て使うことができます。リモートマシンも例外ではありません。リモートで接続するための様々なネットワーク転送をサポートしています。一番シンプルなのは SSH で、細かい設定を必要としません。
- ストレージ管理: libvirt デーモンを動かしているホストを使って様々なタイプのストレージを管理できます: 様々なフォーマットのファイルイメージを作成 (qcow2, vmdk, raw, ...)、NFS 共有のマウント、既存の LVM ボリュームグループの列挙、新しい LVM ボリュームグループや論理ボリュームの作成、ディスクデバイスのパーティション、iSCSI 共有のマウントなど。
- ネットワークインターフェイス管理: libvirt デーモンを動かしているホストを使って物理・論理ネットワークインターフェイスを管理できます。既存のインターフェイスを列挙するだけでなく、インターフェイス・ブリッジ・仮想 LAN・ボンドデバイスを設定 (作成) できます。
- 仮想 NAT とルートベースネットワーク: libvirt デーモンを動かしているホストを使って仮想ネットワークを管理・作成できます。Libvirt の仮想ネットワークはファイアウォールのルールを使うことでルーターとして動作し、VM からホストマシンのネットワークに透過的にアクセスすることを可能にします。
libvirt には KVM/QEMU, Xen, LXC, OpenVZ, VirtualBox などの仮想化バックエンドを、リモート・ローカルを問わず管理するために、統一の抽象化レイヤーが備わっています (その他)。
長期的に安定した C の API を用意することで、様々なツール で libvirtd デーモンに接続して多数の仮想化エンジンを管理することが可能です。libvirt デフォルトのクライアントは virsh と呼ばれています。
インストール
デーモン・クライアントアーキテクチャをとっているため、libvirt をインストールする必要があるのは仮想化システムをホストするマシンだけです。サーバーとクライアントは同じ物理マシンにすることができます。
サーバー
libvirt パッケージと、どれか一つハイパーバイザーをインストールしてください:
- 2015年2月1日現在、
libvirtd
を起動するには qemu をインストールする必要があります (FS#41888 を参照)。libvirt KVM/QEMU ドライバー は基本の libvirt ドライバーなので KVM が有効になっていれば、完全に仮想化された、ハードウェアによる支援を受けたゲストを使うことができます。詳しくは QEMU の記事を見て下さい。
- 他にも仮想化バックエンドとして LXC, VirtualBox, Xen などが存在します。インストール方法はそれぞれのページを参照してください。
他にサポートされているハイパーバイザーは こちら に記載されています。
ネットワークに接続するために、以下をインストールしてください:
- デフォルト の NAT/DHCP ネットワークの場合 ebtables と dnsmasq。
- ブリッジネットワークの場合 bridge-utils。
- SSH によるネットワーク管理の場合 openbsd-netcat。
クライアント
クライアントは仮想マシンを管理するために使用するユーザーインターフェイスです。
- virsh はドメインを管理・設定するためのコマンドラインプログラムです。libvirt パッケージに含まれています。
- virt-manager は仮想マシンを管理するためのグラフィカルユーザーインターフェイスです。
- virtviewer は仮想化されたゲスト OS のグラフィカルな画面を操作するための軽量なインターフェイスです。
- gnome-boxes はリモートや仮想システムにアクセスするためのシンプルな GNOME 3 アプリケーションです。
libvirt に対応しているソフトウェアのリストは こちら にあります。
設定
システムレベルの管理をする場合、少なくとも、認証を設定して、デーモンを起動する必要があります。
認証を設定
libvirt: Connection authentication より:
- libvirt デーモンではクライアントの接続に使用する認証メカニズムを管理者が選択することができます。基本的に libvirt デーモンのメイン設定ファイルである
/etc/libvirt/libvirtd.conf
で設定します。libvirt のソケットごとに別々の認証メカニズムを設定できます。今のところnone
,polkit
,sasl
の中から選べます。
libvirt は依存パッケージとして polkit をインストールするので、unix_sock_auth
パラメータのデフォルト値としては polkit が使われます (ソース)。また、ファイルベースのパーミッションを使うこともできます。
polkit を使う
libvirt デーモンは /usr/share/polkit-1/actions/org.libvirt.unix.policy
で2つの polkit アクションを提供します:
- 完全なアクセス管理のための
org.libvirt.unix.manage
(RW デーモンソケット) - アクセスの監視のための
org.libvirt.unix.monitor
(読み取り専用ソケット).
RW デーモンソケットのデフォルトポリシーを使うには管理者として認証する必要があります。sudo 認証と似ていますが、クライアントアプリケーションを root で動かす必要があるというわけではありません。また、デフォルトポリシーではどんなアプリケーションでも RO ソケットに接続することはできます。
Arch では wheel
グループのユーザーを管理者として認識します: これは /etc/polkit-1/rules.d/50-default.rules
で定義されています (Polkit#管理者の識別 を参照)。そのためユーザーを wheel
グループに追加さえすれば、新しいグループやルールファイルを作成する必要はありません。(virt-manager などで) RW ソケットに接続する時にユーザーのパスワードを入力するように求められます。
RW デーモンソケットにアクセスするときに認証するグループを変更したい場合、以下のファイルを作成:
/etc/polkit-1/rules.d/49-org.libvirt.unix.manager.rules
/* Allow users in kvm group to manage the libvirt daemon without authentication */ polkit.addRule(function(action, subject) { if (action.id == "org.libvirt.unix.manage" && subject.isInGroup("kvm")) { return polkit.Result.YES; } });
そしてユーザーを kvm
グループに追加して再ログインしてください。kvm は好きなグループに置き換えることができます (例: libvirt
)、グループが存在することと、ユーザーがグループに属していることを確認してください (詳しくはユーザーとグループを参照)。グループの変更を適用するには再ログインが必要です。
ファイルベースのパーミッションで認証
libvirt グループのユーザーが仮想マシンを管理できるようにファイルベースのパーミッションを定義するには、以下の行をアンコメントします:
/etc/libvirt/libvirtd.conf
#unix_sock_group = "libvirt" #unix_sock_ro_perms = "0777" # set to 0770 to deny non-group libvirt users #unix_sock_rw_perms = "0770" #auth_unix_ro = "none" #auth_unix_rw = "none"
ガイドによっては libvird の特定のディレクトリのパーミッションを変更すると管理がしやすくなると書かれていることがありますが、パッケージをアップデートする際に変更したパーミッションは元に戻ってしまうので注意してください。システムディレクトリを編集するときは、root ユーザーを使うようにしてください。
デーモンを起動
systemd を使って libvirtd.service
を起動・有効化してください。
TCP/IP ソケットの暗号化の解除
/etc/libvirt/libvirtd.conf
を編集:
/etc/libvirt/libvirtd.conf
listen_tls = 0 listen_tcp = 1 auth_tcp=none
また、/etc/conf.d/libvirtd
を編集してサーバーをリスニングモードで起動する必要があります:
/etc/conf.d/libvirtd
LIBVIRTD_ARGS="--listen"
使用方法
新しい VM をインストールする
新しい VM を作成するには、何がしかのインストールメディアが必要で、通常は .iso
ファイルが基本です。ファイルを /var/lib/libvirt/images/
ディレクトリにコピーしてください (または、virt-manager で新しいストレージプールディレクトリを作成してそこにコピーすることもできます)。
それから virt-manager
を起動して、サーバーに接続します、接続を右クリックして New を選択してください。名前を決めたら、Local install media を選択してください。ウィザードを進めて下さい。
ステップ4で、Allocate entire disk now のチェックを外すことができます -- VM がディスクの全てを使用していないときに容量を節約します。ただし、ディスクのフラグメンテーションが増加する可能性があるので、VM ホストのディスクの合計空き容量に注意してください、VM にディスク容量を追加で割り当てるほうが簡単だからです。
ステップ5では、Advanced options を開いて Virt Type を kvm に設定してください。kvm が選べない場合、上の QEMU の KVM アクセラレーションを有効にするを見て下さい。
virt-manager でストレージプールを作成する
まず、既存のサーバーに接続してください。そこで、右クリックして Details を選んで下さい。Storage に行き左下の + アイコンを押して下さい。それからはウィザードに従って下さい。 :)
virt-manager で VirtualBox を使う
virt-manager では GUI から VirtualBox の接続を追加することはできません。しかしながら、コマンドラインから起動することが可能です:
$ virt-manager -c vbox:///system
また、SSH でリモートシステムを管理したい場合:
$ virt-manager -c vbox+ssh://username@host/system
ライブスナップショット
外部スナップショットという機能を使うことで仮想マシンを停止することなくライブスナップショットを取得することができます。現在は qcow2 と raw ファイルベースのイメージでだけで動作します。
スナップショットが作成されると、KVM は使用されている仮想マシンに新しいブロックデバイスとして新規スナップショットイメージを加えます。新しいデータは直接そこに保存され元のディスクイメージはオフラインになるため簡単にコピーやバックアップを取ることが可能です。その後、仮想マシンをシャットダウンせずに、元のイメージにスナップショットイメージをマージすることができます。
以下、使用方法です。
現在動作中の仮想マシン:
# virsh list --all
Id Name State ---------------------------------------------------- 3 archey running
現在のイメージを全て表示:
# virsh domblklist archey
Target Source ------------------------------------------------ vda /vms/archey.img
イメージファイルのプロパティを確認:
# qemu-img info /vms/archey.img
image: /vms/archey.img file format: qcow2 virtual size: 50G (53687091200 bytes) disk size: 2.1G cluster_size: 65536
disk-only スナップショットを作成。--atomic
スイッチはスナップショットの作成が失敗した場合に VM に変更が加わっていないのを確認します。
# virsh snapshot-create-as archey snapshot1 --disk-only --atomic
スナップショットを見たい場合は表示する:
# virsh snapshot-list archey
Name Creation Time State ------------------------------------------------------------ snapshot1 2012-10-21 17:12:57 -0700 disk-snapshot
virsh によって作成された新しいスナップショットイメージとそのイメージプロパティに注目してください。たった数 MiB の容量しかなくオリジナルの"バックイメージ/チェイン"にリンクされています。
# qemu-img info /vms/archey.snapshot1
image: /vms/archey.snapshot1 file format: qcow2 virtual size: 50G (53687091200 bytes) disk size: 18M cluster_size: 65536 backing file: /vms/archey.img
この段階で、cp -sparse=true
や rsync -S
を使ってオリジナルのイメージをコピーすることができます。
そしてオリジナルのイメージをスナップショットにマージできます。
# virsh blockpull --domain archey --path /vms/archey.snapshot1
これでオリジナルイメージからブロックが引っぱり出されるので、ファイル /vms/archey.snapshot1
は新しいディスクイメージになります。ディスクのサイズを確認してどうなっているか見て下さい。この後、オリジナルのイメージ /vms/archey.img
とスナップショットのメタデータは安全に削除できます。virsh blockcommit
が blockpull
と反対の動作をするようになる予定ですが qemu-kvm 1.3 でまだ開発中です (snapshot-revert 機能を含む)。来年にリリースされるスケジュールが組まれています。
この KVM の新機能はファイルシステムを破損するリスクを負うことなくライブバックアップを頻繁に取得したいと思ってる人にとって特に重宝します。
libvirt へのリモートアクセス
暗号化されない TCP/IP ソケットを使う (一番シンプル、セキュリティは低い)
/etc/libvirt/libvirtd.conf
を編集してください:
/etc/libvirt/libvirtd.conf
listen_tls = 0 listen_tcp = 1 auth_tcp=none
さらに /etc/conf.d/libvirtd
を編集してサーバーを listening モードで起動する必要があります:
/etc/conf.d/libvirtd
LIBVIRTD_ARGS="--listen"
SSH を使う
SSH によるリモート管理には openbsd-netcat パッケージが必要です。
virsh
を使ってリモートのシステムに接続するには:
$ virsh -c qemu+ssh://username@host/system
何か問題が起こった場合、次のコマンドでログを取得できます:
$ LIBVIRT_DEBUG=1 virsh -c qemu+ssh://username@host/system
仮想マシンにグラフィカルコンソールを表示するには:
$ virt-viewer --connect qemu+ssh://username@host/system myvirtualmachine
仮想マシンのデスクトップ管理ツールを表示するには:
$ virt-manager -c qemu+ssh://username@host/system
Python を使う
libvirt-python パッケージによって /usr/lib/python2.7/site-packages/libvirt.py
に python2 API が提供されます。
一般的なサンプルは /usr/share/doc/libvirt-python-your_libvirt_version/examples/
にあります。
#! /usr/bin/env python2 # -*- coding: utf-8 -*- import socket import sys import libvirt if (__name__ == "__main__"): conn = libvirt.open("qemu+ssh://xxx/system") print "Trying to find node on xxx" domains = conn.listDomainsID() for domainID in domains: domConnect = conn.lookupByID(domainID) if domConnect.name() == 'xxx-node': print "Found shared node on xxx with ID " + str(domainID) domServ = domConnect break
ブリッジネットワーク
仮想マシンから物理イーサネットを使用するには、物理イーサネットデバイス (ここでは eth0) とか VM が使用する仮想イーサネットデバイスの間にブリッジを作成する必要があります。
ホスト設定
libvirt は NAT ネットワークのためにブリッジ virbr0 を作成するため、br0 や virbr1 など他の名前を使って下さい。 netctl や systemd-networkd の新しいプロファイルを作ってブリッジを設定する必要があります、例えば (DHCP を使う設定):
/etc/netctl/br0
Description="Bridge connection for kvm" Interface=br0 Connection=bridge BindsToInterfaces=(eno1) IP=dhcp
ゲスト設定
そして VM の中でブリッジインターフェイスを有効にします。 最新の Linux マシンの場合、.xml ファイルの以下のコードが使えます:
[...] <interface type='bridge'> <source bridge='br0'/> <mac address='24:42:53:21:52:49'/> <model type='virtio' /> </interface> [...]
このコードはマシン上の virtio デバイスを有効化します。Windows では追加のドライバーをインストールする (こちらからドライバーを取得できます Windows KVM VirtIO drivers) か <model type='virtio' />
行を削除する必要があります:
[...] <interface type='bridge'> <source bridge='br0'/> <mac address='24:42:53:21:52:49'/> </interface> [...]