libvirt (日本語) - ArchWiki

# libvirt (日本語)

関連記事

- QEMU
- KVM
- VirtualBox
- Xen
- VMware

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

## インストール

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

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

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

- virt-manager
- virtviewer

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

### Xen 用に libvirt をビルドする

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

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` を起動・有効化してください。

Note: マルチキャスト DNS によるローカルの libvirt ホストの検出に Avahi デーモンが使われます。この機能の無効にするには、`/etc/libvirt/libvirtd.conf` で `mdns_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"

Note: libvirt グループのメンバーではない人の読み取り専用のアクセスを禁止するには `unix_sock_ro_perms` を `0777` から `0770` に変更してください。

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

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

    $ virsh autostart <domain>

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

    $ virsh autostart --disable <domain>

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

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

## 使用方法

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

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

Note: 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 Type を kvm に設定してください。kvm が選べない場合、上の QEMU の KVM アクセラレーションを有効にするを見て下さい。

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

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

### virt-manager で VirtualBox を使う

Note: 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=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 ソケットを使う (一番シンプル、セキュリティは低い)

Warning: 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

Warning: 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

Note: 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.py` に python2 API が提供されます。

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

qemu と openssh を使う非公式のサンプル:

    #! /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

This article or section is out of date.

Reason: The tip below needs to be updated for netctl. (Discuss)

Tip: 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>
     [...]

## 参照

- libvirt ウェブサイト

Category:

- Virtualization (日本語)