libvirt

提供: ArchWiki
2014年7月4日 (金) 20:10時点におけるKusakata (トーク | 投稿記録)による版 (→‎ライブスナップショット)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

関連記事

libvirt は仮想マシン (VM) を管理するための仮想化 API とデーモンです -- リモートまたはローカルを問わず、複数の仮想化バックエンドを使用できます (QEMU/KVM, VirtualBox, Xen など)。この記事では libvirt に関すること全ては扱わず、一目見ただけでは直感的にわからなかったり、あまりドキュメントが整っていないことだけをカバーします。

インストール

サーバー側では、公式リポジトリから以下のパッケージと、さらに QEMU などの仮想化バックエンドをインストールする必要があります:

  • libvirt
  • virt-manager (VM をインストール・管理するプログラム、そして GUI インターフェイスが含まれています)
  • bridge-utils または dnsmasq (ネットワーク共有のため)

クライアント側では、以下のパッケージが必要です:

ノート: サーバーとクライアントは同じ物理マシンにすることができます。

Xen 用に libvirt をビルドする

公式リポジトリlibvirtAURlibvirt-gitAUR は現在どちらも PKGBUILD で make する間に --without-xen フラグを使うことによって Xen のサポートが無効になっています。libvirt を使って Xen を管理したい場合、Arch Build System を使って Xen サポートを有効にして libvirt パッケージをビルドするためにファイルセットを全て入手する必要があります。Xen サポートを付けて libvirt をビルドするには AURxenAUR パッケージが必要です。

The alternative XenAPI driver is lacking a package at the moment? (2010-05-23, friesoft)

設定

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/libvirtd-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>
 [...]

参照