libvirt

提供: ArchWiki
2015年8月31日 (月) 02:30時点におけるKusakata (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

関連記事

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 などが存在します。インストール方法はそれぞれのページを参照してください。
ノート: libvirt LXC ドライバーlxc に含まれている LXC のユーザースペースツールに依存していません。そのため、このドライバーを使う場合はパッケージをインストールする必要はありません。
警告: Xen のサポートはデフォルトでは利用できない状態になっています。ABS を使って libvirtPKGBUILD を修正して --without-xen オプションを外してビルドする必要があります。

他にサポートされているハイパーバイザーは こちら に記載されています。

ネットワークに接続するために、以下をインストールしてください:

クライアント

クライアントは仮想マシンを管理するために使用するユーザーインターフェイスです。

  • virsh はドメインを管理・設定するためのコマンドラインプログラムです。libvirt パッケージに含まれています。
  • virt-manager は仮想マシンを管理するためのグラフィカルユーザーインターフェイスです。
  • virtviewer は仮想化されたゲスト OS のグラフィカルな画面を操作するための軽量なインターフェイスです。
  • gnome-boxes はリモートや仮想システムにアクセスするためのシンプルな GNOME 3 アプリケーションです。

libvirt に対応しているソフトウェアのリストは こちら にあります。

設定

Libvirt はインストールしただけでは使えません。少なくとも、デーモンを起動して、認証を設定する必要があります。また、QEMU の KVM アクセラレーションを有効にすることも推奨されています。

デーモンを起動する

/etc/libvirt/qemu.conf にあるデフォルトのユーザーとグループを変更してください。QEMU のデフォルトは nobody:nobody です。

systemd を使って libvirtd.service を起動・有効化してください。

ノート: マルチキャスト DNS によるローカルの libvirt ホストの検出に Avahi デーモンが使われます。この機能を無効にするには、/etc/libvirt/libvirtd.confmdns_adv = 0 を設定してください。

認証

まず、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"
ノート: libvirt グループのメンバーではない人の読み取り専用のアクセスを禁止するには unix_sock_ro_perms0777 から 0770 に変更してください。

QEMU の KVM アクセラレーションを有効にする

ノート: KVMVirtualBox と衝突します。KVM と VirtualBox を同時に使うことはできません。

通常の 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-managervirsh を VM ツールとして使っている場合、これはとても簡単です。起動時に自動的に VM を実行するように設定するには、コマンドラインで次を実行してください:

$ virsh autostart <domain>

自動起動を無効にするには:

$ virsh autostart --disable <domain>

virt-manager には VM の起動オプションのところに自動起動のチェックボックスがあります。

ノート: コマンドラインから QEMU や KVM によって起動した VM は virt-manager で管理することができません。

使用方法

新しい VM をインストールする

新しい VM を作成するには、何がしかのインストールメディアが必要で、通常は .iso ファイルが基本です。ファイルを /var/lib/libvirt/images/ ディレクトリにコピーしてください (または、virt-manager で新しいストレージプールディレクトリを作成してそこにコピーすることもできます)。

ノート: SELinux はデフォルトで /var/lib/libvirt/images/ に仮想マシンが保存されることを必要とします。SELinux を使っていて仮想マシンに問題が起こる場合、あなたの VM がそのディレクトリにするか確認、またはあなたが使用している非デフォルトのディレクトリの適当なラベリングを追加してください。

それから virt-manager を起動して、サーバーに接続します、接続を右クリックして New を選択してください。名前を決めたら、Local install media を選択してください。ウィザードを進めて下さい。

ステップ4で、Allocate entire disk now のチェックを外すことができます -- VM がディスクの全てを使用していないときに容量を節約します。ただし、ディスクのフラグメンテーションが増加する可能性があるので、VM ホストのディスクの合計空き容量に注意してください、VM にディスク容量を追加で割り当てるほうが簡単だからです。

ステップ5では、Advanced options を開いて Virt Typekvm に設定してください。kvm が選べない場合、上の QEMU の KVM アクセラレーションを有効にするを見て下さい。

virt-manager でストレージプールを作成する

まず、既存のサーバーに接続してください。そこで、右クリックして Details を選んで下さい。Storage に行き左下の + アイコンを押して下さい。それからはウィザードに従って下さい。 :)

virt-manager で VirtualBox を使う

ノート: libvirt の VirtualBox サポートはまだあまり安定しておらず libvirtd がクラッシュする可能性があります。通常はクラッシュしてもデーモンを再起動すれば全てが元に戻るはずです。

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=truersync -S を使ってオリジナルのイメージをコピーすることができます。 そしてオリジナルのイメージをスナップショットにマージできます。

# virsh blockpull --domain archey --path /vms/archey.snapshot1

これでオリジナルイメージからブロックが引っぱり出されるので、ファイル /vms/archey.snapshot1 は新しいディスクイメージになります。ディスクのサイズを確認してどうなっているか見て下さい。この後、オリジナルのイメージ /vms/archey.img とスナップショットのメタデータは安全に削除できます。virsh blockcommitblockpull と反対の動作をするようになる予定ですが qemu-kvm 1.3 でまだ開発中です (snapshot-revert 機能を含む)。来年にリリースされるスケジュールが組まれています。

この KVM の新機能はファイルシステムを破損するリスクを負うことなくライブバックアップを頻繁に取得したいと思ってる人にとって特に重宝します。

libvirt へのリモートアクセス

暗号化されない TCP/IP ソケットを使う (一番シンプル、セキュリティは低い)

警告: This should only be used for testing or use over a secure, private, and trusted network.

/etc/libvirt/libvirtd.conf を編集してください:

/etc/libvirt/libvirtd.conf
listen_tls = 0
listen_tcp = 1
auth_tcp=none
警告: We do not enable SASL here, so all TCP traffic is cleartext! For real world use, always enable SASL.

さらに /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
ノート: If you are having problems connecting to a remote RHEL server (or anything other than Arch, really), try the two workarounds mentioned in FS#30748 and FS#22068.

Python を使う

libvirt-python パッケージによって /usr/lib/python2.7/site-packages/libvirt.pypython2 API が提供されます。

一般的なサンプルは /usr/share/doc/libvirt-python-your_libvirt_version/examples/ にあります。

qemuopenssh を使う非公式のサンプル:

#! /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 を作成するため、br0virbr1 など他の名前を使って下さい。 netctlsystemd-networkd の新しいプロファイルを作ってブリッジを設定する必要があります、例えば (DHCP を使う設定):

/etc/netctl/br0
Description="Bridge connection for kvm"
Interface=br0
Connection=bridge
BindsToInterfaces=(eno1)
IP=dhcp
この記事またはセクションは情報が古くなっています。
理由: The tip below needs to be updated for netctl. (Discuss)
ヒント: It is recommended that you enable Spanning Tree Protocol (STP) on the virtual bridge (e.g. br0) that you create to avoid any potential bridging loops. You can automatically enable STP by appending POST_UP="brctl stp $INTERFACE on" to the netcfg profile.

ゲスト設定

そして 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>
 [...]

参照