libvirt

提供: ArchWiki
2015年8月31日 (月) 16:56時点における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 に対応しているソフトウェアのリストは こちら にあります。

設定

システムレベルの管理をする場合、少なくとも、認証を設定して、デーモンを起動する必要があります。

ノート: ユーザーセッションの管理をする場合、デーモンの設定は必要ありません。ただし、認証はローカルに限定され、フロントエンドは libvirtd デーモンのローカルインスタンスを起動します。

認証を設定

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 ソケットに接続する時にユーザーのパスワードを入力するように求められます。

ノート: パスワードの入力を要求するときは認証エージェントを使用します。コンソールを使っている場合、デフォルトの pkttyagent エージェントが上手く動作しないことがあります。
ヒント: 認証でパスワードを入力しなくてもよいように設定したい場合、Polkit#パスワードプロンプトの迂回 を見て下さい。

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 ソケットの暗号化の解除

警告: この設定をすると、信頼されたネットワーク内における、リモートドメインの接続速度が向上します。セキュリティ的には完全な無防備なので注意してください。テスト目的であったり、セキュアでプライベート、信頼されたネットワークでおいてのみ使って下さい。SASL を有効にしないため、全ての TCP 通信はクリアテキストになります。通常はどんなときでも SASL を有効にするようにしてください。

/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 で新しいストレージプールディレクトリを作成してそこにコピーすることもできます)。

ノート: 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>
 [...]

参照