# 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: The Avahi daemon is used for local discovery of libvirt hosts via multicast-DNS. To disable this functionality, set `mdns_adv = 0` in `/etc/libvirt/libvirtd.conf`.

### 認証

まず、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 does not let you to add any VirtualBox connections from the GUI. However, you can launch it from the command line:

    $ virt-manager -c vbox:///system

Or if you want to manage a remote system over SSH:

    $ virt-manager -c vbox+ssh://username@host/system

### ライブスナップショット

A feature called external snapshotting allows one to take a live snapshot of a virtual machine without turning it off. Currently it only works with qcow2 and raw file based images.

Once a snapshot is created, KVM attaches that new snapshotted image to virtual machine that is used as its new block device, storing any new data directly to it while the original disk image is taken offline which you can easily copy or backup. After that you can merge the snapshotted image to the original image, again without shutting down your virtual machine.

Here's how it works.

Currently running virtual machines:

    # virsh list --all

     Id    Name                           State
     ----------------------------------------------------
     3     archey                            running

List all its current images:

    # virsh domblklist archey

     Target     Source
     ------------------------------------------------
     vda        /vms/archey.img

Notice the image file properties

    # 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

Create a disk-only snapshot. The switch `--atomic` makes sure that the VM is not modified if snapshot creation fails.

    # virsh snapshot-create-as archey snapshot1 --disk-only --atomic

List if you want to see the snapshots:

    # virsh snapshot-list archey

     Name                 Creation Time             State
     ------------------------------------------------------------
     snapshot1           2012-10-21 17:12:57 -0700 disk-snapshot

Notice the new snapshot image created by virsh and its image properties. It weighs just a few MiBs and is linked to its original "backing image/chain".

    # 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

At this point, you can go ahead and copy the original image with `cp -sparse=true` or `rsync -S`. Then you can merge the original image back into the snapshot.

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

Now that you have pulled the blocks out of original image, the file `/vms/archey.snapshot1` becomes the new disk image. Check its disk size to see what it means. After that is done, the original image `/vms/archey.img` and the snapshot metadata can be deleted safely. The `virsh blockcommit` would work opposite to `blockpull` but it seems to be currently under development in qemu-kvm 1.3 (including snapshot-revert feature), scheduled to be released sometime next year.

This new feature of KVM will certainly come handy to the people who like to take frequent live backups without risking corruption of the file system.

## libvirt へのリモートアクセス

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

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

Edit `/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.

It is also necessary to start the server in listening mode by editing `/etc/conf.d/libvirtd`

    /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 を使う

The libvirt-python package provides a python2 API in `/usr/lib/python2.7/site-packages/libvirt.py`.

General examples are given in `/usr/share/doc/libvirt-python-your_libvirt_version/examples/`

Unofficial example using qemu and 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

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

This code activates a virtio device on the machine so, in Windows you will have to install an additional driver (you can find it here Windows KVM VirtIO drivers) or remove the line `<model type='virtio' />`:

     [...]
     <interface type='bridge'>
       <source bridge='br0'/>
       <mac address='24:42:53:21:52:49'/>
     </interface>
     [...]

## 参照

- libvirt ウェブサイト

Category:

- Virtualization (日本語)