「Libvirt」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(Sharing data between host and guestを転載)
(Tips and tricksを転載)
646行目: 646行目:
   
 
詳しくは [https://fedoraproject.org/wiki/Using_UEFI_with_QEMU fedora の wiki ページ] を参照。
 
詳しくは [https://fedoraproject.org/wiki/Using_UEFI_with_QEMU fedora の wiki ページ] を参照。
  +
  +
== Tips and tricks ==
  +
  +
=== Python connectivity code ===
  +
  +
The {{Pkg|libvirt-python}} package provides a Python API in {{ic|/usr/lib/python3.x/site-packages/libvirt.py}}.
  +
  +
General examples are given in {{ic|/usr/share/doc/libvirt-python-''your_libvirt_version''/examples/}}
  +
  +
Unofficial example using {{Pkg|qemu-desktop}} and {{Pkg|openssh}}:
  +
  +
{{bc|<nowiki>
  +
#! /usr/bin/env python3
  +
import socket
  +
import sys
  +
import libvirt
  +
  +
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 {}".format(domainID))
  +
domServ = domConnect
  +
break
  +
</nowiki>}}
  +
  +
=== Advanced Format 4K native disk ===
  +
  +
To turn a disk into an [[Advanced Format]] 4Kn disk, both its physical and logical sector size needs to be set to 4 KiB. For virtio-blk and virtio-scsi this can be done by setting the {{ic|logical_block_size}} and {{ic|physical_block_size}} options with the [https://libvirt.org/formatdomain.html#hard-drives-floppy-disks-cdroms <blockio> element]. For example:
  +
  +
{{hc|# virsh edit ''name_of_virtual_machine''|2=
  +
<domain>
  +
...
  +
<devices>
  +
...
  +
<disk type='file' device='disk'>
  +
..
  +
'''<blockio logical_block_size='4096' physical_block_size='4096'/>'''
  +
</disk>
  +
...
  +
</devices>
  +
</domain>
  +
}}
  +
  +
=== commanding QEMU ===
  +
  +
Libvirt is capable of passing on QEMU command line arguments to the underlying QEMU instance running the VM.
  +
This functionality is highly useful when libvirt does not provide [[QEMU|QEMU features]] (yet). For examples, see the entire [[Intel GVT-g]] article.
  +
  +
==== modify VM XML schema for QEMU ====
  +
  +
This serves to enable QEMU-specific elements. Change
  +
  +
{{hc|$ virsh edit ''vmname''|<nowiki>
  +
<domain type='kvm'>
  +
</nowiki>}}
  +
  +
to
  +
  +
{{hc|$ virsh edit ''vmname''|<nowiki>
  +
<domain xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0' type='kvm'>
  +
</nowiki>}}
  +
  +
==== QEMU command line arguments ====
  +
  +
In libvirt, QEMU command line arguments separated by whitespaces need to be provided separately.
  +
  +
The correct location to insert them is at the end of the {{ic|<domain>}} element, i. e. right above the closing {{ic|</domain>}} tag.
  +
  +
-display gtk,gl=es,zoom-to-fit=off
  +
  +
Becomes
  +
{{hc|$ virsh edit ''vmname''|<nowiki>
  +
...
  +
</devices>
  +
<qemu:commandline>
  +
<qemu:arg value="-display"/>
  +
<qemu:arg value="gtk,gl=es,zoom-to-fit=off"/>
  +
</qemu:commandline>
  +
</domain>
  +
</nowiki>}}
  +
   
 
== PulseAudio ==
 
== PulseAudio ==

2024年2月1日 (木) 17:55時点における版

関連記事

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 パッケージと、どれか一つハイパーバイザをインストールしてください:

  • libvirt KVM/QEMU ドライバー は基本の libvirt ドライバーなので KVM が有効になっていれば、完全に仮想化された、ハードウェアによる支援を受けたゲストを使うことができます。詳しくは QEMU の記事を見て下さい。
  • 他にも仮想化バックエンドとして LXC, VirtualBox, Xen などが存在します。インストール方法はそれぞれのページを参照してください。
ノート: libvirt LXC ドライバーlxc に含まれている LXC のユーザースペースツールに依存していません。そのため、このドライバーを使う場合はパッケージをインストールする必要はありません。
警告: Xen のサポートはデフォルトでは利用できない状態になっています。ABS を使って libvirtPKGBUILD を修正して --without-xen オプションを外してビルドする必要があります。VirtualBox は安定的に Xen をサポートする予定がないため --without-vbox に置き換えても良いでしょう。

他にサポートされているハイパーバイザは こちら に記載されています。

ネットワークに接続するために、以下をインストールしてください:

クライアント

クライアントは仮想マシンを管理するために使用するユーザーインターフェイスです。

  • virsh はドメインを管理・設定するためのコマンドラインプログラムです。libvirt パッケージに含まれています。
  • virt-manager は仮想マシンを管理するためのグラフィカルユーザーインターフェイスです。
  • virt-viewer は仮想化されたゲスト OS のグラフィカルな画面を操作するための軽量なインターフェイスです。
  • gnome-boxes はリモートや仮想システムにアクセスするためのシンプルな GNOME 3 アプリケーションです。
  • virt-manager-qt5AUR[リンク切れ: パッケージが存在しません] は virt-manager の Qt 版です。
  • libvirt-sandboxAUR はアプリケーションのサンドボックスツールキットです。

libvirt に対応しているソフトウェアのリストは こちら にあります。

設定

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

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

認証を設定

libvirt: Connection authentication より:

libvirt デーモンではクライアントの接続に使用する認証メカニズムを管理者が選択することができます。基本的に libvirt デーモンのメイン設定ファイルである /etc/libvirt/libvirtd.conf で設定します。libvirt のソケットごとに別々の認証メカニズムを設定できます。今のところ none, polkit, sasl の中から選べます。

libvirt は依存パッケージとして polkit をインストールするので、unix_sock_auth パラメータのデフォルト値としては polkit が使われます (ソース)。また、ファイルベースのパーミッションを使うこともできます。

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#パスワードプロンプトの迂回 を見て下さい。

libvirt 1.2.16 から libvirt グループのメンバーはデフォルトで RW デーモンソケットにパスワードを入力しなくてもアクセスすることができます [1]。libvirt グループを作成してユーザーをグループに追加するのが一番簡単です。RW デーモンソケットにアクセスするときに認証するグループを変更したい場合、以下のファイルを作成:

/etc/polkit-1/rules.d/50-libvirt.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 グループのユーザーが仮想マシンを管理できるようにファイルベースのパーミッションを定義するには、以下の行をアンコメントします:

/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.servicevirtlogd.service を起動してください。任意で libvirtd.service有効化してください。libvirtd.service が有効化された場合、virtlogd.socketvirtlockd.socket も有効化されるため、virtlogd.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"

ホストネームを使って仮想マシンにアクセス

ブリッジネットワークを使ってホストからゲストにアクセスするには、libvirt に含まれている libvirt NSS モジュールを有効にしてください。

/etc/nsswitch.conf を編集:

/etc/nsswitch.conf
hosts: files libvirt dns myhostname
ノート: pingssh などのコマンドで仮想マシンのホストネームを使うことができるようになりますが、hostnslookup などのコマンドは DNS に依存するため使えない可能性があります。getent hosts <vm-hostname> を使ってください。

テスト

システムレベルでデーモンが正しく動作しているかテスト:

$ virsh -c qemu:///system

ユーザーセッションで libvirt が正しく動作するかテスト:

$ virsh -c qemu:///session

管理

Libvirt の管理は3つのツールで行うことができます: 一つは GUI virt-manager で、二つはコマンドラインツールです: virshguestfish (libguestfs に含まれています)。

virsh

virsh はゲストドメイン (仮想マシン) の管理のためのプログラムですが、仮想化管理のスクリプトにも使えます。ほとんどの virsh コマンドは実行するのに root 権限を必要とします。ただしドメインの作成や実行などは (VirtualBox と同じように) 通常ユーザーで実行することができます。

Virsh にはインタラクティブなターミナルが含まれており、コマンドを何も指定しないで実行したときに起動します (オプションは指定することができます): virsh。インタラクティブターミナルはタブ補完をサポートしています。

コマンドラインから:

$ virsh [option] <command> [argument]...

インタラクティブターミナルから:

virsh # <command> [argument]...

ヘルプを見るには:

$ virsh help [option*] or [group-keyword*]

ストレージプール

プールはストレージボリュームを保存しておく場所です。libvirt におけるボリュームは、他のハイパーバイザでは"仮想ディスク"または"仮想マシンイメージ"と定義されていることがあります。プールの場所はディレクトリでも、ネットワークファイルシステムでも、パーティションでもかまいません (LVM を含む)。プールは有効・無効を切り替えたり領域を予約することができます。

システムレベルでは、デフォルトで /var/lib/libvirt/images/ が有効になります。ユーザーセッションでは virt-manager$HOME/VirtualMachines を作成します。

有効または無効なストレージプールを確認:

$ virsh pool-list --all

virsh を使って新しいプールを作成

ストレージプールを追加したい場合、以下がコマンド形式、ディレクトリの追加、LVM ボリュームの追加の例です:

$ virsh pool-define-as name type [source-host] [source-path] [source-dev] [source-name] [<target>] [--source-format format]
$ virsh pool-define-as poolname dir - - - - /home/username/.local/libvirt/images
$ virsh pool-define-as poolname fs - -  /dev/vg0/images - mntpoint

上記のコマンドはプールの情報を定義します。ビルドするには:

$ virsh pool-build     poolname
$ virsh pool-start     poolname
$ virsh pool-autostart poolname

削除するには:

$ virsh pool-undefine  poolname
ヒント: LVM ストレージプールの場合:
  • ボリュームグループはストレージプール専用にするほうが良いでしょう。
  • LVM ボリュームグループの名前はプールの名前と変えて下さい。ストレージプールを削除したときに LVM グループも削除されてしまいます。

virt-manager を使って新しいプールを作成

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

ストレージボリューム

プールを作成したら、プールの中にボリュームを作成することができます。新しいドメイン (仮想マシン) を作成する場合、ドメインの作成時にボリュームを作成できるのでこの手順はスキップできます。

virsh を使って新しいボリュームを作成

ボリュームの作成、確認、リサイズ、削除:

$ virsh vol-create-as      poolname volumename 10GiB --format aw|bochs|raw|qcow|qcow2|vmdk
$ virsh vol-upload  --pool poolname volumename volumepath
$ virsh vol-list           poolname
$ virsh vol-resize  --pool poolname volumename 12GiB
$ virsh vol-delete  --pool poolname volumename
$ virsh vol-dumpxml --pool poolname volumename  # for details

virt-manager の補助記憶

新しいバージョンの virt-manager では新しいディスクを作成するときに補助記憶を指定することができます。新しい仮想システムをプロビジョニングする場合にベースイメージを基にして新しいドメインを作ることができるため、時間と容量の両方を節約できてとても便利です。ただし現在のバージョンの virt-manager にはバグ (https://bugzilla.redhat.com/show_bug.cgi?id=1235406) が存在し、補助イメージが qcow2 タイプの場合に virt-manager が間違ったタイプの補助イメージを選択してしまいます。この場合、補助タイプとして raw が選択されます。補助記憶から新しいイメージが読み取れなくなり、補助記憶を用意する意味が完全に失われます。

この問題の回避策として qemu-img を使うことで直接補助記憶を指定することができます。バグが修正されるまでは、補助記憶を使いたい場合、以下のコマンドを使って下さい:

$ qemu-img create -f qcow2 -o backing_file=<path to backing image>,backing_fmt=qcow2 <disk name> <disk size>

作成したイメージを新しいドメインのベースとすることで COW ボリュームとして補助記憶が使用され時間と容量が節約されます。

ドメイン

libvirt では仮想マシンはドメインと呼ばれます。コマンドラインから使う場合、virsh でドメインを確認・作成・停止・シャットダウンできます。virt-viewer を使って virsh で起動したドメインを確認することも可能です。ドメインの作成は virt-manager でグラフィカルに行うか virt-install (virt-install パッケージに含まれているコマンドラインプログラム) を使います。

新しいドメインを作成するときは、インストールメディアを使用します。ドメインの作成後にロードします。ストレージプールから .iso を参照したり、光学ドライブを参照することができます。

有効または無効なドメインを確認:

# virsh list --all
ノート: SELinux はデフォルトで /var/lib/libvirt/images/ にボリュームが保存されることを必要とします。SELinux を使っていてボリュームに問題が起こる場合、ボリュームがそのディレクトリにあるか確認、またはあなたが使用している非デフォルトのディレクトリの適当なラベリングを追加してください。

virt-install を使って新しいドメインを作成

ドメイン (仮想マシン) を細かく設定したい場合、virt-manager を使って新しいドメインを作成する方が簡単です。しかしながら、基本的な設定は virt-install で行うことができます。最低でも指定する必要があるのは --name, --memory, ゲストストレージ (--disk, --filesystem または --nodisks), インストール方法 (.iso または CD) です。オプションについて詳しくは virt-install(1) を見てください。

Arch Linux のインストール (2GiB, qcow2 フォーマットのボリューム作成; ユーザーネットワーク):

$ virt-install  \
  --name arch-linux_testing \
  --memory 1024             \ 
  --vcpus=2,maxvcpus=4      \
  --cpu host                \
  --cdrom $HOME/Downloads/arch-linux_install.iso \
  --disk size=2,format=qcow2 \
  --network user            \
  --virt-type kvm

Fedora testing (Xen ハイパーバイザ, 非デフォルトのプール, オリジナルの表示を使わない):

$ virt-install  \
  --connect xen:///     \
  --name fedora-testing \
  --memory 2048         \
  --vcpus=2             \
  --cpu=host            \
  --cdrom /tmp/fedora20_x84-64.iso      \
  --os-type=linux --os-variant=fedora20 \
  --disk pool=testing,size=4            \
  --network bridge=br0                  \
  --graphics=vnc                        \
  --noautoconsole
$ virt-viewer --connect xen:/// fedora-testing

Windows:

$ virt-install \
  --name=windows7           \
  --memory 2048             \
  --cdrom /dev/sr0          \
  --os-variant=win7         \
  --disk /mnt/storage/domains/windows7.qcow2,size=20GiB \
  --network network=vm-net  \
  --graphics spice
ヒント: --os-variant の引数を取得するには osinfo-query --fields=name,short-id,version os を実行してください。ドメインの仕様を定義するのに役立ちます。ただし、--memory--disk を入力する必要があります。仕様が必要な場合は適当な /usr/share/libosinfo/db/oses/os.xml を見て下さい。インストール後、VirtIO ドライバー が含まれている Spice Guest Tools をインストールすると良いでしょう。Windows の VirtIO ネットワークドライバーは virtio-winAUR にもあります。ドライバーはゲストの .xml 設定のデバイスセクションに <model type='virtio' /> で指定します。詳細は QEMU の記事を読んで下さい。

既存のボリュームをインポート:

$ virt-install  \
  --name demo  \
  --memory 512 \
  --disk /home/user/VMs/mydisk.img \
  --import

virt-manager を使って新しいドメインを作成

まずハイパーバイザに接続します (例: QEMU/KVM システムまたはユーザーセッション)。接続を右クリックして New を選択して、ウィザードに従って下さい。

  • ステップ4 で、Allocate entire disk now のチェックを外すことができます -- VM がディスクの全てを使用していないときに容量を節約します。ただし、ディスクのフラグメンテーションが増加する可能性があるので、VM ホストのディスクの合計空き容量に注意してください、VM にディスク容量を追加で割り当てるほうが簡単だからです。
  • ステップ5 では、Advanced options を開いて Virt Typekvm に設定してください。追加のハードウェア設定が必要な場合、Customize configuration before install オプションを選んで下さい。

ドメインの管理

ドメインを起動:

$ virsh start domain
$ virt-viewer --connect qemu:///session domain

ドメインを上品にシャットダウン、または強制的にオフにする:

$ virsh shutdown domain
$ virsh destroy  domain

libvirtd の起動時にドメインを自動実行:

$ virsh autostart domain
$ virsh autostart domain --disable

ホストのシャットダウン時にドメインもシャットダウン:

libvirt-guests.service systemd サービスを使うことでホストのシャットダウン時に自動的にゲストの実行をサスペンド (もしくは) シャットダウンさせることができます。同じデーモンでホストの起動時に自動的にサスペンド (シャットダウン) されたゲストが復帰 (起動) されます。サービスのオプションは /etc/conf.d/libvirt-guests をチェックしてください。

ドメインの設定を編集:

$ virsh edit domain
ノート: QEMU によって直接起動した仮想マシンは libvirt ツールで管理できません。

ネットワーク

デフォルトでは、libvird systemd サービスが起動すると、default という名前の NAT ブリッジが作成されて外部ネットワークに接続できるようになります。

他のネットワーク接続が必要な場合、ドメインとの接続を作成することができる4つのネットワークタイプが存在します:

  • bridge — 仮想デバイス。物理インターフェイスと直接データを共有します。ホストで固定ネットワークを使う場合や他のドメインに接続する必要がない場合、またはドメインに完全なインバウンドとアウトバウンドの通信が必要な場合やドメインをシステムレベルで動作させる場合、ブリッジを使って下さい。ブリッジを追加する方法はネットワークブリッジを参照。作成後、ゲストの .xml 設定ファイルで指定する必要があります。
  • network — 仮想ネットワーク。他のドメインと共有することができます。ホストが動的ネットワーク (例: NetworkManager) やワイヤレスを使う場合仮想ネットワークを使って下さい。
  • macvtap — ホストの物理インターフェイスに直接接続。
  • user — ローカルのネットワーク。ユーザーセッションの場合に使って下さい。

virsh にはネットワークを作成するための様々なオプションが存在していますが、(virt-manager などの) グラフィカルユーザーインターフェイスを使ったり virt-install でドメインを作成するときにネットワーク接続を作成する方が簡単です。

ノート: libvirt は dnsmasq で DHCP や DNS を管理し、仮想ネットワークごとにインスタンスを起動します。また、適切なルーティングが行われるように iptables ルールを追加して、ip_forward カーネルパラメータを有効にします。libvirt を使うのにホストで dnsmasq を実行する必要はありません (libvirt の dnsmasq インスタンスと干渉する可能性があります)。

IPv6

設定ツールを使って IPv6 アドレスを追加した際に、以下のようなエラーが表示されることがあります:

Check the host setup: enabling IPv6 forwarding with RA routes without accept_ra set to 2 is likely to cause routes loss. Interfaces to look at: eth0

以下のファイルを作成することで問題を解決できます (eth0 は物理インターフェイスの名前に置き換えてください):

/etc/sysctl.d/libvirt-bridge.conf
net.ipv6.conf.eth0.accept_ra = 2

設定したらマシンを再起動してください。

スナップショット

スナップショットは現時点でのドメインのディスク・メモリ・デバイスの状態を取得して、将来のために保存します。OS の"クリーン"なコピーを保存することから、ドメインが破壊される前にドメインの状態を保存することまで、様々な理由で使われます。スナップショットは一意な名前で識別されます。

スナップショットはボリュームの中に保存されるためボリュームが次の形式である必要があります: qcow2 または raw。スナップショットは差分を使用するので大量の容量を使用することはありません。

スナップショットの作成

スナップショットが取得されると新しいブロックデバイスとして保存されオリジナルのスナップショットはオフラインになります。スナップショットは他のスナップショットから選択したりマージすることができます (ドメインをシャットダウンする必要はありません)。

動作中のドメインのボリュームを確認 (動作中のドメインは virsh list で確認できます):

# virsh domblklist domain
 Target     Source
 ------------------------------------------------
 vda        /vms/domain.img

ボリュームの物理プロパティを確認するには:

# qemu-img info /vms/domain.img
 image: /vms/domain.img
 file format: qcow2
 virtual size: 50G (53687091200 bytes)
 disk size: 2.1G
 cluster_size: 65536

disk-only スナップショットを作成 (--atomic オプションはスナップショットの作成が失敗した場合にボリュームに変更が加わっていないことを確認します):

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

スナップショットを確認:

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

cp -sparse=truersync -S を使ってオリジナルのイメージをコピーしてオリジナルのイメージをスナップショットにマージできます:

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

domain.snapshot1 が新しいボリュームになります。マージが完了したらオリジナルのボリューム (domain.img とスナップショットのメタデータは削除できます。virsh blockcommitblockpull と反対の動作をするようになる予定ですが現在開発中です (snapshot-revert 機能を含む、来年リリース予定)。

他の管理

非デフォルトのハイパーバイザに接続:

$ virsh --connect xen:///
virsh # uri
xen:///

SSH で QEMU ハイパーバイザに接続してログイン:

$ virsh --connect qemu+ssh://username@host/system
$ LIBVIRT_DEBUG=1 virsh --connect qemu+ssh://username@host/system

SSH でグラフィカルコンソールに接続:

$ virt-viewer  --connect qemu+ssh://username@host/system domain
$ virt-manager --connect qemu+ssh://username@host/system domain
ノート: (Arch 以外の) RHEL リモートサーバーに接続するときに問題が発生する場合、FS#30748FS#22068 に書かれている方法を試してみて下さい。

VirtualBox ハイパーバイザに接続 (libvirt における VirtualBox のサポートはまだ安定していないため libvirtd がクラッシュする可能性があります):

$ virsh --connect vbox:///system

ネットワークの設定:

$ virsh -c qemu:///system net-list --all
$ virsh -c qemu:///system net-dumpxml default

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

フック

フックは、libvirt デーモンの起動および実行中に発生するさまざまなイベントによってトリガーされるスクリプトです。 これらは、ネットワークのセットアップやメモリの予約など、ゲストの起動の準備に必要なコマンドを実行するために使用できます。

次のフックが存在します:

  • daemon - トリガー: 開始、シャットダウン、リロード
  • qemu - トリガー: 準備、準備、開始、開始、停止、リリース、移行、復元、再接続、接続
  • lxc - トリガー: 準備、開始、開始、停止、解放、再接続
  • libxl - トリガー: 準備、開始、開始、停止、リリース移行、再接続
  • network - トリガー: 開始、開始、停止、ポート作成、更新、ポート削除

各フックとトリガーの詳細については、libvirt ドキュメント を参照してください。

フックを作成する

フックは、/etc/libvirt/hooks にあるスクリプトによって表されます。フォルダーが存在しない場合は、作成する必要があります。 各フックは、同じ名前のこのフォルダー (例: /etc/libvirt/hooks/qemu) またはサブフォルダー (例: /etc/libvirt/hooks/qemu.d/) 後者にはさまざまなスクリプトを含めることができ、それらはすべてトリガーポイントで実行されます。スクリプトは他のスクリプトと同様に実行されるため、使用するコマンドインタープリタの宣言から開始する必要があります (例: #!/bin/bash) スクリプトは libvirt ユーザー (chown +x /etc/libvirt/hooks/qemu) によって実行可能である必要があります。

トリガー ポイントが満たされるたびに、スクリプトが実行されます。たとえば、デーモンスクリプトは、システムの起動/停止サイクルで、起動時とシャットダウン時に少なくとも 2 回実行されます。特定の時点でのみコマンドを実行するには、スクリプトに条件を実装する必要があります。これを行うために、libvirt は現在のトリガー条件を識別するために使用できるパラメーターを渡します。

libvirt のドキュメントによると、これらのパラメータは次のように定義されています:

  • パラメータ 1: 操作に関与するオブジェクトの名前
  • パラメータ 2: 実行される操作の名前
  • パラメータ 3: サブオペレーションに名前を付ける場合に使用されます
  • パラメータ 4: 必要に応じて追加の引数

引数のいずれかが適用できない場合は、ダッシュが渡されます。

ノート: スクリプトの作成後にフックが機能しない場合は、libvirt デーモンを再起動してみてください。

サンプル

qemu ゲストを起動するたびに、リソースが割り当てられる前にコマンドを実行するには、qemu フックを使用します。この時点で、libvirt は次のようにフックを実行します: /etc/libvirt/hooks/qemu <guest_name> prepare begin - このスクリプトは次のようになります:

/etc/libvirt/hooks/qemu
#!/bin/bash
guest_name="$1"
libvirt_task="$2"
if [ "$libvirt_task" = "prepare" ]; then
	<run some important code here>
fi

ゲストが停止している場合、同じスクリプトが実行されますが、今回はデーモンが次のようなコマンドを開始します: /etc/libvirt/hooks/qemu <guest_name> stop end -

Sharing data between host and guest

Virtio-FS

ノート: Virtio-FS is not supported in QEMU/KVM user sessions.

The description here will use hugepages to enable the usage of shared folders. Sharing files with Virtio-FS lists an overview of the supported options to enable filesharing with the guest.

First you need to enable hugepages which are used by the virtual machine:

/etc/sysctl.d/40-hugepage.conf
vm.nr_hugepages = nr_hugepages

To determine the number of hugepages needed check the size of the hugepages:

$ grep Hugepagesize /proc/meminfo

The number of hugepages is memory size of virtual machine / Hugepagesize. Add to this value some additional pages. You have to reboot after this step, so that the hugepages are allocated.

Now you have to prepare the configuration of the virtual machine:

# virsh edit name_of_virtual_machine
<domain>
...
  <memoryBacking>
    <hugepages/>
  </memoryBacking>
...
  <cpu ...>
    <numa>
      <cell memory='memory size of virtual machine' unit='KiB' memAccess='shared'/>
    </numa>
  </cpu>
...
  <devices>
    ...
    <filesystem type='mount' accessmode='passthrough'>
      <driver type='virtiofs'/>
      <source dir='path to source folder on host'/>
      <target dir='mount_tag'/>
    </filesystem>
    ...
  </devices>
</domain>

It is necessary to add the NUMA definition so that the memory access can be declared as shared. id and cpus values for NUMA will be inserted by virsh.

It should now be possible to mount the folder in the shared machine:

# mount -t virtiofs mount_tag /mnt/mount/path

Add the following fstab entry to mount the folder automatically at boot:

/etc/fstab
...
mount_tag /mnt/mount/path virtiofs rw,noatime,_netdev 0 0

9p

File system directories can be shared using the 9P protocol. Details are available in QEMU's documentation of 9psetup.

Configure the virtual machine as follows:

<domain>
...
  <devices>
    ...
    <filesystem type="mount" accessmode="mapped">
      <source dir="/path/on/host"/>
      <target dir="mount_tag"/>
    </filesystem>
  </devices>
</domain>

Boot the guest and mount the shared directory from it using:

# mount -t 9p -o trans=virtio,version=9p2000.L mount_tag /path/to/mount_point/on/guest

See https://docs.kernel.org/filesystems/9p.html for more mount options.

To mount it at boot, add it to the guest's fstab:

/etc/fstab
...
mount_tag	/path/to/mount_point/on/guest	9p	trans=virtio,version=9p2000.L	0 0

The module for the 9p transport (i.e. 9pnet_virtio for trans=virtio) will not be automatically loaded, so mounting the file system from /etc/fstab will fail and you will encounter an error like 9pnet: Could not find request transport: virtio. The solution is to preload the module during boot:

/etc/modules-load.d/9pnet_virtio.conf
9pnet_virtio

Samba / SMB

An other easy way to share data between guest and host is to use the smb protocol. While performance and latency may not be as good as in the other described ways, its sufficient for simple tasks like transfering simple files like images or documents from and to the guest.

The smb server can be set up directly on either the host, or the guest, for example using Samba, eliminating the need for a dedicated file server. Windows guests have the ability to create smb shares included right after installation (Microsoft Supportpage).

One possible way to access the share under linux (either from the host, or from the guest, depending, where you have installed your server) is to create an entry in your fstab. The samba package is required.

/etc/fstab
#Accessing a samba share on my vm from the host
//my_vm/my_share /home/archuser/my_vm cifs _netdev,noauto,nofail,user,credentials=/home/archuser/.config/my_vm.key,gid=1000,uid=984 0 0

_netdev,noauto,nofail ensures that the share is only mounted when needed without causing issues if the vm is not booted. user,credentials=/home/user/.config/my_vm.key,gid=1000,uid=984 gives you the ability to mount the share on the fly while first accessing it, without needing a password.

UEFI サポート

Libvirt は QEMU と OVMF で UEFI 仮想マシンをサポートしています。

edk2-ovmf パッケージをインストールしてください。

その後 libvirtd再起動してください。

これで UEFI 仮想マシンを作成する準備が整いました。virt-manager で新しい仮想マシンを作成してください。'新しい仮想マシンの作成' ウィザードの最後のページで、以下のようにしてください:

  • 'インストールの前に設定をカスタマイズする' をクリックして '完了' を選択してください。
  • '概要' タブで 'ファームウェア' フィールドを変更して 'UEFI x86_64' オプションを選択してください。
  • 'インストールの開始' をクリックしてください。
  • 起動画面で linuxefi コマンドによってインストーラーが起動され、システムの中で efibootmgr を実行することで UEFI OS が実行していることが確認できます。

詳しくは fedora の wiki ページ を参照。

Tips and tricks

Python connectivity code

The libvirt-python package provides a Python API in /usr/lib/python3.x/site-packages/libvirt.py.

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

Unofficial example using qemu-desktop and openssh:

#! /usr/bin/env python3
import socket
import sys
import libvirt

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 {}".format(domainID))
        domServ = domConnect
        break

Advanced Format 4K native disk

To turn a disk into an Advanced Format 4Kn disk, both its physical and logical sector size needs to be set to 4 KiB. For virtio-blk and virtio-scsi this can be done by setting the logical_block_size and physical_block_size options with the <blockio> element. For example:

# virsh edit name_of_virtual_machine
<domain>
  ...
  <devices>
    ...
    <disk type='file' device='disk'>
      ..
      <blockio logical_block_size='4096' physical_block_size='4096'/>
    </disk>
    ...
  </devices>
</domain>

commanding QEMU

Libvirt is capable of passing on QEMU command line arguments to the underlying QEMU instance running the VM. This functionality is highly useful when libvirt does not provide QEMU features (yet). For examples, see the entire Intel GVT-g article.

modify VM XML schema for QEMU

This serves to enable QEMU-specific elements. Change

$ virsh edit vmname
<domain type='kvm'>

to

$ virsh edit vmname
<domain xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0' type='kvm'>

QEMU command line arguments

In libvirt, QEMU command line arguments separated by whitespaces need to be provided separately.

The correct location to insert them is at the end of the <domain> element, i. e. right above the closing </domain> tag.

-display gtk,gl=es,zoom-to-fit=off

Becomes

$ virsh edit vmname
...
  </devices>
  <qemu:commandline>
    <qemu:arg value="-display"/>
    <qemu:arg value="gtk,gl=es,zoom-to-fit=off"/>
  </qemu:commandline>
</domain>


PulseAudio

PulseAudio デーモンは通常のユーザーアカウントで動作し、同じユーザーからの接続だけを許可します。libvirt を使って root で QEMU を動作させた場合は困ることになります。通常ユーザーで QEMU を動作させるには /etc/libvirt/qemu.conf を編集して user オプションでユーザー名を指定してください:

user = "dave"

また、PulseAudio バックエンドを使用してサーバーに接続するように QEMU を設定する必要があります。virsh edit を使ってデーモンの設定に以下のセクションを追加してください:

 <qemu:commandline>
   <qemu:env name='QEMU_AUDIO_DRV' value='pa'/>
   <qemu:env name='QEMU_PA_SERVER' value='/run/user/1000/pulse/native'/>
 </qemu:commandline>

1000 はあなたのユーザー ID に置き換えてください。

参照