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 はインストールしただけでは使えません。少なくとも、デーモンを起動して、認証を設定する必要があります。また、QEMU の KVM アクセラレーションを有効にすることも推奨されています。
デーモンを起動する
/etc/libvirt/qemu.conf
にあるデフォルトのユーザーとグループを変更してください。QEMU のデフォルトは nobody:nobody です。
systemd を使って libvirtd.service
を起動・有効化してください。
認証
まず、libvirt グループを作成して、libvirt にアクセスしたいユーザーをそのグループに追加してください:
# groupadd libvirt # gpasswd -a user libvirt
今ログインしているユーザーのグループを更新するには一度ログアウトしてからログインしなおす必要があります。また、シェルで次のコマンドを使うことで libvirt を起動するユーザーのグループを更新することもできます:
$ newgrp libvirt
それから polkit 認証かファイルベースのパーミッションどちらかの方法に従って下さい:
polkit 認証
libvirt グループのユーザーが仮想マシンを管理できるようにするために、以下のファイルを作成する必要があります:
/etc/polkit-1/rules.d/50-org.libvirt.unix.manage.rules
polkit.addRule(function(action, subject) { if (action.id == "org.libvirt.unix.manage" && subject.isInGroup("libvirt")) { return polkit.Result.YES; } });
もしくは、org.libvirt.unix.monitor
を使うことで監視権限だけを与えることもできます。
詳細は、libvirt wiki を見て下さい。
ファイルベースのパーミッション
libvirt グループのユーザーが libvirt を使えるようにするために、/etc/libvirt/libvirtd.conf
の以下の行をアンコメントしてください (それぞれの行のファイル内での位置は散らばっています):
/etc/libvirt/libvirtd.conf
#unix_sock_group = "libvirt" #unix_sock_ro_perms = "0777" #unix_sock_rw_perms = "0770" #auth_unix_ro = "none" #auth_unix_rw = "none"
QEMU の KVM アクセラレーションを有効にする
通常の QEMU エミュレーションで仮想マシンを動かしても (つまり KVM を使わない場合)、そのスピードは痛々しいほどに遅いものになります。CPU が KVM をサポートしているのならば KVM サポートを有効にしたいとかならず思うはずです。サポートしているか確認するには、次のコマンドを実行してください:
$ egrep --color "vmx|svm" /proc/cpuinfo
このコマンドで出力が返ってきた場合、あなたの CPU は KVM によるハードウェアアクセラレーションをサポートしています。コマンドによって何も出力されなかった場合、KVM を使うことはできません。
KVM が動作していないときは、/var/log/libvirt/qemu/VIRTNAME.log
で以下のメッセージを確認できます:
/var/log/libvirt/qemu/VIRTNAME.log
Could not initialize KVM, will disable KVM support
詳細は 公式の KVM FAQ を参照してください。
ホストのシャットダウン・起動でゲストを停止・復帰する
libvirt-guests.service
systemd サービスを使うことでホストのシャットダウン時に自動的にゲストの実行をサスペンド (もしくは) シャットダウンさせることができます。同じデーモンでホストの起動時に自動的にサスペンド (シャットダウン) されたゲストが復帰 (起動) されます。
libvirt-guests のオプションは /etc/conf.d/libvirt-guests
をチェックしてください。
起動時に KVM 仮想マシンを実行する
virt-manager や virsh を VM ツールとして使っている場合、これはとても簡単です。起動時に自動的に VM を実行するように設定するには、コマンドラインで次を実行してください:
$ virsh autostart <domain>
自動起動を無効にするには:
$ virsh autostart --disable <domain>
virt-manager には VM の起動オプションのところに自動起動のチェックボックスがあります。
使用方法
新しい 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> [...]