「Libvirt」の版間の差分
細 (1版 をインポートしました) |
|
(相違点なし)
|
2015年1月12日 (月) 22:36時点における版
関連記事
libvirt は仮想マシン (VM) を管理するための仮想化 API とデーモンです -- リモートまたはローカルを問わず、複数の仮想化バックエンドを使用できます (QEMU/KVM, VirtualBox, Xen など)。この記事では libvirt に関すること全ては扱わず、一目見ただけでは直感的にわからなかったり、あまりドキュメントが整っていないことだけをカバーします。
インストール
サーバー側では、公式リポジトリから以下のパッケージと、さらに QEMU などの仮想化バックエンドをインストールする必要があります:
- libvirt
- virt-manager (VM をインストール・管理するプログラム、そして GUI インターフェイスが含まれています)
- bridge-utils または dnsmasq (ネットワーク共有のため)
クライアント側では、以下のパッケージが必要です:
Xen 用に libvirt をビルドする
公式リポジトリの libvirt と AUR の libvirt-gitAUR は現在どちらも PKGBUILD で make する間に --without-xen
フラグを使うことによって Xen のサポートが無効になっています。libvirt を使って Xen を管理したい場合、Arch Build System を使って Xen サポートを有効にして libvirt パッケージをビルドするためにファイルセットを全て入手する必要があります。Xen サポートを付けて libvirt をビルドするには AUR の xenAUR パッケージが必要です。
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
を起動・有効化してください。
認証
まず、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"
QEMU の KVM アクセラレーションを有効にする
通常の 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 の起動オプションのところに自動起動のチェックボックスがあります。
使用方法
新しい VM をインストールする
新しい VM を作成するには、何がしかのインストールメディアが必要で、通常は .iso
ファイルが基本です。ファイルを /var/lib/libvirt/images/
ディレクトリにコピーしてください (または、virt-manager で新しいストレージプールディレクトリを作成してそこにコピーすることもできます)。
それから 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 を使う
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 ソケットを使う (一番シンプル、セキュリティは低い)
/etc/libvirt/libvirtd.conf
を編集してください:
/etc/libvirt/libvirtd.conf
listen_tls = 0 listen_tcp = 1 auth_tcp=none
さらに /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
Python を使う
libvirt-python パッケージによって /usr/lib/python2.7/site-packages/libvirt.py
に python2 API が提供されます。
一般的なサンプルは /usr/share/doc/libvirt-python-your_libvirt_version/examples/
にあります。
#! /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
ゲスト設定
そして 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> [...]